summaryrefslogtreecommitdiff
path: root/cpp/src/Freeze/TransactionalEvictorContext.cpp
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2007-11-19 16:13:05 -0500
committerBernard Normier <bernard@zeroc.com>2007-11-19 16:13:05 -0500
commita9b2a73a6c8897e84e5e64ee8b41fe17b06d3f54 (patch)
treeeb1216068d7e9be1c1039f13953b2101f00aa60f /cpp/src/Freeze/TransactionalEvictorContext.cpp
parentAdded IceSL makedist.py (diff)
downloadice-a9b2a73a6c8897e84e5e64ee8b41fe17b06d3f54.tar.bz2
ice-a9b2a73a6c8897e84e5e64ee8b41fe17b06d3f54.tar.xz
ice-a9b2a73a6c8897e84e5e64ee8b41fe17b06d3f54.zip
Fixed bug #2543
Diffstat (limited to 'cpp/src/Freeze/TransactionalEvictorContext.cpp')
-rw-r--r--cpp/src/Freeze/TransactionalEvictorContext.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/cpp/src/Freeze/TransactionalEvictorContext.cpp b/cpp/src/Freeze/TransactionalEvictorContext.cpp
index 369c6fd1763..2c68a4eae2e 100644
--- a/cpp/src/Freeze/TransactionalEvictorContext.cpp
+++ b/cpp/src/Freeze/TransactionalEvictorContext.cpp
@@ -19,6 +19,49 @@ using namespace std;
using namespace Freeze;
using namespace Ice;
+//
+// TransactionalEvictorDeadlockException
+//
+
+Freeze::TransactionalEvictorDeadlockException::TransactionalEvictorDeadlockException(const char* file, int line, const TransactionPtr& transaction) :
+ Ice::LocalException(file, line),
+ tx(transaction)
+{
+}
+
+Freeze::TransactionalEvictorDeadlockException::~TransactionalEvictorDeadlockException() throw()
+{
+}
+
+string
+Freeze::TransactionalEvictorDeadlockException::ice_name() const
+{
+ return "Freeze::TransactionalEvictorDeadlockException";
+}
+
+Ice::Exception*
+Freeze::TransactionalEvictorDeadlockException::ice_clone() const
+{
+ return new TransactionalEvictorDeadlockException(*this);
+}
+
+void
+Freeze::TransactionalEvictorDeadlockException::ice_throw() const
+{
+ throw *this;
+}
+
+void
+Freeze::TransactionalEvictorDeadlockException::ice_print(ostream& out) const
+{
+ Ice::Exception::ice_print(out);
+ out << ":\ntransactional evictor deadlock exception";
+}
+
+
+//
+// TransactionalEvictorContext
+//
Freeze::TransactionalEvictorContext::TransactionalEvictorContext(const SharedDbEnvPtr& dbEnv) :
_tx((new ConnectionI(dbEnv))->beginTransactionI()),
@@ -115,6 +158,11 @@ Freeze::TransactionalEvictorContext::checkDeadlockException()
{
_deadlockException->ice_throw();
}
+
+ if(_nestedCallDeadlockException.get() != 0)
+ {
+ _nestedCallDeadlockException->ice_throw();
+ }
}
bool
@@ -157,6 +205,15 @@ Freeze::TransactionalEvictorContext::exception(const std::exception& ex)
_deadlockException.reset(dynamic_cast<DeadlockException*>(dx->ice_clone()));
return false;
}
+
+ const TransactionalEvictorDeadlockException* edx =
+ dynamic_cast<const TransactionalEvictorDeadlockException*>(&ex);
+ if(edx != 0 && _owner == IceUtil::ThreadControl())
+ {
+ _nestedCallDeadlockException.reset(dynamic_cast<TransactionalEvictorDeadlockException*>(edx->ice_clone()));
+ return false;
+ }
+
return true;
}