From 35c908d4bec532a085ad765401c95604c6aa1f38 Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Tue, 15 Jan 2019 20:27:08 +0000 Subject: [PATCH] For blocking primitives, do not participate in safepoints Signed-off-by: Stefan Marr --- src/som/interpreter/processes/SChannel.java | 15 +++++++++++++-- src/som/primitives/ActivityJoin.java | 8 +++++++- .../primitives/threading/ConditionPrimitives.java | 15 ++++++++++++--- src/som/primitives/threading/DelayPrimitives.java | 3 +++ src/som/primitives/threading/MutexPrimitives.java | 8 +++++++- 5 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/som/interpreter/processes/SChannel.java b/src/som/interpreter/processes/SChannel.java index 4e34ffe23..90f1a4bca 100644 --- a/src/som/interpreter/processes/SChannel.java +++ b/src/som/interpreter/processes/SChannel.java @@ -4,6 +4,7 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import som.interpreter.objectstorage.ObjectTransitionSafepoint; import som.primitives.processes.ChannelPrimitives; import som.vm.VmSettings; import som.vmobjects.SAbstractObject; @@ -78,7 +79,12 @@ public SChannelInput(final SynchronousQueue cell, @TruffleBoundary public Object read() throws InterruptedException { - return cell.take(); + ObjectTransitionSafepoint.INSTANCE.unregister(); + try { + return cell.take(); + } finally { + ObjectTransitionSafepoint.INSTANCE.register(); + } } public final Object readAndSuspendWriter(final boolean doSuspend) @@ -123,7 +129,12 @@ protected SChannelOutput(final SynchronousQueue cell, final SChannel cha @TruffleBoundary public void write(final Object value) throws InterruptedException { - cell.put(value); + ObjectTransitionSafepoint.INSTANCE.unregister(); + try { + cell.put(value); + } finally { + ObjectTransitionSafepoint.INSTANCE.register(); + } } public final void writeAndSuspendReader(final Object value, diff --git a/src/som/primitives/ActivityJoin.java b/src/som/primitives/ActivityJoin.java index be8ef299c..2c8394f58 100644 --- a/src/som/primitives/ActivityJoin.java +++ b/src/som/primitives/ActivityJoin.java @@ -10,6 +10,7 @@ import bd.primitives.Primitive; import som.interpreter.actors.SuspendExecutionNodeGen; import som.interpreter.nodes.nary.UnaryExpressionNode; +import som.interpreter.objectstorage.ObjectTransitionSafepoint; import som.primitives.threading.TaskThreads.SomTaskOrThread; import som.vm.VmSettings; import tools.concurrency.KomposTrace; @@ -38,7 +39,12 @@ public final JoinPrim initialize(final SourceSection source) { @TruffleBoundary private static Object doJoin(final SomTaskOrThread task) { - return task.join(); + try { + ObjectTransitionSafepoint.INSTANCE.unregister(); + return task.join(); + } finally { + ObjectTransitionSafepoint.INSTANCE.register(); + } } @Specialization diff --git a/src/som/primitives/threading/ConditionPrimitives.java b/src/som/primitives/threading/ConditionPrimitives.java index be32c3d1c..5af267127 100644 --- a/src/som/primitives/threading/ConditionPrimitives.java +++ b/src/som/primitives/threading/ConditionPrimitives.java @@ -10,6 +10,7 @@ import bd.primitives.Primitive; import som.interpreter.nodes.nary.BinaryExpressionNode; import som.interpreter.nodes.nary.UnaryExpressionNode; +import som.interpreter.objectstorage.ObjectTransitionSafepoint; public final class ConditionPrimitives { @@ -42,10 +43,13 @@ public abstract static class AwaitPrim extends UnaryExpressionNode { @TruffleBoundary public final Condition doCondition(final Condition cond) { try { + ObjectTransitionSafepoint.INSTANCE.unregister(); cond.await(); } catch (InterruptedException e) { /* doesn't tell us a lot at the moment, so it is ignored */ } + + ObjectTransitionSafepoint.INSTANCE.register(); return cond; } } @@ -57,9 +61,14 @@ public abstract static class AwaitForPrim extends BinaryExpressionNode { @TruffleBoundary public final boolean doCondition(final Condition cond, final long milliseconds) { try { - return cond.await(milliseconds, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - return false; + ObjectTransitionSafepoint.INSTANCE.unregister(); + try { + return cond.await(milliseconds, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + return false; + } + } finally { + ObjectTransitionSafepoint.INSTANCE.register(); } } } diff --git a/src/som/primitives/threading/DelayPrimitives.java b/src/som/primitives/threading/DelayPrimitives.java index 6537ee68e..4d5ffbf56 100644 --- a/src/som/primitives/threading/DelayPrimitives.java +++ b/src/som/primitives/threading/DelayPrimitives.java @@ -6,6 +6,7 @@ import bd.primitives.Primitive; import som.interpreter.nodes.nary.UnaryExpressionNode; +import som.interpreter.objectstorage.ObjectTransitionSafepoint; import som.vm.constants.Nil; import som.vmobjects.SObjectWithClass.SObjectWithoutFields; @@ -18,10 +19,12 @@ public abstract static class WaitPrim extends UnaryExpressionNode { @TruffleBoundary public final SObjectWithoutFields doLong(final long milliseconds) { try { + ObjectTransitionSafepoint.INSTANCE.unregister(); Thread.sleep(milliseconds); } catch (InterruptedException e) { /* Not relevant for the moment */ } + ObjectTransitionSafepoint.INSTANCE.register(); return Nil.nilObject; } } diff --git a/src/som/primitives/threading/MutexPrimitives.java b/src/som/primitives/threading/MutexPrimitives.java index a4c05dd9d..5a80e4f6a 100644 --- a/src/som/primitives/threading/MutexPrimitives.java +++ b/src/som/primitives/threading/MutexPrimitives.java @@ -13,6 +13,7 @@ import som.interpreter.nodes.dispatch.BlockDispatchNodeGen; import som.interpreter.nodes.nary.BinaryExpressionNode; import som.interpreter.nodes.nary.UnaryExpressionNode; +import som.interpreter.objectstorage.ObjectTransitionSafepoint; import som.vmobjects.SBlock; import som.vmobjects.SClass; import tools.concurrency.Tags.AcquireLock; @@ -27,7 +28,12 @@ public abstract static class LockPrim extends UnaryExpressionNode { @TruffleBoundary @Specialization public static final ReentrantLock lock(final ReentrantLock lock) { - lock.lock(); + try { + ObjectTransitionSafepoint.INSTANCE.unregister(); + lock.lock(); + } finally { + ObjectTransitionSafepoint.INSTANCE.register(); + } return lock; }