diff --git a/core/src/main/kotlin/org/pastalab/fray/core/concurrency/Sync.kt b/core/src/main/kotlin/org/pastalab/fray/core/concurrency/Sync.kt index bfd0d00..6b6416a 100644 --- a/core/src/main/kotlin/org/pastalab/fray/core/concurrency/Sync.kt +++ b/core/src/main/kotlin/org/pastalab/fray/core/concurrency/Sync.kt @@ -16,6 +16,7 @@ class Sync(val goal: Int) : Any() { return } isBlocked = true + val threadInterrupted = Thread.currentThread().isInterrupted // We don't need synchronized here because // it is already inside a synchronized method while (count < goal) { @@ -30,6 +31,9 @@ class Sync(val goal: Int) : Any() { // At this point no concurrency. count = 0 signaler.clear() + if (threadInterrupted) { + Thread.currentThread().interrupt() + } } @Synchronized diff --git a/integration-test/src/main/java/org/pastalab/fray/test/success/cdl/CountDownLatchAwaitTimeoutNoDeadlock.java b/integration-test/src/main/java/org/pastalab/fray/test/success/cdl/CountDownLatchAwaitTimeoutNoDeadlock.java index 374b5f4..dc50738 100644 --- a/integration-test/src/main/java/org/pastalab/fray/test/success/cdl/CountDownLatchAwaitTimeoutNoDeadlock.java +++ b/integration-test/src/main/java/org/pastalab/fray/test/success/cdl/CountDownLatchAwaitTimeoutNoDeadlock.java @@ -3,10 +3,22 @@ import java.util.concurrent.CountDownLatch; public class CountDownLatchAwaitTimeoutNoDeadlock { - public static void main(String[] args) { + public static void main(String[] args) throws InterruptedException { CountDownLatch cdl = new CountDownLatch(1); + Thread t = new Thread(() -> { + try { + cdl.await(1000, java.util.concurrent.TimeUnit.MILLISECONDS); + cdl.await(1000, java.util.concurrent.TimeUnit.MILLISECONDS); + cdl.await(1000, java.util.concurrent.TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); + t.start(); try { cdl.await(1000, java.util.concurrent.TimeUnit.MILLISECONDS); + cdl.await(1000, java.util.concurrent.TimeUnit.MILLISECONDS); + cdl.await(1000, java.util.concurrent.TimeUnit.MILLISECONDS); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/integration-test/src/main/java/org/pastalab/fray/test/success/condition/ConditionAwaitTimeoutNotifyInterrupt.java b/integration-test/src/main/java/org/pastalab/fray/test/success/condition/ConditionAwaitTimeoutNotifyInterrupt.java index 3a55641..09131ac 100644 --- a/integration-test/src/main/java/org/pastalab/fray/test/success/condition/ConditionAwaitTimeoutNotifyInterrupt.java +++ b/integration-test/src/main/java/org/pastalab/fray/test/success/condition/ConditionAwaitTimeoutNotifyInterrupt.java @@ -5,6 +5,7 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; + public class ConditionAwaitTimeoutNotifyInterrupt { public static void main(String[] args) { Lock l = new ReentrantLock(); diff --git a/integration-test/src/test/java/org/pastalab/fray/test/FrayTestCase.java b/integration-test/src/test/java/org/pastalab/fray/test/FrayTestCase.java index 5785aea..71c42e9 100644 --- a/integration-test/src/test/java/org/pastalab/fray/test/FrayTestCase.java +++ b/integration-test/src/test/java/org/pastalab/fray/test/FrayTestCase.java @@ -16,6 +16,7 @@ import org.pastalab.fray.core.scheduler.POSScheduler; import org.pastalab.fray.core.scheduler.RandomScheduler; import org.pastalab.fray.runtime.TargetTerminateException; +import org.pastalab.fray.test.success.cdl.CountDownLatchAwaitTimeoutNoDeadlock; import org.pastalab.fray.test.success.cdl.CountDownLatchNormalNotify; import org.pastalab.fray.test.success.condition.ConditionAwaitTimeoutInterrupt; import org.pastalab.fray.test.success.condition.ConditionAwaitTimeoutNotifyInterrupt; @@ -73,7 +74,7 @@ public void testOne() throws Throwable { new ExecutionInfo( new LambdaExecutor(() -> { try { - ReentrantLockTryLock.main(new String[]{}); + CountDownLatchAwaitTimeoutNoDeadlock.main(new String[]{}); } catch (InterruptedException e) { throw new RuntimeException(e); }