private void setCurrentTransaction(@NotNull final TransactionBase result) { final Thread thread = result.getCreatingThread(); Deque<TransactionBase> stack = threadTxns.get(thread); if (stack == null) { stack = new ArrayDeque<>(4); threadTxns.put(thread, stack); } stack.push(result); }
void releaseTransaction(@NotNull final TransactionBase txn) { releaseTransaction(txn.getCreatingThread(), txn.getAcquiredPermits()); }
void downgradeTransaction(@NotNull final TransactionBase txn) { downgradeTransaction(txn.getCreatingThread(), txn.getAcquiredPermits()); txn.setAcquiredPermits(1); }
@Override protected void finishTransaction(@NotNull final TransactionBase txn) { final Thread thread = txn.getCreatingThread(); // logging.info("finished txn " + System.identityHashCode(txn) + " in thread " + thread.getName(), new Throwable()); if (!Thread.currentThread().equals(thread)) { throw new ExodusException("Can't finish transaction in a thread different from the one which it was created in"); } final Deque<TransactionBase> stack = threadTxns.get(thread); if (stack == null) { throw new ExodusException("Transaction was already finished"); } if (txn != stack.peek()) { throw new ExodusException("Can't finish transaction: nested transaction is not finished"); } stack.pop(); if (stack.isEmpty()) { threadTxns.remove(thread); } super.finishTransaction(txn); }
void acquireTransaction(@NotNull final TransactionBase txn, @NotNull final Environment env) { final Thread creatingThread = txn.getCreatingThread(); int acquiredPermits; if (txn.isExclusive()) { if (txn.isGCTransaction()) { final int gcTransactionAcquireTimeout = env.getEnvironmentConfig().getGcTransactionAcquireTimeout(); acquiredPermits = tryAcquireExclusiveTransaction(creatingThread, gcTransactionAcquireTimeout); if (acquiredPermits == 0) { throw new TransactionAcquireTimeoutException(gcTransactionAcquireTimeout); } } else { acquiredPermits = acquireExclusiveTransaction(creatingThread); } if (acquiredPermits == 1) { txn.setExclusive(false); } } else { acquiredPermits = acquireTransaction(creatingThread); } txn.setAcquiredPermits(acquiredPermits); }