summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorMatthew Newhook <matthew@zeroc.com>2007-09-04 17:27:59 +0800
committerMatthew Newhook <matthew@zeroc.com>2007-09-04 17:27:59 +0800
commit612f04376ea27756c44a058f9512aaf2a3c095b9 (patch)
tree403163cec5182251a080f9a795d4c73d4f2f1e9d /cpp/src
parentfix bug with test/Slice/keyword/run.py (diff)
downloadice-612f04376ea27756c44a058f9512aaf2a3c095b9.tar.bz2
ice-612f04376ea27756c44a058f9512aaf2a3c095b9.tar.xz
ice-612f04376ea27756c44a058f9512aaf2a3c095b9.zip
http://bugzilla.zeroc.com/bugzilla/show_bug.cgi?id=2451
Squashed commit of the following: commit f4ba9698ababcd06659be2c941fb1809833764ee Author: Matthew Newhook <matthew@zeroc.com> Date: Tue Sep 4 17:25:35 2007 +0800 some cleanup. commit 58dae2c8e42132d645e8cbfce7ac6856995d3241 Author: Matthew Newhook <matthew@zeroc.com> Date: Tue Sep 4 17:20:22 2007 +0800 added more dire warning comments. commit c95d285943268c3623d61ccae8cc4d4654cf8056 Author: Matthew Newhook <matthew@zeroc.com> Date: Tue Sep 4 17:09:32 2007 +0800 remove debug. added comment. commit 8eed648a285edcf6b256ca9195021e36e437ac36 Author: Matthew Newhook <matthew@zeroc.com> Date: Tue Sep 4 17:04:12 2007 +0800 Copy the connection to prevent the transaction from accessing itself after its been blown away. commit 08523da6819abf029f67178a51c09b39e41168ca Author: Matthew Newhook <matthew@zeroc.com> Date: Tue Sep 4 16:25:40 2007 +0800 first set of fixes for the reference counting.
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Freeze/.depend2
-rw-r--r--cpp/src/Freeze/ConnectionI.cpp19
-rw-r--r--cpp/src/Freeze/ConnectionI.h17
-rw-r--r--cpp/src/Freeze/MapI.cpp1
-rw-r--r--cpp/src/Freeze/SharedDbEnv.cpp16
-rw-r--r--cpp/src/Freeze/TransactionI.cpp103
-rw-r--r--cpp/src/Freeze/TransactionI.h19
-rw-r--r--cpp/src/Freeze/TransactionalEvictorContext.cpp2
8 files changed, 78 insertions, 101 deletions
diff --git a/cpp/src/Freeze/.depend b/cpp/src/Freeze/.depend
index fd911adbba8..cedf40c7b9c 100644
--- a/cpp/src/Freeze/.depend
+++ b/cpp/src/Freeze/.depend
@@ -21,7 +21,7 @@ TransactionalEvictor$(OBJEXT): TransactionalEvictor.cpp ../../include/Freeze/Tra
TransactionalEvictorI$(OBJEXT): TransactionalEvictorI.cpp ../Freeze/TransactionalEvictorI.h ../Freeze/EvictorI.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/Config.h ../../include/IceUtil/AbstractMutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Algorithm.h ../../include/IceUtil/ArgVector.h ../../include/IceUtil/Base64.h ../../include/IceUtil/Cache.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/CountDownLatch.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/Functional.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/MD5.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Options.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Shared.h ../../include/IceUtil/OutputUtil.h ../../include/IceUtil/RWRecMutex.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Random.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/UUID.h ../../include/IceUtil/Unicode.h ../../include/IceUtil/Timer.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Ice/IconvStringConverter.h ../../include/Freeze/Freeze.h ../../include/Freeze/Initialize.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/Index.h ../../include/Freeze/DB.h ../../include/Freeze/Transaction.h ../../include/Freeze/BackgroundSaveEvictor.h ../../include/Freeze/Evictor.h ../../include/Freeze/Exception.h ../../include/Freeze/TransactionalEvictor.h ../../include/Freeze/Map.h ../../include/Freeze/Connection.h ../../include/Freeze/TransactionHolder.h ../Freeze/ObjectStore.h ../../include/Freeze/EvictorStorage.h ../Freeze/TransactionI.h ../Freeze/EvictorIteratorI.h ../Freeze/SharedDbEnv.h ../../include/IceUtil/DisableWarnings.h ../Freeze/Util.h ../Freeze/TransactionalEvictorContext.h
TransactionalEvictorContext$(OBJEXT): TransactionalEvictorContext.cpp ../Freeze/TransactionalEvictorContext.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Ice/IconvStringConverter.h ../../include/Freeze/TransactionalEvictor.h ../../include/Freeze/Evictor.h ../../include/Freeze/Exception.h ../../include/Freeze/EvictorStorage.h ../Freeze/EvictorI.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/AbstractMutex.h ../../include/IceUtil/Algorithm.h ../../include/IceUtil/ArgVector.h ../../include/IceUtil/Base64.h ../../include/IceUtil/Cache.h ../../include/IceUtil/CountDownLatch.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/MD5.h ../../include/IceUtil/Options.h ../../include/IceUtil/OutputUtil.h ../../include/IceUtil/RWRecMutex.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Random.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/UUID.h ../../include/IceUtil/Timer.h ../../include/Freeze/Freeze.h ../../include/Freeze/Initialize.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/Index.h ../../include/Freeze/DB.h ../../include/Freeze/Transaction.h ../../include/Freeze/BackgroundSaveEvictor.h ../../include/Freeze/Map.h ../../include/Freeze/Connection.h ../../include/Freeze/TransactionHolder.h ../Freeze/ObjectStore.h ../Freeze/TransactionI.h ../Freeze/EvictorIteratorI.h ../Freeze/SharedDbEnv.h ../../include/IceUtil/DisableWarnings.h ../Freeze/TransactionalEvictorI.h ../Freeze/Util.h ../Freeze/ConnectionI.h
TransactionHolder$(OBJEXT): TransactionHolder.cpp ../../include/Freeze/TransactionHolder.h ../../include/Freeze/Connection.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Freeze/Transaction.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/CommunicatorF.h
-TransactionI$(OBJEXT): TransactionI.cpp ../Freeze/TransactionI.h ../../include/Freeze/Transaction.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../Freeze/ConnectionI.h ../../include/Freeze/Connection.h ../../include/Ice/CommunicatorF.h ../../include/Freeze/Initialize.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Ice/IconvStringConverter.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/Index.h ../../include/Freeze/DB.h ../Freeze/SharedDbEnv.h ../../include/Freeze/Exception.h
+TransactionI$(OBJEXT): TransactionI.cpp ../Freeze/TransactionI.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Freeze/Transaction.h ../Freeze/ConnectionI.h ../../include/Freeze/Connection.h ../../include/Freeze/Initialize.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Ice/IconvStringConverter.h ../../include/Freeze/EvictorF.h ../../include/Freeze/ConnectionF.h ../../include/Freeze/Index.h ../../include/Freeze/DB.h ../Freeze/SharedDbEnv.h ../../include/Freeze/Exception.h
Transaction$(OBJEXT): Transaction.cpp ../../include/Freeze/Transaction.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
Util$(OBJEXT): Util.cpp ../Freeze/Util.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StreamF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Direct.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Ice/IconvStringConverter.h ../../include/Freeze/DB.h ../../include/Freeze/Exception.h
BackgroundSaveEvictor.cpp: ../../slice/Freeze/BackgroundSaveEvictor.ice ../../slice/Freeze/Evictor.ice ../../slice/Ice/ObjectAdapterF.ice ../../slice/Ice/ServantLocator.ice ../../slice/Ice/Current.ice ../../slice/Ice/ConnectionF.ice ../../slice/Ice/Identity.ice ../../slice/Freeze/Exception.ice
diff --git a/cpp/src/Freeze/ConnectionI.cpp b/cpp/src/Freeze/ConnectionI.cpp
index 1237a46c753..66a1e8ba0f7 100644
--- a/cpp/src/Freeze/ConnectionI.cpp
+++ b/cpp/src/Freeze/ConnectionI.cpp
@@ -15,7 +15,6 @@ using namespace Ice;
using namespace Freeze;
using namespace std;
-
Freeze::TransactionPtr
Freeze::ConnectionI::beginTransaction()
{
@@ -25,13 +24,12 @@ Freeze::ConnectionI::beginTransaction()
Freeze::TransactionIPtr
Freeze::ConnectionI::beginTransactionI()
{
- if(_transaction != 0)
+ if(_transaction)
{
throw TransactionAlreadyInProgressException(__FILE__, __LINE__);
}
closeAllIterators();
_transaction = new TransactionI(this);
- _transaction->internalIncRef();
return _transaction;
}
@@ -44,7 +42,7 @@ Freeze::ConnectionI::currentTransaction() const
void
Freeze::ConnectionI::close()
{
- if(_transaction != 0)
+ if(_transaction)
{
try
{
@@ -56,7 +54,7 @@ Freeze::ConnectionI::close()
// Ignored
//
}
- assert(_transaction == 0);
+ assert(!_transaction);
}
while(!_mapList.empty())
@@ -65,7 +63,6 @@ Freeze::ConnectionI::close()
}
_dbEnv = 0;
-
}
CommunicatorPtr
@@ -80,18 +77,15 @@ Freeze::ConnectionI::getName() const
return _envName;
}
-
Freeze::ConnectionI::~ConnectionI()
{
close();
}
-
Freeze::ConnectionI::ConnectionI(const SharedDbEnvPtr& dbEnv) :
_communicator(dbEnv->getCommunicator()),
_dbEnv(dbEnv),
_envName(dbEnv->getEnvName()),
- _transaction(0),
_trace(_communicator->getProperties()->getPropertyAsInt("Freeze.Trace.Map")),
_txTrace(_communicator->getProperties()->getPropertyAsInt("Freeze.Trace.Transaction")),
_deadlockWarning(_communicator->getProperties()->getPropertyAsInt("Freeze.Warn.Deadlocks") != 0)
@@ -121,17 +115,14 @@ Freeze::ConnectionI::unregisterMap(MapHelperI* m)
}
Freeze::ConnectionPtr
-Freeze::createConnection(const CommunicatorPtr& communicator,
- const string& envName)
+Freeze::createConnection(const CommunicatorPtr& communicator, const string& envName)
{
return new ConnectionI(SharedDbEnv::get(communicator, envName, 0));
}
Freeze::ConnectionPtr
-Freeze::createConnection(const CommunicatorPtr& communicator,
- const string& envName,
- DbEnv& dbEnv)
+Freeze::createConnection(const CommunicatorPtr& communicator, const string& envName, DbEnv& dbEnv)
{
return new ConnectionI(SharedDbEnv::get(communicator, envName, &dbEnv));
}
diff --git a/cpp/src/Freeze/ConnectionI.h b/cpp/src/Freeze/ConnectionI.h
index a9011da45e8..aa4fb822089 100644
--- a/cpp/src/Freeze/ConnectionI.h
+++ b/cpp/src/Freeze/ConnectionI.h
@@ -65,28 +65,27 @@ public:
private:
- Ice::CommunicatorPtr _communicator;
+ const Ice::CommunicatorPtr _communicator;
SharedDbEnvPtr _dbEnv;
- std::string _envName;
- TransactionI* _transaction;
+ const std::string _envName;
+ TransactionIPtr _transaction;
std::list<MapHelperI*> _mapList;
- Ice::Int _trace;
- Ice::Int _txTrace;
- bool _deadlockWarning;
+ const Ice::Int _trace;
+ const Ice::Int _txTrace;
+ const bool _deadlockWarning;
};
+typedef IceUtil::Handle<ConnectionI> ConnectionIPtr;
inline void
ConnectionI::clearTransaction()
{
- TransactionI* tx = _transaction;
_transaction = 0;
- tx->internalDecRef();
}
inline DbTxn*
ConnectionI::dbTxn() const
{
- if(_transaction == 0)
+ if(!_transaction)
{
return 0;
}
diff --git a/cpp/src/Freeze/MapI.cpp b/cpp/src/Freeze/MapI.cpp
index a070bbd3c31..ee2b1de0e3a 100644
--- a/cpp/src/Freeze/MapI.cpp
+++ b/cpp/src/Freeze/MapI.cpp
@@ -1376,7 +1376,6 @@ callback(Db* secondary, const Dbt* key, const Dbt* value, Dbt* result)
return index->secondaryKeyCreate(secondary, key, value, result);
}
-
Freeze::MapIndexI::MapIndexI(const ConnectionIPtr& connection, SharedDb& db,
DbTxn* txn, bool createDb, const MapIndexBasePtr& index) :
_index(index)
diff --git a/cpp/src/Freeze/SharedDbEnv.cpp b/cpp/src/Freeze/SharedDbEnv.cpp
index 1c54afbce7c..39df230f32c 100644
--- a/cpp/src/Freeze/SharedDbEnv.cpp
+++ b/cpp/src/Freeze/SharedDbEnv.cpp
@@ -90,10 +90,8 @@ SharedDbEnvMap* sharedDbEnvMap;
}
-
Freeze::SharedDbEnvPtr
-Freeze::SharedDbEnv::get(const CommunicatorPtr& communicator,
- const string& envName, DbEnv* env)
+Freeze::SharedDbEnv::get(const CommunicatorPtr& communicator, const string& envName, DbEnv* env)
{
StaticMutex::Lock lock(_mapMutex);
@@ -243,7 +241,6 @@ Freeze::SharedDbEnv::createCurrent()
return ctx;
}
-
Freeze::TransactionalEvictorContextPtr
Freeze::SharedDbEnv::getCurrent()
{
@@ -275,19 +272,19 @@ Freeze::SharedDbEnv::setCurrentTransaction(const Freeze::TransactionPtr& tx)
//
// Verify it points to the good DbEnv
//
- if(txi->getConnectionI() == 0 || txi->getConnectionI()->dbEnv() == 0)
+ ConnectionIPtr conn = ConnectionIPtr::dynamicCast(tx->getConnection());
+ if(!conn || conn->dbEnv() == 0)
{
throw DatabaseException(__FILE__, __LINE__, "invalid transaction");
}
- if(txi->getConnectionI()->dbEnv().get() != this)
+ if(conn->dbEnv().get() != this)
{
throw DatabaseException(__FILE__, __LINE__, "the given transaction is bound to environment '" +
- txi->getConnectionI()->dbEnv()->_envName + "'");
+ conn->dbEnv()->_envName + "'");
}
}
-
Freeze::TransactionalEvictorContextPtr ctx = getCurrent();
if(ctx != 0)
@@ -457,8 +454,6 @@ Freeze::SharedDbEnv::SharedDbEnv(const std::string& envName,
_catalog = SharedDb::openCatalog(*this);
}
-
-
Freeze::CheckpointThread::CheckpointThread(SharedDbEnv& dbEnv, const Time& checkpointPeriod, Int kbyte, Int trace) :
_dbEnv(dbEnv),
_done(false),
@@ -481,7 +476,6 @@ Freeze::CheckpointThread::terminate()
getThreadControl().join();
}
-
void
Freeze::CheckpointThread::run()
{
diff --git a/cpp/src/Freeze/TransactionI.cpp b/cpp/src/Freeze/TransactionI.cpp
index e5b28a79132..f7844748ed8 100644
--- a/cpp/src/Freeze/TransactionI.cpp
+++ b/cpp/src/Freeze/TransactionI.cpp
@@ -45,20 +45,21 @@ Freeze::TransactionI::commit()
if(_txTrace >= 1)
{
- Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction");
+ Trace out(_communicator->getLogger(), "Freeze.Transaction");
out << "committed transaction " << hex << txnId << dec;
}
}
catch(const ::DbDeadlockException& dx)
{
-
if(_txTrace >= 1)
{
- Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction");
+ Trace out(_communicator->getLogger(), "Freeze.Transaction");
out << "failed to commit transaction " << hex << txnId << dec << ": " << dx.what();
}
postCompletion(false, true);
+ // After postCompletion is called the transaction may be
+ // dead. Beware!
DeadlockException ex(__FILE__, __LINE__);
ex.message = dx.what();
throw ex;
@@ -67,16 +68,20 @@ Freeze::TransactionI::commit()
{
if(_txTrace >= 1)
{
- Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction");
+ Trace out(_communicator->getLogger(), "Freeze.Transaction");
out << "failed to commit transaction " << hex << txnId << dec << ": " << dx.what();
}
postCompletion(false, false);
+ // After postCompletion is called the transaction may be
+ // dead. Beware!
DatabaseException ex(__FILE__, __LINE__);
ex.message = dx.what();
throw ex;
}
postCompletion(true, false);
+ // After postCompletion is called the transaction may be
+ // dead. Beware!
}
void
@@ -98,7 +103,7 @@ Freeze::TransactionI::rollback()
if(_txTrace >= 1)
{
- Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction");
+ Trace out(_communicator->getLogger(), "Freeze.Transaction");
out << "rolled back transaction " << hex << txnId << dec;
}
}
@@ -106,88 +111,70 @@ Freeze::TransactionI::rollback()
{
if(_txTrace >= 1)
{
- Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction");
+ Trace out(_communicator->getLogger(), "Freeze.Transaction");
out << "failed to rollback transaction " << hex << txnId << dec << ": " << dx.what();
}
postCompletion(false, true);
+ // After postCompletion is called the transaction may be
+ // dead. Beware!
throw DeadlockException(__FILE__, __LINE__, dx.what());
}
catch(const ::DbException& dx)
{
if(_txTrace >= 1)
{
- Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction");
+ Trace out(_communicator->getLogger(), "Freeze.Transaction");
out << "failed to rollback transaction " << hex << txnId << dec << ": " << dx.what();
}
postCompletion(false, false);
+ // After postCompletion is called the transaction may be
+ // dead. Beware!
throw DatabaseException(__FILE__, __LINE__, dx.what());
}
postCompletion(true, false);
+ // After postCompletion is called the transaction may be
+ // dead. Beware!
}
}
Freeze::ConnectionPtr
Freeze::TransactionI::getConnection() const
{
- if(_txn != 0)
- {
- return _connection;
- }
- else
- {
- return 0;
- }
+ return _connection;
}
//
// External refcount operations, from code holding a Transaction[I]Ptr
//
void
-Freeze::TransactionI::__incRef()
-{
- Shared::__incRef();
- if(_txn != 0)
- {
- _connection->__incRef();
- }
-}
-
-void
Freeze::TransactionI::__decRef()
{
- if(_txn != 0)
+ // If dropping the second to last reference and there is still a
+ // transaction then this means the last reference is held by the
+ // connection. In this case we must rollback the transaction.
+ bool rb = false;
+ if(__getRef() == 2 && _txn)
{
- _connection->__decRef();
+ rb = true;
}
Shared::__decRef();
+ if(rb)
+ {
+ rollback();
+ // After this the transaction is dead.
+ }
}
-//
-// The refcount on transaction held by the associated ConnectionI object
-//
-void
-Freeze::TransactionI::internalIncRef()
-{
- Shared::__incRef();
-}
-
-void
-Freeze::TransactionI::internalDecRef()
-{
- Shared::__incRef();
-}
-
-
void
Freeze::TransactionI::setPostCompletionCallback(const Freeze::PostCompletionCallbackPtr& cb)
{
_postCompletionCallback = cb;
}
-
-Freeze::TransactionI::TransactionI(ConnectionI* connection) :
+Freeze::TransactionI::TransactionI(const ConnectionIPtr& connection) :
+ _communicator(connection->communicator()),
_connection(connection),
_txTrace(connection->txTrace()),
_txn(0)
@@ -199,7 +186,7 @@ Freeze::TransactionI::TransactionI(ConnectionI* connection) :
if(_txTrace >= 1)
{
long txnId = (_txn->id() & 0x7FFFFFFF) + 0x80000000L;
- Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction");
+ Trace out(_communicator->getLogger(), "Freeze.Transaction");
out << "started transaction " << hex << txnId << dec;
}
}
@@ -207,7 +194,7 @@ Freeze::TransactionI::TransactionI(ConnectionI* connection) :
{
if(_txTrace >= 1)
{
- Trace out(_connection->communicator()->getLogger(), "Freeze.Transaction");
+ Trace out(_communicator->getLogger(), "Freeze.Transaction");
out << "failed to start transaction: " << dx.what();
}
@@ -228,7 +215,7 @@ Freeze::TransactionI::~TransactionI()
}
catch(const IceUtil::Exception& e)
{
- Error error(_connection->communicator()->getLogger());
+ Error error(_communicator->getLogger());
error << "transaction rollback raised :" << e;
}
}
@@ -237,6 +224,10 @@ Freeze::TransactionI::~TransactionI()
void
Freeze::TransactionI::postCompletion(bool committed, bool deadlock)
{
+ // The order of assignment in this method is very important as
+ // calling both the post completion callback and
+ // Connection::clearTransaction may alter the transaction
+ // reference count which checks _txn.
_txn = 0;
if(_postCompletionCallback != 0)
@@ -244,5 +235,19 @@ Freeze::TransactionI::postCompletion(bool committed, bool deadlock)
_postCompletionCallback->postCompletion(committed, deadlock);
}
- _connection->clearTransaction(); // will release the internal refcount
+ // Its necessary here to copy the connection before calling
+ // clearTransaction because this may release the last reference. This specifically
+ // occurs in the following scenario:
+ //
+ // TransactionalEvictorContext holds the _tx. It calls
+ // _tx->commit(). This comes into this method, and calls
+ // _postCompletionCallback. This causes the context to drop the
+ // _tx reference (reference count is now 1). The
+ // connection->clearTransaction() is then called which drops its
+ // reference causing the transaction to be deleted.
+ //
+ ConnectionIPtr con = _connection;
+ _connection = 0; // Drop the connection
+ con->clearTransaction();
+ // At this point the transaction may be dead.
}
diff --git a/cpp/src/Freeze/TransactionI.h b/cpp/src/Freeze/TransactionI.h
index b8e5a9a582d..a44e782bbc0 100644
--- a/cpp/src/Freeze/TransactionI.h
+++ b/cpp/src/Freeze/TransactionI.h
@@ -10,6 +10,7 @@
#ifndef FREEZE_TRANSACTIONI_H
#define FREEZE_TRANSACTIONI_H
+#include <Ice/CommunicatorF.h>
#include <Freeze/Transaction.h>
#include <db_cxx.h>
@@ -27,7 +28,6 @@ public:
};
typedef IceUtil::Handle<PostCompletionCallback> PostCompletionCallbackPtr;
-
class TransactionI : public Transaction
{
public:
@@ -41,12 +41,11 @@ public:
//
// Custom refcounting implementation
//
- virtual void __incRef();
virtual void __decRef();
void setPostCompletionCallback(const PostCompletionCallbackPtr&);
- TransactionI(ConnectionI*);
+ TransactionI(const ConnectionIPtr&);
~TransactionI();
DbTxn*
@@ -55,23 +54,15 @@ public:
return _txn;
}
- const ConnectionI*
- getConnectionI() const
- {
- return _connection;
- }
-
private:
friend class ConnectionI;
- void internalIncRef();
- void internalDecRef();
-
void postCompletion(bool, bool);
- ConnectionI* const _connection;
- Ice::Int _txTrace;
+ const Ice::CommunicatorPtr _communicator;
+ ConnectionIPtr _connection;
+ const Ice::Int _txTrace;
DbTxn* _txn;
PostCompletionCallbackPtr _postCompletionCallback;
};
diff --git a/cpp/src/Freeze/TransactionalEvictorContext.cpp b/cpp/src/Freeze/TransactionalEvictorContext.cpp
index ac9466d017e..9fe1cf11d3f 100644
--- a/cpp/src/Freeze/TransactionalEvictorContext.cpp
+++ b/cpp/src/Freeze/TransactionalEvictorContext.cpp
@@ -34,7 +34,6 @@ Freeze::TransactionalEvictorContext::TransactionalEvictorContext(const Transacti
_tx->setPostCompletionCallback(this);
}
-
Freeze::TransactionalEvictorContext::~TransactionalEvictorContext()
{
for_each(_invalidateList.begin(), _invalidateList.end(), ToInvalidate::destroy);
@@ -58,7 +57,6 @@ Freeze::TransactionalEvictorContext::rollback()
}
}
-
void
Freeze::TransactionalEvictorContext::postCompletion(bool committed, bool deadlock)
{