diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Freeze/TransactionalEvictorContext.cpp | 14 | ||||
-rw-r--r-- | cpp/src/Freeze/TransactionalEvictorContext.h | 8 | ||||
-rw-r--r-- | cpp/src/Freeze/TransactionalEvictorI.cpp | 5 |
3 files changed, 25 insertions, 2 deletions
diff --git a/cpp/src/Freeze/TransactionalEvictorContext.cpp b/cpp/src/Freeze/TransactionalEvictorContext.cpp index 395203ed805..ac9466d017e 100644 --- a/cpp/src/Freeze/TransactionalEvictorContext.cpp +++ b/cpp/src/Freeze/TransactionalEvictorContext.cpp @@ -119,11 +119,23 @@ Freeze::TransactionalEvictorContext::checkDeadlockException() } } +bool +Freeze::TransactionalEvictorContext::clearUserException() +{ + bool result = _userExceptionDetected; + _userExceptionDetected = false; + return result; +} + bool -Freeze::TransactionalEvictorContext::response(bool) +Freeze::TransactionalEvictorContext::response(bool ok) { if(_owner == IceUtil::ThreadControl()) { + if(!ok) + { + _userExceptionDetected = true; + } return true; } else diff --git a/cpp/src/Freeze/TransactionalEvictorContext.h b/cpp/src/Freeze/TransactionalEvictorContext.h index f9bcb1aa375..12b2a2e8765 100644 --- a/cpp/src/Freeze/TransactionalEvictorContext.h +++ b/cpp/src/Freeze/TransactionalEvictorContext.h @@ -112,6 +112,8 @@ public: void checkDeadlockException(); + bool clearUserException(); + void commit(); void rollback(); @@ -145,12 +147,16 @@ private: bool _rollbackOnly; std::auto_ptr<DeadlockException> _deadlockException; - + // // Protected by this // bool _deadlockExceptionDetected; + // + // Not protected (used only by dispatch thread) + // + bool _userExceptionDetected; }; typedef IceUtil::Handle<TransactionalEvictorContext> TransactionalEvictorContextPtr; diff --git a/cpp/src/Freeze/TransactionalEvictorI.cpp b/cpp/src/Freeze/TransactionalEvictorI.cpp index f9629432ec6..eb359c22368 100644 --- a/cpp/src/Freeze/TransactionalEvictorI.cpp +++ b/cpp/src/Freeze/TransactionalEvictorI.cpp @@ -543,6 +543,11 @@ Freeze::TransactionalEvictorI::dispatch(Request& request) // May throw DeadlockException // ctx->checkDeadlockException(); + + if(ctx->clearUserException() && _rollbackOnUserException) + { + ctx->rollback(); + } } return dispatchStatus; |