/** * Increment active number of clients that use current state instance. * * @param client the locks client associated with this state; used only to create pretty exception * with {@link LockClientStoppedException#LockClientStoppedException(Locks.Client)}. * @throws LockClientStoppedException when stopped. */ public void incrementActiveClients( Locks.Client client ) { int currentState; do { currentState = clientState.get(); if ( isStopped( currentState ) ) { throw new LockClientStoppedException( client ); } } while ( !clientState.compareAndSet( currentState, incrementActiveClients( currentState ) ) ); }
@Override public boolean reEnterShared( ResourceType resourceType, long resourceId ) { stateHolder.incrementActiveClients( this ); try { return reEnter( localShared( resourceType ), resourceId ); } finally { stateHolder.decrementActiveClients(); } }
@Override public boolean reEnterExclusive( ResourceType resourceType, long resourceId ) { stateHolder.incrementActiveClients( this ); try { return reEnter( localExclusive( resourceType ), resourceId ); } finally { stateHolder.decrementActiveClients(); } }
@Override public void releaseShared( ResourceType resourceType, long... resourceIds ) { stateHolder.incrementActiveClients( this ); try { final MutableLongObjectMap<LockResource> localLocks = localShared( resourceType ); for ( long resourceId : resourceIds ) { LockResource resource = localLocks.get( resourceId ); if ( resource.releaseReference() == 0 ) { localLocks.remove( resourceId ); manager.releaseReadLock( new LockResource( resourceType, resourceId ), lockTransaction ); } } } finally { stateHolder.decrementActiveClients(); } }
@Override public void releaseExclusive( ResourceType resourceType, long... resourceIds ) { stateHolder.incrementActiveClients( this ); try { final MutableLongObjectMap<LockResource> localLocks = localExclusive( resourceType ); for ( long resourceId : resourceIds ) { LockResource resource = localLocks.get( resourceId ); if ( resource.releaseReference() == 0 ) { localLocks.remove( resourceId ); manager.releaseWriteLock( new LockResource( resourceType, resourceId ), lockTransaction ); } } } finally { stateHolder.decrementActiveClients(); } }
@Override public boolean tryExclusiveLock( ResourceType resourceType, long resourceId ) stateHolder.incrementActiveClients( this ); try
@Override public boolean trySharedLock( ResourceType resourceType, long resourceId ) stateHolder.incrementActiveClients( this ); try
@Test public void shouldAllowIncrementDecrementClientsWhileNotClosed() { // given LockClientStateHolder lockClientStateHolder = new LockClientStateHolder(); // expect assertFalse( lockClientStateHolder.hasActiveClients() ); lockClientStateHolder.incrementActiveClients( new NoOpClient() ); assertTrue( lockClientStateHolder.hasActiveClients() ); lockClientStateHolder.incrementActiveClients( new NoOpClient() ); lockClientStateHolder.incrementActiveClients( new NoOpClient() ); lockClientStateHolder.decrementActiveClients(); lockClientStateHolder.decrementActiveClients(); lockClientStateHolder.decrementActiveClients(); assertFalse( lockClientStateHolder.hasActiveClients() ); }
@Override public void acquireShared( LockTracer tracer, ResourceType resourceType, long... resourceIds ) stateHolder.incrementActiveClients( this ); try
@Override public void acquireExclusive( LockTracer tracer, ResourceType resourceType, long... resourceIds ) stateHolder.incrementActiveClients( this ); try
@Test public void shouldNotAllowNewClientsWhenClosed() { // given LockClientStateHolder lockClientStateHolder = new LockClientStateHolder(); // when lockClientStateHolder.stopClient(); // then assertFalse( lockClientStateHolder.hasActiveClients() ); try { lockClientStateHolder.incrementActiveClients( new NoOpClient() ); fail( "Exception expected" ); } catch ( Exception e ) { assertThat( e, instanceOf( LockClientStoppedException.class ) ); } }
@Test public void shouldBeAbleToDecrementActiveItemAndDetectWhenFree() { // given LockClientStateHolder lockClientStateHolder = new LockClientStateHolder(); // when lockClientStateHolder.incrementActiveClients(new NoOpClient()); lockClientStateHolder.incrementActiveClients(new NoOpClient()); lockClientStateHolder.decrementActiveClients(); lockClientStateHolder.incrementActiveClients(new NoOpClient()); // expect assertTrue( lockClientStateHolder.hasActiveClients() ); // and when lockClientStateHolder.stopClient(); // expect assertTrue( lockClientStateHolder.hasActiveClients() ); lockClientStateHolder.decrementActiveClients(); assertTrue( lockClientStateHolder.hasActiveClients() ); lockClientStateHolder.decrementActiveClients(); assertFalse( lockClientStateHolder.hasActiveClients() ); }
@Test public void shouldBeAbleToResetAndReuseClientState() { // given LockClientStateHolder lockClientStateHolder = new LockClientStateHolder(); // when lockClientStateHolder.incrementActiveClients( new NoOpClient() ); lockClientStateHolder.incrementActiveClients( new NoOpClient() ); lockClientStateHolder.decrementActiveClients(); // expect assertTrue(lockClientStateHolder.hasActiveClients()); // and when lockClientStateHolder.stopClient(); // expect assertTrue( lockClientStateHolder.hasActiveClients() ); assertTrue( lockClientStateHolder.isStopped() ); // and when lockClientStateHolder.reset(); // expect assertFalse( lockClientStateHolder.hasActiveClients() ); assertFalse( lockClientStateHolder.isStopped() ); // when lockClientStateHolder.incrementActiveClients( new NoOpClient() ); assertTrue( lockClientStateHolder.hasActiveClients() ); assertFalse( lockClientStateHolder.isStopped() ); }
/** * Increment active number of clients that use current state instance. * * @param client the locks client associated with this state; used only to create pretty exception * with {@link LockClientStoppedException#LockClientStoppedException(Locks.Client)}. * @throws LockClientStoppedException when stopped. */ public void incrementActiveClients( Locks.Client client ) { int currentState; do { currentState = clientState.get(); if ( isStopped( currentState ) ) { throw new LockClientStoppedException( client ); } } while ( !clientState.compareAndSet( currentState, incrementActiveClients( currentState ) ) ); }
@Override public boolean reEnterShared( ResourceType resourceType, long resourceId ) { stateHolder.incrementActiveClients( this ); try { return reEnter( localShared( resourceType ), resourceId ); } finally { stateHolder.decrementActiveClients(); } }
@Override public boolean reEnterExclusive( ResourceType resourceType, long resourceId ) { stateHolder.incrementActiveClients( this ); try { return reEnter( localExclusive( resourceType ), resourceId ); } finally { stateHolder.decrementActiveClients(); } }
@Override public boolean reEnterExclusive( ResourceType resourceType, long resourceId ) { stateHolder.incrementActiveClients( this ); try { PrimitiveLongIntMap heldLocks = exclusiveLockCounts[resourceType.typeId()]; int heldCount = heldLocks.get( resourceId ); if ( heldCount != -1 ) { // We already have a lock on this, just increment our local reference counter. heldLocks.put( resourceId, Math.incrementExact( heldCount ) ); return true; } // We didn't hold a lock already, so we cannot re-enter. return false; } finally { stateHolder.decrementActiveClients(); } }
@Override public void releaseShared( ResourceType resourceType, long... resourceIds ) { stateHolder.incrementActiveClients( this ); try { final MutableLongObjectMap<LockResource> localLocks = localShared( resourceType ); for ( long resourceId : resourceIds ) { LockResource resource = localLocks.get( resourceId ); if ( resource.releaseReference() == 0 ) { localLocks.remove( resourceId ); manager.releaseReadLock( new LockResource( resourceType, resourceId ), lockTransaction ); } } } finally { stateHolder.decrementActiveClients(); } }
@Override public void releaseExclusive( ResourceType resourceType, long... resourceIds ) { stateHolder.incrementActiveClients( this ); try { final MutableLongObjectMap<LockResource> localLocks = localExclusive( resourceType ); for ( long resourceId : resourceIds ) { LockResource resource = localLocks.get( resourceId ); if ( resource.releaseReference() == 0 ) { localLocks.remove( resourceId ); manager.releaseWriteLock( new LockResource( resourceType, resourceId ), lockTransaction ); } } } finally { stateHolder.decrementActiveClients(); } }
@Override public void acquireShared( LockTracer tracer, ResourceType resourceType, long... resourceIds ) stateHolder.incrementActiveClients( this ); try