summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2007-07-06 15:14:06 -0400
committerBernard Normier <bernard@zeroc.com>2007-07-06 15:14:06 -0400
commit3a5a3740e06b15d27badc3a000e174f01403bc60 (patch)
tree8ea1e9abebfd82e996b6b90cfcf635ff74c00bb9 /cpp/src
parentAMD testing + AMD "rollback on user exception" fix (diff)
downloadice-3a5a3740e06b15d27badc3a000e174f01403bc60.tar.bz2
ice-3a5a3740e06b15d27badc3a000e174f01403bc60.tar.xz
ice-3a5a3740e06b15d27badc3a000e174f01403bc60.zip
AMD testing + minimal rollback on user exception support in AMD
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Freeze/TransactionalEvictorContext.cpp14
-rw-r--r--cpp/src/Freeze/TransactionalEvictorContext.h8
-rw-r--r--cpp/src/Freeze/TransactionalEvictorI.cpp5
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;