diff options
author | Bernard Normier <bernard@zeroc.com> | 2007-11-19 16:13:05 -0500 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2007-11-19 16:13:05 -0500 |
commit | a9b2a73a6c8897e84e5e64ee8b41fe17b06d3f54 (patch) | |
tree | eb1216068d7e9be1c1039f13953b2101f00aa60f /cpp/src/Freeze/TransactionalEvictorContext.cpp | |
parent | Added IceSL makedist.py (diff) | |
download | ice-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.cpp | 57 |
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; } |