You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.3 KiB

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
// Tests documenting FPs and FNs due to lack of sensitivity in starvation analysis
import java.util.concurrent.locks.Lock;
class LockSensitivity {
Lock lockA, lockB;
// In the following two methods, AB vs BA deadlock pattern
// remains undetected since one of the locks happens via `tryLock` and result check.
public void FN_tryLockDeadlockAB_Bad() {
boolean locked = lockA.tryLock();
if (locked) {
lockB.lock();
lockB.unlock();
lockA.unlock();
} else {
}
}
public void FN_tryLockDeadlockBA_Bad() {
lockB.lock();
lockA.lock(); // deadlock: `lockA` may be locked via `tryLock()` above
lockA.unlock();
lockB.unlock();
}
// Asserting a lock is held is not the same as taking it wrt deadlocks.
// In the following two methods, AB vs BA pattern is wrongly detected.
Object monitorA, monitorB;
public void FP_assertHoldsLockAB_Ok() {
OurThreadUtils.assertHoldsLock(monitorA);
OurThreadUtils.assertHoldsLock(monitorB);
}
public void FP_assertHoldsLockBA_Ok() {
OurThreadUtils.assertHoldsLock(monitorB);
OurThreadUtils.assertHoldsLock(monitorA);
}
}