Skip to content

Commit

Permalink
restructuring
Browse files Browse the repository at this point in the history
  • Loading branch information
daumayr committed Mar 20, 2017
1 parent 8189dec commit 7e5c68b
Show file tree
Hide file tree
Showing 8 changed files with 150 additions and 213 deletions.
98 changes: 2 additions & 96 deletions src/som/interpreter/actors/Actor.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package som.interpreter.actors;

import java.lang.Thread.UncaughtExceptionHandler;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory;
Expand All @@ -14,22 +11,18 @@
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;

import som.VM;
import som.interpreter.SArguments;
import som.interpreter.objectstorage.ObjectTransitionSafepoint;
import som.primitives.ObjectPrims.IsValue;
import som.vm.Activity;
import som.vm.ActivityThread;
import som.vm.VmSettings;
import som.vmobjects.SAbstractObject;
import som.vmobjects.SArray.STransferArray;
import som.vmobjects.SBlock;
import som.vmobjects.SObject;
import som.vmobjects.SObjectWithClass.SObjectWithoutFields;
import som.vmobjects.SSymbol;
import tools.ObjectBuffer;
import tools.TraceData;
import tools.concurrency.ActorExecutionTrace;
import tools.concurrency.Assertion;
import tools.concurrency.TracingActivityThread;
import tools.concurrency.TracingActors.ReplayActor;
import tools.concurrency.TracingActors.TracingActor;
Expand Down Expand Up @@ -84,8 +77,6 @@ public static Actor createActor() {
/** Is scheduled on the pool, and executes messages to this actor. */
protected final ExecAllMessages executor;

private SSymbol actorType = null;

// used to collect absolute numbers from the threads
private static Object statsLock = new Object();
private static long numCreatedMessages = 0;
Expand All @@ -94,9 +85,6 @@ public static Actor createActor() {
private static long numResolvedPromises = 0;
private static long numRuinedPromises = 0;

private List<Assertion> activeAssertions;
private HashMap<SSymbol, SBlock> sendHooks;
private HashMap<SSymbol, SBlock> receiveHooks;
/**
* Possible roles for an actor.
*/
Expand Down Expand Up @@ -199,88 +187,6 @@ protected static void handleBreakPoints(final EventualMessage msg, final WebDebu
dbg.prepareSteppingUntilNextRootNode();
}
}
public void addAssertion(final Assertion a) {
if (activeAssertions == null) {
activeAssertions = new ArrayList<>();
}
activeAssertions.add(a);
}

@TruffleBoundary
public void addSendHook(final SSymbol msg, final SBlock block) {
if (sendHooks == null) {
sendHooks = new HashMap<>();
}
sendHooks.put(msg, block);
}

@TruffleBoundary
public void addReceiveHook(final SSymbol msg, final SBlock block) {
if (receiveHooks == null) {
receiveHooks = new HashMap<>();
}
receiveHooks.put(msg, block);
}

public SSymbol getActorType() {
return actorType;
}

public void setActorType(final SSymbol actorType) {
this.actorType = actorType;
}

private void checkAssertions(final EventualMessage msg) {
if (activeAssertions == null || activeAssertions.size() == 0) {
return;
}

List<Assertion> temp = activeAssertions;

activeAssertions = new ArrayList<>();


for (Assertion a : temp) {
a.evaluate(this, msg);
}
}

@TruffleBoundary
public void checkSendHooks(final EventualMessage msg) {
if (sendHooks != null) {
if (sendHooks.containsKey(msg.getSelector())) {
SBlock block = sendHooks.get(msg.getSelector());
sendHooks.clear();
if (receiveHooks != null) {
receiveHooks.clear();
}

if (block.getMethod().getNumberOfArguments() > 0) {
block.getMethod().invoke(new Object[] {block, SArguments.getArgumentsWithoutReceiver(msg.getArgs())});
} else {
block.getMethod().invoke(new Object[] {block});
}
} else if (sendHooks.size() > 0) {
throw new AssertionError("sending Message: " + msg.getSelector() + " violates the message protocol!");
}
}
}

@TruffleBoundary
private void checkReceiveHooks(final EventualMessage msg) {
if (receiveHooks != null) {
if (receiveHooks.containsKey(msg.getSelector())) {
SBlock block = receiveHooks.get(msg.getSelector());
receiveHooks.clear();
if (sendHooks != null) {
sendHooks.clear();
}
block.getMethod().invoke(new Object[] {block, SArguments.getArgumentsWithoutReceiver(msg.getArgs())});
} else if (receiveHooks.size() > 0) {
throw new AssertionError("receiving Message: " + msg.getSelector() + " violates the message protocol!");
}
}
}

/**
* Is scheduled on the fork/join pool and executes messages for a specific
Expand Down Expand Up @@ -356,8 +262,8 @@ private void execute(final EventualMessage msg,
currentThread.currentMessage = msg;
handleBreakPoints(msg, dbg);
if (VmSettings.ENABLE_ASSERTIONS) {
actor.checkReceiveHooks(msg);
actor.checkAssertions(msg);
((TracingActor) actor).checkReceiveHooks(msg);
((TracingActor) actor).checkAssertions(msg);
}

if (i >= 0 && VmSettings.MESSAGE_TIMESTAMPS) {
Expand Down
17 changes: 13 additions & 4 deletions src/som/interpreter/actors/EventualSendNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import tools.SourceCoordinate.FullSourceCoordinate;
import tools.concurrency.Tags.EventualMessageSend;
import tools.concurrency.Tags.ExpressionBreakpoint;
import tools.concurrency.TracingActors.TracingActor;
import tools.debugger.nodes.AbstractBreakpointNode;
import tools.debugger.nodes.BreakpointNodeGen;
import tools.debugger.nodes.DisabledBreakpointNode;
Expand Down Expand Up @@ -193,7 +194,9 @@ protected void sendDirectMessage(final Object[] args, final Actor owner,
messageReceiverBreakpoint.executeCheckIsSetAndEnabled(),
promiseResolverBreakpoint.executeCheckIsSetAndEnabled(),
promiseResolutionBreakpoint.executeCheckIsSetAndEnabled());
owner.checkSendHooks(msg);
if (VmSettings.ENABLE_ASSERTIONS) {
((TracingActor) owner).checkSendHooks(msg);
}
target.send(msg);
}

Expand All @@ -207,7 +210,9 @@ protected void sendPromiseMessage(final Object[] args, final SPromise rcvr,
messageReceiverBreakpoint.executeCheckIsSetAndEnabled(),
promiseResolverBreakpoint.executeCheckIsSetAndEnabled(),
promiseResolutionBreakpoint.executeCheckIsSetAndEnabled());
EventualMessage.getActorCurrentMessageIsExecutionOn().checkSendHooks(msg);
if (VmSettings.ENABLE_ASSERTIONS) {
((TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn()).checkSendHooks(msg);
}
registerNode.register(rcvr, msg, rcvr.getOwner());
}

Expand Down Expand Up @@ -255,7 +260,9 @@ public final SPromise toNearRefWithResultPromise(final Object[] args) {
messageReceiverBreakpoint.executeCheckIsSetAndEnabled(),
promiseResolverBreakpoint.executeCheckIsSetAndEnabled(),
promiseResolutionBreakpoint.executeCheckIsSetAndEnabled());
current.checkSendHooks(msg);
if (VmSettings.ENABLE_ASSERTIONS) {
((TracingActor) current).checkSendHooks(msg);
}
current.send(msg);

return result;
Expand Down Expand Up @@ -287,7 +294,9 @@ public final Object toNearRefWithoutResultPromise(final Object[] args) {
messageReceiverBreakpoint.executeCheckIsSetAndEnabled(),
promiseResolverBreakpoint.executeCheckIsSetAndEnabled(),
promiseResolutionBreakpoint.executeCheckIsSetAndEnabled());
current.checkSendHooks(msg);
if (VmSettings.ENABLE_ASSERTIONS) {
((TracingActor) current).checkSendHooks(msg);
}
current.send(msg);
return Nil.nilObject;
}
Expand Down
2 changes: 1 addition & 1 deletion src/som/interpreter/actors/SPromise.java
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public final boolean isValue() {
return false;
}

public boolean isResultUsed(){
public boolean isResultUsed() {
return resultUsed;
}

Expand Down
Loading

0 comments on commit 7e5c68b

Please sign in to comment.