Skip to content

Commit

Permalink
Merge PR #153: Refactor Handling of Stepping
Browse files Browse the repository at this point in the history
  • Loading branch information
smarr committed May 16, 2017
2 parents c18f788 + b317ca5 commit a2b12d1
Show file tree
Hide file tree
Showing 18 changed files with 228 additions and 590 deletions.
54 changes: 15 additions & 39 deletions src/som/interpreter/actors/EventualSendNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,7 @@
import som.vmobjects.SSymbol;
import tools.concurrency.Tags.EventualMessageSend;
import tools.concurrency.Tags.ExpressionBreakpoint;
import tools.debugger.SteppingStrategy;
import tools.debugger.SteppingStrategy.ReturnFromTurnToPromiseResolution;
import tools.debugger.SteppingStrategy.ToMessageReceiver;
import tools.debugger.SteppingStrategy.ToPromiseResolution;
import tools.debugger.entities.BreakpointType;
import tools.debugger.nodes.AbstractBreakpointNode;
import tools.debugger.session.Breakpoints;

Expand Down Expand Up @@ -139,9 +136,9 @@ protected SendNode(final SSymbol selector, final WrapReferenceNode[] wrapArgs,
this.actorPool = null;
} else {
this.actorPool = vm.getActorPool();
this.messageReceiverBreakpoint = insert(Breakpoints.createReceiver(source, vm));
this.promiseResolverBreakpoint = insert(Breakpoints.createPromiseResolver(source, vm));
this.promiseResolutionBreakpoint = insert(Breakpoints.createPromiseResolution(source, vm));
this.messageReceiverBreakpoint = insert(Breakpoints.create(source, BreakpointType.MSG_RECEIVER, vm));
this.promiseResolverBreakpoint = insert(Breakpoints.create(source, BreakpointType.PROMISE_RESOLVER, vm));
this.promiseResolutionBreakpoint = insert(Breakpoints.create(source, BreakpointType.PROMISE_RESOLUTION, vm));
}
}

Expand Down Expand Up @@ -191,7 +188,8 @@ protected void sendDirectMessage(final Object[] args, final Actor owner,
DirectMessage msg = new DirectMessage(
EventualMessage.getCurrentExecutingMessageId(), target, selector, args,
owner, resolver, onReceive,
hasMessageReceiverBreakpoint(resolver), promiseResolverBreakpoint.executeCheckIsSetAndEnabled());
messageReceiverBreakpoint.executeShouldHalt(),
promiseResolverBreakpoint.executeShouldHalt());

target.send(msg, actorPool);
}
Expand All @@ -203,36 +201,12 @@ protected void sendPromiseMessage(final Object[] args, final SPromise rcvr,
PromiseSendMessage msg = new PromiseSendMessage(
EventualMessage.getCurrentExecutingMessageId(), selector, args,
rcvr.getOwner(), resolver, onReceive,
hasMessageReceiverBreakpoint(resolver), promiseResolverBreakpoint.executeCheckIsSetAndEnabled());
messageReceiverBreakpoint.executeShouldHalt(),
promiseResolverBreakpoint.executeShouldHalt());

registerNode.register(rcvr, msg, rcvr.getOwner());
}

/**
* Check if any stepping strategy has been set and updates the corresponding breakpoint flag.
* If the strategy ToMessageReceiver is active, the flag messageReceiverBreakpoint is updated.
* If the strategy ToPromiseResolution is active, the flag promiseResolutionBreakpoint is updated.
* If the strategy ReturnFromTurnToPromiseResolution is active, the flag triggerStopBeforeExecuteCallback
* of the promise of the causal message is updated.
* Returns the flag of the message receiver breakpoint.
*/
private boolean hasMessageReceiverBreakpoint(final SResolver resolver) {
boolean stepReceiver = SteppingStrategy.isEnabled(ToMessageReceiver.class);
boolean stepResolution = SteppingStrategy.isEnabled(ToPromiseResolution.class);
boolean stepReturnFromTurn = SteppingStrategy.isEnabled(ReturnFromTurnToPromiseResolution.class);

boolean msgRcvrBkp = messageReceiverBreakpoint.executeCheckIsSetAndEnabled() || stepReceiver;
if (resolver != null && !resolver.getPromise().isTriggerPromiseResolutionBreakpoint() && stepResolution) {
resolver.getPromise().setTriggerPromiseResolutionBreakpoint(stepResolution);
}
EventualMessage causalMsg = EventualMessage.getCurrentExecutingMessage();
if (causalMsg.getResolver() != null && stepReturnFromTurn) {
causalMsg.getResolver().getPromise().setTriggerStopBeforeExecuteCallback(stepReturnFromTurn);
}

return msgRcvrBkp;
}

