diff --git a/truffle/src/main/java/org/jruby/truffle/runtime/subsystems/SafepointManager.java b/truffle/src/main/java/org/jruby/truffle/runtime/subsystems/SafepointManager.java index 0c02c47cb9a..7e545808e00 100644 --- a/truffle/src/main/java/org/jruby/truffle/runtime/subsystems/SafepointManager.java +++ b/truffle/src/main/java/org/jruby/truffle/runtime/subsystems/SafepointManager.java @@ -59,6 +59,10 @@ public void poll() { poll(true); } + public void pollWithoutGlobalLock() { + poll(false); + } + private void poll(boolean holdsGlobalLock) { try { assumption.check(); diff --git a/truffle/src/main/java/org/jruby/truffle/runtime/subsystems/ThreadManager.java b/truffle/src/main/java/org/jruby/truffle/runtime/subsystems/ThreadManager.java index 2adfb3e4a5a..17aac303096 100644 --- a/truffle/src/main/java/org/jruby/truffle/runtime/subsystems/ThreadManager.java +++ b/truffle/src/main/java/org/jruby/truffle/runtime/subsystems/ThreadManager.java @@ -112,21 +112,20 @@ public T runUntilResult(BlockingActionWithoutGlobalLock action) { @CompilerDirectives.TruffleBoundary public T runOnce(BlockingActionWithoutGlobalLock action) { T result = null; + final RubyThread runningThread = leaveGlobalLock(); - runningThread.setStatus(Status.SLEEP); try { - try { - result = action.block(); - } finally { - runningThread.setStatus(Status.RUN); - // We need to enter the global lock before anything else! - enterGlobalLock(runningThread); - } + runningThread.setStatus(Status.SLEEP); + result = action.block(); } catch (InterruptedException e) { // We were interrupted, possibly by the SafepointManager. - context.getSafepointManager().poll(); + context.getSafepointManager().pollWithoutGlobalLock(); + } finally { + runningThread.setStatus(Status.RUN); + enterGlobalLock(runningThread); } + return result; }