package org.multiverse.stms.gamma.integration.liveness; import org.junit.Before; import org.junit.Test; import org.multiverse.api.exceptions.ReadWriteConflict; import org.multiverse.stms.gamma.GammaConstants; import org.multiverse.stms.gamma.GammaStm; import org.multiverse.stms.gamma.transactionalobjects.GammaTxnLong; import org.multiverse.stms.gamma.transactions.GammaTxn; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import static org.multiverse.TestUtils.assertIsAborted; import static org.multiverse.api.GlobalStmInstance.getGlobalStmInstance; import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn; public class DeadLockTest implements GammaConstants { private GammaStm stm; @Before public void setUp() { clearThreadLocalTxn(); stm = (GammaStm) getGlobalStmInstance(); } @Test public void test() { GammaTxnLong ref1 = new GammaTxnLong(stm); GammaTxnLong ref2 = new GammaTxnLong(stm); GammaTxn tx1 = stm.newDefaultTxn(); GammaTxn tx2 = stm.newDefaultTxn(); ref1.openForWrite(tx1, LOCKMODE_EXCLUSIVE).long_value++; ref2.openForWrite(tx2, LOCKMODE_EXCLUSIVE).long_value++; try { ref2.openForWrite(tx1, LOCKMODE_EXCLUSIVE); fail(); } catch (ReadWriteConflict expected) { } assertIsAborted(tx1); ref1.openForWrite(tx2, LOCKMODE_EXCLUSIVE).long_value++; tx2.commit(); assertEquals(1, ref1.atomicGet()); assertEquals(1, ref2.atomicGet()); } }