protected RegisterWhenResolved createRegisterNode() {
return new RegisterWhenResolved(actorPool);
}
Expand All @@ -246,7 +220,7 @@ public String toString() {
public final SPromise toFarRefWithResultPromise(final Object[] args) {
Actor owner = EventualMessage.getActorCurrentMessageIsExecutionOn();

SPromise result = SPromise.createPromise(owner, promiseResolutionBreakpoint.executeCheckIsSetAndEnabled(), false, false);
SPromise result = SPromise.createPromise(owner, promiseResolutionBreakpoint.executeShouldHalt(), false, false);
SResolver resolver = SPromise.createResolver(result);

sendDirectMessage(args, owner, resolver);
Expand All @@ -258,7 +232,7 @@ public final SPromise toFarRefWithResultPromise(final Object[] args) {
public final SPromise toPromiseWithResultPromise(final Object[] args,
@Cached("createRegisterNode()") final RegisterWhenResolved registerNode) {
SPromise rcvr = (SPromise) args[0];
SPromise promise = SPromise.createPromise(EventualMessage.getActorCurrentMessageIsExecutionOn(), promiseResolutionBreakpoint.executeCheckIsSetAndEnabled(), false, false);
SPromise promise = SPromise.createPromise(EventualMessage.getActorCurrentMessageIsExecutionOn(), promiseResolutionBreakpoint.executeShouldHalt(), false, false);
SResolver resolver = SPromise.createResolver(promise);

sendPromiseMessage(args, rcvr, resolver, registerNode);
Expand All @@ -269,13 +243,14 @@ public final SPromise toPromiseWithResultPromise(final Object[] args,
public final SPromise toNearRefWithResultPromise(final Object[] args) {
Actor current = EventualMessage.getActorCurrentMessageIsExecutionOn();

SPromise result = SPromise.createPromise(current, promiseResolutionBreakpoint.executeCheckIsSetAndEnabled(), false, false);
SPromise result = SPromise.createPromise(current, promiseResolutionBreakpoint.executeShouldHalt(), false, false);
SResolver resolver = SPromise.createResolver(result);

DirectMessage msg = new DirectMessage(EventualMessage.getCurrentExecutingMessageId(),
current, selector, args, current,
resolver, onReceive,
hasMessageReceiverBreakpoint(resolver), promiseResolverBreakpoint.executeCheckIsSetAndEnabled());
messageReceiverBreakpoint.executeShouldHalt(),
promiseResolverBreakpoint.executeShouldHalt());

current.send(msg, actorPool);

Expand Down Expand Up @@ -305,7 +280,8 @@ public final Object toNearRefWithoutResultPromise(final Object[] args) {
DirectMessage msg = new DirectMessage(EventualMessage.getCurrentExecutingMessageId(),
current, selector, args, current,
null, onReceive,
hasMessageReceiverBreakpoint(null), promiseResolverBreakpoint.executeCheckIsSetAndEnabled());
messageReceiverBreakpoint.executeShouldHalt(),
promiseResolverBreakpoint.executeShouldHalt());

current.send(msg, actorPool);
return Nil.nilObject;
Expand Down
31 changes: 1 addition & 30 deletions src/som/interpreter/actors/SPromise.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,6 @@
import som.vmobjects.SObjectWithClass;
import tools.concurrency.ActorExecutionTrace;
import tools.concurrency.TracingActivityThread;
import tools.debugger.SteppingStrategy;
import tools.debugger.SteppingStrategy.ReturnFromTurnToPromiseResolution;
import tools.debugger.SteppingStrategy.ToPromiseResolution;
import tools.debugger.nodes.AbstractBreakpointNode;


public class SPromise extends SObjectWithClass {
Expand Down Expand Up @@ -71,7 +67,7 @@ public static SPromise createPromise(final Actor owner,
* Indicates the case when a promise (implicit or explicit) has a promise
* resolution breakpoint.
*/
private boolean triggerPromiseResolutionBreakpoint;
private final boolean triggerPromiseResolutionBreakpoint;
/**
* Indicates the case when the promise is created explicitly with
* createPromisePair primitive, because there is no EventualMessage created
Expand Down Expand Up @@ -499,10 +495,6 @@ boolean isTriggerExplicitPromiseResolverBreakpoint() {
return triggerExplicitPromiseResolverBreakpoint;
}

public void setTriggerPromiseResolutionBreakpoint(final boolean triggerPromiseResolutionBreakpoint) {
this.triggerPromiseResolutionBreakpoint = triggerPromiseResolutionBreakpoint;
}

public void setTriggerStopBeforeExecuteCallback(
final boolean triggerStopBeforeExecuteCallback) {
this.triggerStopBeforeExecuteCallback = triggerStopBeforeExecuteCallback;
Expand All @@ -511,25 +503,4 @@ public void setTriggerStopBeforeExecuteCallback(
public boolean isTriggerStopBeforeExecuteCallback() {
return triggerStopBeforeExecuteCallback;
}

/**
* Checks if any stepping strategy has been set and updates the corresponding breakpoint flag.
* If the strategy ToPromiseResolution is active, the flag promiseResolutionBreakpoint is updated.
* If the strategy ReturnFromTurnToPromiseResolution is active, the flag triggerStopBeforeExecuteCallback
* of the promise of the causal message is updated.
* Returns the flag of the promise resolution breakpoint.
*/
public static boolean hasPromiseResolutionBreakpoint(final AbstractBreakpointNode promiseResolutionBreakpoint) {
boolean stepResolution = SteppingStrategy.isEnabled(ToPromiseResolution.class);
boolean promiseResolutionBkp = promiseResolutionBreakpoint.executeCheckIsSetAndEnabled() || stepResolution;

boolean stepReturnFromTurn = SteppingStrategy.isEnabled(ReturnFromTurnToPromiseResolution.class);
EventualMessage causalMsg = EventualMessage.getCurrentExecutingMessage();
if (causalMsg.getResolver() != null && stepReturnFromTurn) {
causalMsg.getResolver().getPromise().setTriggerStopBeforeExecuteCallback(stepReturnFromTurn);
}

return promiseResolutionBkp;
}

}
32 changes: 10 additions & 22 deletions src/som/primitives/ActivitySpawn.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import som.primitives.threading.TaskThreads.TracedForkJoinTask;
import som.primitives.threading.TaskThreads.TracedThreadTask;
import som.primitives.threading.ThreadingModule;
import som.vm.ActivityThread;
import som.vm.VmSettings;
import som.vm.constants.KernelObj;
import som.vm.constants.Nil;
Expand All @@ -39,10 +38,11 @@
import tools.concurrency.ActorExecutionTrace;
import tools.concurrency.Tags.ActivityCreation;
import tools.concurrency.Tags.ExpressionBreakpoint;
import tools.debugger.SteppingStrategy;
import tools.debugger.entities.BreakpointType;
import tools.debugger.nodes.AbstractBreakpointNode;
import tools.debugger.session.Breakpoints;


public abstract class ActivitySpawn {

private static SomForkJoinTask createTask(final Object[] argArray,
Expand Down Expand Up @@ -84,18 +84,6 @@ public static IsValue createIsValue() {
return IsValue.createSubNode();
}

public static boolean stopOnRoot() {
if (VmSettings.TRUFFLE_DEBUGGER_ENABLED) {
SteppingStrategy strategy = ActivityThread.steppingStrategy();
if (strategy == null) {
return false;
}
return strategy.handleSpawn();
} else {
return false;
}
}

@GenerateNodeFactory
@ImportStatic({ThreadingModule.class, ChannelPrimitives.class, ActivitySpawn.class})
@Primitive(primitive = "threading:threadSpawn:", requiresContext = true)
Expand All @@ -114,22 +102,22 @@ public SpawnPrim(final boolean ew, final SourceSection s, final VM vm) {
this.forkJoinPool = vm.getForkJoinPool();
this.processesPool = vm.getProcessPool();
this.threadPool = vm.getThreadPool();
this.onExec = insert(Breakpoints.createOnExec(s, vm));
this.onExec = insert(Breakpoints.create(s, BreakpointType.ACTIVITY_ON_EXEC, vm));
}

@Specialization(guards = "clazz == TaskClass")
@TruffleBoundary
public final SomForkJoinTask spawnTask(final SClass clazz, final SBlock block) {
SomForkJoinTask task = createTask(new Object[] {block},
onExec.executeCheckIsSetAndEnabled() || stopOnRoot(), block, sourceSection);
onExec.executeShouldHalt(), block, sourceSection);
forkJoinPool.execute(task);
return task;
}

@Specialization(guards = "clazz == ThreadClass")
public final SomThreadTask spawnThread(final SClass clazz, final SBlock block) {
SomThreadTask thread = createThread(new Object[] {block},
onExec.executeCheckIsSetAndEnabled() || stopOnRoot(), block, sourceSection);
onExec.executeShouldHalt(), block, sourceSection);
threadPool.execute(thread);
return thread;
}
Expand All @@ -147,7 +135,7 @@ public final Object spawnProcess(final SImmutableObject procMod,
SObjectWithClass obj = (SObjectWithClass) disp.invoke(new Object[] {procCls});

processesPool.submit(createProcess(obj, sourceSection,
onExec.executeCheckIsSetAndEnabled() || stopOnRoot()));
onExec.executeShouldHalt()));
return Nil.nilObject;
}

Expand Down Expand Up @@ -187,14 +175,14 @@ public SpawnWithPrim(final boolean ew, final SourceSection s, final VM vm) {
this.forkJoinPool = vm.getForkJoinPool();
this.processesPool = vm.getProcessPool();
this.threadPool = vm.getThreadPool();
this.onExec = insert(Breakpoints.createOnExec(s, vm));
this.onExec = insert(Breakpoints.create(s, BreakpointType.ACTIVITY_ON_EXEC, vm));
}

@Specialization(guards = "clazz == TaskClass")
public SomForkJoinTask spawnTask(final SClass clazz, final SBlock block,
final SArray somArgArr, final Object[] argArr) {
SomForkJoinTask task = createTask(argArr,
onExec.executeCheckIsSetAndEnabled() || stopOnRoot(), block, sourceSection);
onExec.executeShouldHalt(), block, sourceSection);
forkJoinPool.execute(task);
return task;
}
Expand All @@ -203,7 +191,7 @@ public SomForkJoinTask spawnTask(final SClass clazz, final SBlock block,
public SomThreadTask spawnThread(final SClass clazz, final SBlock block,
final SArray somArgArr, final Object[] argArr) {
SomThreadTask thread = createThread(argArr,
onExec.executeCheckIsSetAndEnabled() || stopOnRoot(), block, sourceSection);
onExec.executeShouldHalt(), block, sourceSection);
threadPool.execute(thread);
return thread;
}
Expand All @@ -222,7 +210,7 @@ public final Object spawnProcess(final SImmutableObject procMod,
SObjectWithClass obj = (SObjectWithClass) disp.invoke(argArr);

processesPool.submit(createProcess(obj, sourceSection,
onExec.executeCheckIsSetAndEnabled() || stopOnRoot()));
onExec.executeShouldHalt()));
return Nil.nilObject;
}

Expand Down
Loading

0 comments on commit a2b12d1

Please sign in to comment.