public boolean tryExclusiveLock(Procedure<?> proc) { if (isLocked()) { return hasLockAccess(proc); } exclusiveLockOwnerProcedure = proc; return true; }
/** * @return whether we have succesfully acquired the shared lock. */ public boolean trySharedLock(Procedure<?> proc) { if (hasExclusiveLock() && !hasLockAccess(proc)) { return false; } // If no one holds the xlock, then we are free to hold the sharedLock // If the parent proc or we have already held the xlock, then we return true here as // xlock is more powerful then shared lock. sharedLock++; return true; }
@Test public void testHasLockAccess() { Map<Long, NoopProcedure<Void>> procMap = new HashMap<>(); for (long i = 1; i <= 10; i++) { NoopProcedure<Void> proc = new NoopProcedure<>(); proc.setProcId(i); if (i > 1) { proc.setParentProcId(i - 1); proc.setRootProcId(1); } procMap.put(i, proc); } LockAndQueue laq = new LockAndQueue(procMap::get); for (long i = 1; i <= 10; i++) { assertFalse(laq.hasLockAccess(procMap.get(i))); } for (long i = 1; i <= 10; i++) { NoopProcedure<Void> procHasLock = procMap.get(i); laq.tryExclusiveLock(procHasLock); for (long j = 1; j < i; j++) { assertFalse(laq.hasLockAccess(procMap.get(j))); } for (long j = i; j <= 10; j++) { assertTrue(laq.hasLockAccess(procMap.get(j))); } laq.releaseExclusiveLock(procHasLock); } } }
public boolean tryExclusiveLock(Procedure<?> proc) { if (isLocked()) { return hasLockAccess(proc); } exclusiveLockOwnerProcedure = proc; return true; }
public boolean tryExclusiveLock(final Procedure proc) { if (isLocked()) return hasLockAccess(proc); exclusiveLockOwnerProcedure = proc; return true; }
/** * @return whether we have succesfully acquired the shared lock. */ public boolean trySharedLock(Procedure<?> proc) { if (hasExclusiveLock() && !hasLockAccess(proc)) { return false; } // If no one holds the xlock, then we are free to hold the sharedLock // If the parent proc or we have already held the xlock, then we return true here as // xlock is more powerful then shared lock. sharedLock++; return true; }
@Test public void testHasLockAccess() { Map<Long, NoopProcedure<Void>> procMap = new HashMap<>(); for (long i = 1; i <= 10; i++) { NoopProcedure<Void> proc = new NoopProcedure<>(); proc.setProcId(i); if (i > 1) { proc.setParentProcId(i - 1); proc.setRootProcId(1); } procMap.put(i, proc); } LockAndQueue laq = new LockAndQueue(procMap::get); for (long i = 1; i <= 10; i++) { assertFalse(laq.hasLockAccess(procMap.get(i))); } for (long i = 1; i <= 10; i++) { NoopProcedure<Void> procHasLock = procMap.get(i); laq.tryExclusiveLock(procHasLock); for (long j = 1; j < i; j++) { assertFalse(laq.hasLockAccess(procMap.get(j))); } for (long j = i; j <= 10; j++) { assertTrue(laq.hasLockAccess(procMap.get(j))); } laq.releaseExclusiveLock(procHasLock); } } }