Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Promise breakpoint #58

Merged
merged 2 commits into from
Nov 24, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 0 additions & 1 deletion .classpath
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
<classpathentry combineaccessrules="false" kind="src" path="/com.oracle.truffle.api.profiles"/>
<classpathentry kind="src" path="/com.oracle.truffle.tools"/>
<classpathentry kind="src" path="/com.oracle.truffle.tools.debug.shell"/>
<classpathentry kind="src" path="/CoverallsTruffle"/>
<classpathentry kind="lib" path="libs/somns-deps-dev.jar"/>
<classpathentry kind="lib" path="libs/somns-deps.jar"/>
<classpathentry kind="output" path="build/classes"/>
Expand Down
46 changes: 23 additions & 23 deletions core-lib/Actors.som
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*)
class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
| private vmMirror = vmMirror.
| private vmMirror = vmMirror.
private Exception = kernel Exception.
private Vector = kernel Vector.
|
Expand All @@ -28,7 +28,7 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
vmMirror actorsFarReferenceClass: FarReference.
vmMirror actorsPromiseClass: Promise.
vmMirror actorsPairClass: Pair.
vmMirror actorsResolverClass: Resolver.
vmMirror actorsResolverClass: Resolver.
vmMirror actorsModule: self.
)(
public class FarReference = Value (
Expand Down Expand Up @@ -61,33 +61,33 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
public class Promise = Object ()(
(* all whenResolved blocks are executed. *)
public whenResolved: aBlock = ( ^ vmMirror actorsWhen: self resolved: aBlock )

(* all ensure blocks are executed. *)
public ensure: aBlock = ( whenResolved: aBlock. onError: aBlock. )

(* all onError blocks are executed. *)
public onError: errorBlock = ( ^ vmMirror actorsFor: self onError: errorBlock )

public whenResolved: aBlock onError: errorBlock = (
^ vmMirror actorsWhen: self resolved: aBlock onError: errorBlock
)

(* similar to exception handlers, only the first matching on:do: is executed.
registration order determines search order.
This seems to be also what the Bluebird JS lib is doing. *)
public on: exception do: errorBlock = (
vmMirror actorsFor: self on: exception do: errorBlock
)

public , other = (
^ (PromiseGroup for: self), other.
)
)

public class Resolver = Value ()( (* Object or Value? *)
public resolve: value = ( vmMirror actorsResolve: self with: value )
public resolve: value = ( vmMirror actorsResolve: self with: value isBPResolver: false isBPResolution: false)
public error: value = ( self notYetImplemented )
)
)

class Pair with: promise and: resolver = (
(* A promise Pair is useful for explicitly creating dependencies between
Expand Down Expand Up @@ -120,14 +120,14 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
public on: exception do: errorBlock = (
^ all on: exception do: errorBlock
)

all = (
(lazyAll == nil) ifTrue: [
| promisePair counter results |
counter := 0.
promisePair := createPromisePair.
results := Vector new.

do: [ :p |
counter := counter + 1.
p whenResolved: [:r |
Expand All @@ -141,7 +141,7 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
].
^ lazyAll
)

do: block = (
| it |
it := self.
Expand All @@ -165,7 +165,7 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
)

(* Can't be part of kernel, don't have promises in the kernel... *)
private async: collection do: aBlock next: i prevPromise: prev
private async: collection do: aBlock next: i prevPromise: prev
completionResolver: resolver = (
prev whenResolved: [:res |
i <= collection size
Expand All @@ -176,7 +176,7 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
ifFalse: [
resolver resolve: collection ] ]
)

(* Iteration is done sequential but asynchronous. *)
public async: collection do: aBlockReturningAPromise = (
| promisePair |
Expand All @@ -189,12 +189,12 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
async: collection
do: aBlockReturningAPromise
next: 2
prevPromise: first
prevPromise: first
completionResolver: promisePair resolver.
] ifFalse: [
promisePair resolve: collection.
].

^ promisePair promise.
)

Expand All @@ -218,21 +218,21 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
public async: intStart to: intEnd do: aBlockReturningAPromise = (
| promisePair |
promisePair := createPromisePair.

intStart <= intEnd ifTrue: [
| first |
first := aBlockReturningAPromise value: intStart.

async: intStart + 1 to: intEnd
do: aBlockReturningAPromise
do: aBlockReturningAPromise
prevPromise: first
completionResolver: promisePair resolver.
] ifFalse: [
promisePair resolve: intStart
].
^ promisePair promise
)

private async: conditionBlock whileTrue: bodyBlockReturningAPromise prevPromise: prev completionResolver: resolver = (
prev whenResolved: [:res |
conditionBlock value ifTrue: [
Expand All @@ -244,16 +244,16 @@ class Actors usingVmMirror: vmMirror usingKernel: kernel = Value (
]
]
)

public async: conditionBlock whileTrue: bodyBlockReturningAPromise = (
| promisePair |
promisePair := createPromisePair.

conditionBlock value ifTrue: [
| prevPromise |
prevPromise := bodyBlockReturningAPromise value.
async: conditionBlock
whileTrue: bodyBlockReturningAPromise
whileTrue: bodyBlockReturningAPromise
prevPromise: prevPromise
completionResolver: promisePair resolver
] ifFalse: [
Expand Down
50 changes: 38 additions & 12 deletions src/som/interpreter/actors/EventualMessage.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,25 @@ public abstract class EventualMessage {
protected final RootCallTarget onReceive;
protected final EventualMessage causalMessage;

protected final boolean triggerRcvrBreakpoint;
/**
* It is not final because its value can be updated in order that other breakpoints
* can reuse the stepping strategy implemented for message receiver breakpoints.
*/
protected boolean triggerMessageReceiverBreakpoint;
protected final boolean triggerPromiseResolverBreakpoint;
protected final boolean triggerPromiseResolutionBreakpoint;

protected EventualMessage(final EventualMessage causalMessage, final Object[] args,
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerRcvrBreakpoint) {
final SResolver resolver, final RootCallTarget onReceive,
final boolean triggerMessageReceiverBreakpoint, final boolean triggerPromiseResolverBreakpoint,
final boolean triggerPromiseResolutionBreakpoint) {
this.causalMessage = causalMessage;
this.args = args;
this.resolver = resolver;
this.onReceive = onReceive;
this.triggerRcvrBreakpoint = triggerRcvrBreakpoint;
this.triggerMessageReceiverBreakpoint = triggerMessageReceiverBreakpoint;
this.triggerPromiseResolverBreakpoint = triggerPromiseResolverBreakpoint;
this.triggerPromiseResolutionBreakpoint = triggerPromiseResolutionBreakpoint;
assert onReceive.getRootNode() instanceof ReceivedMessage || onReceive.getRootNode() instanceof ReceivedCallback;
}

Expand All @@ -56,8 +66,11 @@ public static final class DirectMessage extends EventualMessage {

public DirectMessage(final EventualMessage causalMessage, final Actor target, final SSymbol selector,
final Object[] arguments, final Actor sender, final SResolver resolver,
final RootCallTarget onReceive, final boolean triggerRcvrBreakpoint) {
super(causalMessage, arguments, resolver, onReceive, triggerRcvrBreakpoint);
final RootCallTarget onReceive, final boolean triggerMessageReceiverBreakpoint,
final boolean triggerPromiseResolverBreakpoint,
final boolean triggerPromiseResolutionBreakpoint) {
super(causalMessage, arguments, resolver, onReceive, triggerMessageReceiverBreakpoint,
triggerPromiseResolverBreakpoint, triggerPromiseResolutionBreakpoint);
this.selector = selector;
this.sender = sender;
this.target = target;
Expand Down Expand Up @@ -131,8 +144,10 @@ public abstract static class PromiseMessage extends EventualMessage {
protected final Actor originalSender; // initial owner of the arguments

public PromiseMessage(final EventualMessage causalMessage, final Object[] arguments, final Actor originalSender,
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerRcvrBreakpoint) {
super(causalMessage, arguments, resolver, onReceive, triggerRcvrBreakpoint);
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerMessageReceiverBreakpoint,
final boolean triggerPromiseResolverBreakpoint, final boolean triggerPromiseResolutionBreakpoint) {
super(causalMessage, arguments, resolver, onReceive, triggerMessageReceiverBreakpoint,
triggerPromiseResolverBreakpoint, triggerPromiseResolutionBreakpoint);
this.originalSender = originalSender;
}

Expand All @@ -156,8 +171,10 @@ public static final class PromiseSendMessage extends PromiseMessage {

protected PromiseSendMessage(final EventualMessage causalMessage, final SSymbol selector,
final Object[] arguments, final Actor originalSender,
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerRcvrBreakpoint) {
super(causalMessage, arguments, originalSender, resolver, onReceive, triggerRcvrBreakpoint);
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerMessageReceiverBreakpoint,
final boolean triggerPromiseResolverBreakpoint, final boolean triggerPromiseResolutionBreakpoint) {
super(causalMessage, arguments, originalSender, resolver, onReceive, triggerMessageReceiverBreakpoint,
triggerPromiseResolverBreakpoint, triggerPromiseResolutionBreakpoint);
this.selector = selector;
}

Expand Down Expand Up @@ -204,8 +221,10 @@ public String toString() {
public static final class PromiseCallbackMessage extends PromiseMessage {

public PromiseCallbackMessage(final EventualMessage causalMessage, final Actor owner, final SBlock callback,
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerRcvrBreakpoint) {
super(causalMessage, new Object[] {callback, null}, owner, resolver, onReceive, triggerRcvrBreakpoint);
final SResolver resolver, final RootCallTarget onReceive, final boolean triggerMessageReceiverBreakpoint,
final boolean triggerPromiseResolverBreakpoint, final boolean triggerPromiseResolutionBreakpoint) {
super(causalMessage, new Object[] {callback, null}, owner, resolver, onReceive,
triggerMessageReceiverBreakpoint, triggerPromiseResolverBreakpoint, triggerPromiseResolutionBreakpoint);
}

@Override
Expand Down Expand Up @@ -280,6 +299,13 @@ public static EventualMessage getCurrentExecutingMessage() {
* before the message is processed.
*/
public boolean isBreakpoint() {
return triggerRcvrBreakpoint;
return triggerMessageReceiverBreakpoint;
}

/**
* Updates the value of the flag for the message receiver breakpoint.
*/
public void setIsMessageReceiverBreakpoint(final boolean triggerBreakpoint) {
this.triggerMessageReceiverBreakpoint = triggerBreakpoint;
}
}