Sending to Alternate Runners

Mark S. Miller
Mon, 02 Nov 1998 21:22:14 -0800

You should generally avoid holding in one vat a direct pointer to an object
in another vat, exactly in order to avoid confusion about what vat to send
to it in.  ExternalRef
enables you to form a safe inter-vat pointer.  From within the hosting vat,
to export a safe inter-vat pointer to one of your objects, you do

	Object safePtr = new ExternalRef(obj);

or in the E language

	define safePtr := ExternalRef new(obj)

If you've already got an unsafe direct inter-vat pointer, but know what vat
the object should receive messages in, you do

	Object safePtr := new ExternalRef(runner, obj);

or in the E language

	define safePtr := ExternalRef new(runner, obj)

The resulting pointer is DEFERRED, so you can send on it but not call.
This restriction makes sense, since the object is presumably in a different
vat than the invoker.  Both send* and send*Only works.  (Correspondingly,
in the E language, "<-" will work.)  The implementation inside the
ExternalRef looks somewhat like your first method below.  I believe that
Jeff has been using ExternalRefs successfully in this way.

Is this adequate for your needs?


At 06:01 PM 11/2/98 , Bill Frantz wrote:
>Is there anything in the current E runtime which allows an
>E.send/E.sendOnly to a runner which is not the current default runner?  I
>had to hack something together quickly, and ended up with something (in my
>application code) which looks like (for E.sendOnly()):
>   private void sendOnly(Object receiver, String verb, Object arg1) {
>      Object[] args = { arg1 };
>      myRunner.enqueue(new PendingEvent(receiver, null, verb, args));
>   }
>It might be nice to have in E, something that looks like:
>   public static void sendOnly(Runner runner, Object receiver, 
>            String verb, Object arg1) {
>      Object[] args = { arg1 };
>      runner.enqueue(new PendingEvent(receiver, null, verb, args));
>   }