[Squeak-e] eventual references and promises. What's an alternate compiler solution to deal with promise continuations?

Robert Withers rwithers12 at attbi.com
Sun Feb 16 15:54:07 CET 2003


Hi All,

Does the rubber band nature of eventual message sending, especially now 
that #immediateRef is working, help provide an interesting interface 
for users?  I don't know if people are aware of the way I adopted 
Mark's E eventual sending.  This is especially true since I really 
haven't written any documentation on it.  :(

Here's an attempt at an introduction to them:  From reading ( 
http://www.erights.org/elib/concurrency/msg-passing.html ), I got very 
excited.

In E, with specialized syntax, an expression like  "person <- 
computeCreditRating()"   would eventually send the message and 
immediately return a promise for the result.  This promise will 
'become' the result of the eventual send.  This requires a promise 
continuation to be sent with the message, so that the evaluation will 
resolve the promise.

Before that happens, your subsequent code can send messages to the 
promise or the original eventual reference.  There are special messages 
that you can send to synchronize with the result.  There is a way to 
write code that waits until a set of promises are resolved, before 
doing further work.  This allows you to synchronize the results.

To try this I decided that building a trampoline that you could send 
messages to as a surrogate to the real object would allow us to trigger 
eventual sending just by slightly changing the sending context.  This 
sending context was scoped to that object reference that built the 
context for you, when you sent #eventualRef to the object reference 
that will be your receiver.  This way, we don't need special syntax to 
invoke eventual messages.  The machinery of ScriptScheduler and 
ScriptProcess, allows an implementation of #immediateRef to work.  This 
is the first step toward adding the synchronization features.  The next 
step would be to synchronize multiple promises, but I don't have a 
solution in mind, yet.  Anyone have an idea?


[Context implementation]
I also want to discuss how to improve my contexts.  Maybe it is 
possible to have a perfectly contained reference to an object and use 
#dnu and a special class for promises.   I demonstrated that with 
changes to the bytecodePrimitiveClass and bytecodePrimitiveEquivalence 
methods, that double-dispatch equivalence and class as a message send 
allow surrogates to really stand in for eventual objects.  Is there a 
way to do this without changes to the vm?

For efficiency, I had also thought that with the above description of 
promises and their continuations, on Erights, these references could be 
defined precisely enough to put into the vm.  If you look at my 
vm-redirectors changeset, you can see that I came up with a pretty 
clean approach to intercepting message lookup.  I use the 
compactClassIndex to register the Messageredirector class and be able 
to quickly determine this in the vm.   Using the same strategy, we 
could have special eventual send references, and promise references, 
that the vm could detect, then the vm could execute different lookup 
strategies and manage all special reference creation and resolver 
activation.

We still need a way to implement far references and their promises so 
that the captp and vatp machinery can be interfaced.  Are these 
references in the vm?  Yes, but only to redirect the message send like 
I do in Referencecontext.  See #redirectMessage: for the entry point 
from the vm redirector (or the 
MessageRedirectionProxy>>#doesNotUnderstand:).    I am bothered 
fundamentally by having to use #immediateCallSelectors and 
#eventualControlSelectors to choose how to send the message.  I thought 
that Anthony's work or Traits or MethodWrappers would be some 
alternatives to replacing this mess.


see ( http://swiki.squeakfoundation.org/squeak-e/3 ) for SqueakElib, 
Scripting and the bridge code to see how #immediateRef behaves.

cheers,
rob



More information about the Squeak-e mailing list