@Test public void shouldNotLeaveResidualLockStateAfterAllLocksHaveBeenReleased() { // given ReentrantLockService locks = new ReentrantLockService(); // when locks.acquireNodeLock( 42, LockService.LockType.WRITE_LOCK ).release(); // then assertEquals( 0, locks.lockCount() ); }
@Test public void shouldPresentLockStateInStringRepresentationOfLock() { // given LockService locks = new ReentrantLockService(); Lock first; Lock second; // when try ( Lock lock = first = locks.acquireNodeLock( 666, LockService.LockType.WRITE_LOCK ) ) { // then assertEquals( "LockedNode[id=666; HELD_BY=1*" + Thread.currentThread() + "]", lock.toString() ); // when try ( Lock inner = second = locks.acquireNodeLock( 666, LockService.LockType.WRITE_LOCK ) ) { assertEquals( "LockedNode[id=666; HELD_BY=2*" + Thread.currentThread() + "]", lock.toString() ); assertEquals( lock.toString(), inner.toString() ); } // then assertEquals( "LockedNode[id=666; HELD_BY=1*" + Thread.currentThread() + "]", lock.toString() ); assertEquals( "LockedNode[id=666; RELEASED]", second.toString() ); } // then assertEquals( "LockedNode[id=666; RELEASED]", first.toString() ); assertEquals( "LockedNode[id=666; RELEASED]", second.toString() ); }
@Test public void shouldBlockOnLockedLock() throws Exception { // given LockService locks = new ReentrantLockService(); LockNode lockSameNode = new LockNode( locks, 17 ); ThreadRepository.Events events = threads.events(); ThreadRepository.Signal ready = threads.signal(); // when try ( Lock ignored = locks.acquireNodeLock( 17, LockService.LockType.WRITE_LOCK ) ) { ThreadRepository.ThreadInfo thread = threads.execute( ready, lockSameNode, events.trigger( "locked" ), lockSameNode.release ); ready.awaitNow(); // then assertTrue( awaitParked( thread, 5, TimeUnit.SECONDS ) ); assertTrue( events.snapshot().isEmpty() ); } events.assertInOrder( "locked" ); }
@Test public void shouldAllowReEntrance() throws Exception { // given LockService locks = new ReentrantLockService(); ThreadRepository.Events events = threads.events(); LockNode lock1once = new LockNode( locks, 1 ); LockNode lock1again = new LockNode( locks, 1 ); LockNode lock1inOtherThread = new LockNode( locks, 1 ); ThreadRepository.Signal lockedOnce = threads.signal(); ThreadRepository.Signal ready = threads.signal(); // when threads.execute( lock1once, ready.await(), lockedOnce, lock1again, events.trigger( "Double Locked" ), lock1once.release, lock1again.release ); threads.execute( ready, lockedOnce.await(), lock1inOtherThread, events.trigger( "Other Thread" ), lock1inOtherThread.release ); // then events.assertInOrder( "Double Locked", "Other Thread" ); }
this.engineProviders = context.getEngineProviders(); this.msgLog = logProvider.getLog( getClass() ); this.lockService = new ReentrantLockService(); this.commitProcessFactory = context.getCommitProcessFactory(); this.pageCache = context.getPageCache();
this.engineProviders = context.getEngineProviders(); this.msgLog = logProvider.getLog( getClass() ); this.lockService = new ReentrantLockService(); this.commitProcessFactory = context.getCommitProcessFactory(); this.pageCache = context.getPageCache();