static void releaseDBLockOnTimeoutEval() { callOptMC("beforeDelegatingToThread_do", f releaseDBLockOnTimeoutEval_before); callOptMC("afterDelegatingToThread_do", f releaseDBLockOnTimeoutEval_after); } static new ThreadLocal releaseDBLockOnTimeoutEval_hadLock; svoid releaseDBLockOnTimeoutEval_before(Thread t) { releaseDBLockOnTimeoutEval_hadLock.set(unlockIfHolding(dbLock())); } svoid releaseDBLockOnTimeoutEval_after(Thread t) { if (isTrue(getAndClearThreadLocal(releaseDBLockOnTimeoutEval_hadLock))) lock(dbLock()); }