Re: Using Vine in 3-way interactions (was Re: Question on redirectors/whenMoreResolved in the 3-way case, in the middle vat)
"Mark S. Miller" <[email protected]> Wed, 18 Nov 2015 14:40:28 -0500
| Newsgroups | gmane.comp.lang.e.general |
|---|---|
| Message-ID | <CABHxS9gg5RXPSxmC8xKd2ce+XcFBUm5VZyRqy1qVGyLoe7=Owg@mail.gmail.com> |
--===============6790961531683999032== Content-Type: multipart/alternative; boundary=001a1143fc448377270524d5d025 --001a1143fc448377270524d5d025 Content-Type: text/plain; charset=UTF-8 Note that this is an old message that may be redundant with other messages from around the same time. I do not know why this one was stuck in the moderator queue or why I had not noticed it till now. I did just notice it and release it. Sorry for the temporal confusion. On Sat, Mar 7, 2015 at 7:28 PM, Rob Withers <[email protected]> wrote: > I truly hope not, Mark. I have this tendency to explicitly burn bridges > when I perceive they are burned, to clarify and out of frustration that I > keep bouncing. My apologies for that as it helps no one, as well as my > lack of patience for a response. I had not realized I had posted such a > challenging question. > > In consideration, if I may suggest the following. > > > 1. Carol sends to Alice with a ref to Bob and Alice redirects a call > to Bob, returning a RemotePromise both in Carol and in Alice. > 2. 3-way: Carol sends a provideFor to Bob and Alice sends an > AcceptFrom to Bob. > 3. Carol sends a followOn to Alice's first resolution, which is a > RemotePromise to Bob, so this flows to Bob. > 4. 3-way: In Alice, the followOn should become a 3-way to the followOn > Resolver in Carol. So Alice would send a provideFor to Carol and Bob would > send an AcceptFrom to Carol and send the result of the followOn to the gift > resolver in Carol. > > I think I am saying this the way I am thinking it. > > Thank you. > > > On 3/7/2015 5:07 PM, Mark S. Miller wrote: > > Wait wait apologies! You did nothing at all to offend! Really! > > I was just saying to a current houseguest last night, as close as I can > remember: > > "Have you seen the question Rob Withers has asked lately on e-lang about > captp? It relates to race conditions and GC, but I haven't yet been able to > reload enough context to think about it. Could you have a look?" We then > went off on a long discussion on race conditions in captp-like systems x gc > x partition x malice, how difficult it is to do a full case analysis of the > cross product by hand, and how much automated tools could help. Sadly, we > did not get back to the subject of your question. > > True story. I am posting this without first checking with the houseguest, > which is why I'm omitting their name. > > I should have said something to explain my lack of response. The rudeness > really is mine. > > > > > On Sat, Mar 7, 2015 at 3:28 PM, Rob Withers <[email protected]> > wrote: > >> Thanks for all the reticent help over the years, everyone. It's been >> fun. Such a pity that that help seems permanently revoked, like an >> untrusted capability. I must not have participated well in the social >> context, but that is par for the course for folks with Aspergers, I am >> learning. I just can't ever seem to say the right thing and more often >> than not, I piss people off. The issue is I truly just don't get it. >> >> Best regards, >> Robert >> >> On 3/4/2015 9:27 AM, Rob Withers wrote: >> >> Might someone be able to comment on this, please? It would help me a >> great deal. I do not think it is the unimplemented far3Desc situation. >> >> Thanks, >> Robert >> >> On 3/1/2015 3:12 PM, Rob Withers wrote: >> >> I see. Could you comment on how a Vine (and promise3Desc/far3Desc) get >> introduced into the machinery when a followOn msg gets forwarded to a third >> vat? In my example, redirectForTheAnswer sends getTheAnswer to Bob and >> returns a RemotePromise, which receives a hashCode followOn msg, forwarded >> to Bob. >> >> - Robert >> >> On 3/1/2015 2:56 PM, Mark S. Miller wrote: >> >> No, the 2-vat interactions never use, or engage in any way with, vines, >> promise3Desc or far3Desc. >> >> >> On Sun, Mar 1, 2015 at 9:37 AM, Robert Withers < >> [email protected]> wrote: >> >>> I have a question about elib. Do you use promise3Desc and far3Desc for >>> 2-vat interactions such that a vine is always in play in any interaction? >>> >>> - Robert >>> >>> >>> Rob Withers <[email protected]> wrote: >>> >>> Mark, your instincts were right on, it seems. I have an issue with my >>> use of the Vine and on reflection it makes perfect sense. I am bending the >>> send from Carol to Alice over to Bob, so as it is a 3-way interaction, I >>> need a Vine. In analyzing ELib code, you have 9 references to the Vine's >>> constructor, while I only have 7 (minus an extra unused constructor I >>> have). It is going to require some digging to unearth what I am missing, >>> but the direction is clear. The place it blows up is in my >>> ProxyResolver.resolve() method, as the WeakReference has lost the ref. >>> However, this is not where the reference is maintained. I suspect it may >>> be a lack of an IdentityManager. >>> >>> I republished my code to: https://github.com/tooantuh/pauwau. The >>> tests pass, though there is an issue with the RefTests and >>> TestPauwau2VatException, as well as this issue affecting >>> TestPauwau3VatFollowOnSend. Additionally, the presentation tests need to >>> be run one at a time as stopping and starting the Introducers can step on >>> each other. >>> >>> thank you, >>> Robert >>> >>> On 2/22/2015 8:02 PM, Mark S. Miller wrote: >>> >>> Have you looked at the Vine? Search for "Vine" at >>> http://erights.org/elib/distrib/captp/index.html >>> and in the source code of https://code.google.com/p/caja-captp/ >>> >>> I don't quite understand your question, so I'm not sure if this is even >>> relevant to the answer. Is it? >>> >>> >>> >>> On Sun, Feb 22, 2015 at 5:51 PM, Rob Withers <[email protected] >>> > wrote: >>> >>>> I found some more info: it looks as if the Ref in Alice's ProxyResolver >>>> is being GCed, before resolution from Bob. This is specific to my >>>> machinery, but knowing how Elib maintains a reference to the Ref, in this >>>> case, may help make mine better. How does Elib handle this? >>>> >>>> Thank you, >>>> - Robert >>>> >>>> >>>> On 2/22/2015 6:19 PM, Rob Withers wrote: >>>> >>>> I am stuck, both conceptually, as well as understanding code I wrote a >>>> long while ago. I was hoping to gain a little insight from the list of the >>>> insides of resolution redirection in the 3-way case. The recent change I >>>> have made results from my thinking I finally understand the ordering that >>>> MirandaMethods ensure. I made changes such that a whenMoreResolved >>>> directly follows the message that generates is by adding to the front of >>>> the msg queue. >>>> >>>> In the 3-way case, Carol is sending a message to Alice, passing Bob. >>>> Alice receives the message and executes, which sends a message to Bob, then >>>> returns the result to Carol. In Alice's vat, the DelayedRedirector is >>>> resolved to the RemotePromise of the call to Bob, the return of Alice's >>>> computation and I think it sends whenMoreResolved to the proxy of the new >>>> promise resolver of the send to Bob. What little tracing I have I am >>>> posting below, as well as the DelayedRedirector value() and the >>>> ProxyResolver resolve() code, at the bottom. However, this is my question, >>>> what should the redirector do in Alice's Vat to propagate the resolution >>>> from Bob, back to Carol? >>>> >>>> Thank you, >>>> - Robert >>>> >>>> >>>> // There are 3 messages sent to Bob, from Alice: >>>> // 1) getTheAnswer, which returns 42, >>>> // 2) *hashCode, again 42* and >>>> // 3) *whenMoreResolved*, to forward to the redirector back in >>>> Alice. >>>> >>>> 0 [main] INFO cc.ganymede.pauwau.presentation.AbstractPauwauTest - 3 >>>> Introducers starting >>>> 549 [main] INFO cc.ganymede.pauwau.presentation.AbstractPauwauTest - 3 >>>> Introducers on the air >>>> 4553 [main] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal - >>>> sending message: DeliverMessage(receiverId: 0 answerId: -1 resolverId: -1 >>>> action: lookupSwiss args: >>>> [497273074681788564315291637588644948944089734358]) >>>> 4952 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverMessage(receiverId: 0 answerId: -1 resolverId: >>>> null action: lookupSwiss args: >>>> [497273074681788564315291637588644948944089734358]) >>>> 4958 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: DeliverOnlyMessage(receiverId: 1 action: value args: >>>> [NearRefImpl(hash: 109537538, receiver: TestObject)]) >>>> 4998 [third-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverOnlyMessage(receiverId: 1 action: value args: >>>> [FarRefImpl(hash: 68783569)]) >>>> 5353 [main] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal - >>>> sending message: DeliverMessage(receiverId: 0 answerId: -1 resolverId: -1 >>>> action: lookupSwiss args: >>>> [-686254831702855955980329529540587585277617841038]) >>>> 5593 [second-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverMessage(receiverId: 0 answerId: -1 resolverId: >>>> null action: lookupSwiss args: >>>> [-686254831702855955980329529540587585277617841038]) >>>> 5593 [second-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: DeliverOnlyMessage(receiverId: 1 action: value args: >>>> [NearRefImpl(hash: 1530099003, receiver: TestObject)]) >>>> 6201 [main] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal - >>>> sending message: DeliverMessage(receiverId: -1 answerId: -2 resolverId: -2 >>>> action: redirectForTheAnswer args: [RemotePromiseRefImpl(hash: 1034568234)]) >>>> 6203 [main] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal - >>>> sending message: DeliverMessage(receiverId: 0 answerId: -2 resolverId: -2 >>>> action: provideFor args: >>>> [-568687285196004884954480990488973591228663758441, >>>> RemotePromiseRefImpl(hash: 1034568234), >>>> -676914875674370369045480105305401075435688776666]) >>>> 6239 [main] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal - >>>> sending message: DeliverMessage(receiverId: -2 answerId: -3 resolverId: -3 >>>> action: hashCode args: []) >>>> 6255 [second-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverMessage(receiverId: 0 answerId: -2 resolverId: >>>> null action: provideFor args: >>>> [-568687285196004884954480990488973591228663758441, NearRefImpl(hash: >>>> 1530099003, receiver: TestObject), >>>> -676914875674370369045480105305401075435688776666]) >>>> 6259 [second-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: DeliverOnlyMessage(receiverId: 2 action: value args: >>>> [NearRefImpl(hash: 1323165787, receiver: >>>> cc.ganymede.pauwau.presentation.lib.vat.Vine@4842def1)]) >>>> 6403 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: DeliverMessage(receiverId: 0 answerId: -1 resolverId: -1 >>>> action: acceptFrom args: >>>> [HouseAtreides:10003/-687934017861573292334955567350102524989066643525, >>>> -676914875674370369045480105305401075435688776666, >>>> cc.ganymede.pauwau.presentation.lib.vat.Vine@6a8400ff]) >>>> 6410 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverMessage(receiverId: -1 answerId: -2 resolverId: >>>> null action: redirectForTheAnswer args: [RemotePromiseRefImpl(hash: >>>> 598908224)]) >>>> 6411 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverMessage(receiverId: -2 answerId: -3 resolverId: >>>> null action: hashCode args: []) >>>> 6411 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: DeliverMessage(receiverId: -1 answerId: -2 resolverId: >>>> -2 action: getTheAnswer args: []) >>>> 6412 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: DeliverMessage(receiverId: -2 answerId: -3 resolverId: >>>> -3 action: hashCode args: []) >>>> 6412 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: DeliverOnlyMessage(receiverId: -2 action: >>>> whenMoreResolved args: [RedirectorProxy: FarRefImpl(hash: 177595052)]) >>>> 6766 [second-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverMessage(receiverId: 0 answerId: -1 resolverId: >>>> null action: acceptFrom args: >>>> [HouseAtreides:10003/-687934017861573292334955567350102524989066643525, >>>> -676914875674370369045480105305401075435688776666, FarRefImpl(hash: >>>> 690984748)]) >>>> 6767 [second-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverMessage(receiverId: -1 answerId: -2 resolverId: >>>> null action: getTheAnswer args: []) >>>> 6767 [second-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverMessage(receiverId: -2 answerId: -3 resolverId: >>>> null action: hashCode args: []) >>>> 6767 [second-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverOnlyMessage(receiverId: -2 action: >>>> whenMoreResolved args: [NearRefImpl(hash: 363771261, receiver: >>>> RedirectorProxy: FarRefImpl(hash: 196981675))]) >>>> 6768 [second-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: DeliverOnlyMessage(receiverId: 2 action: value args: >>>> [NearRefImpl(hash: 1530099003, receiver: TestObject)]) >>>> 6769 [second-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: DeliverOnlyMessage(receiverId: 3 action: value args: >>>> [NearRefImpl(hash: 790206055, receiver: 42)]) >>>> *6770 [second-vat] DEBUG >>>> cc.ganymede.pauwau.presentation.PauwauTerminal - sending message: >>>> DeliverOnlyMessage(receiverId: 4 action: value args: [NearRefImpl(hash: >>>> 878991039, receiver: 42)])* >>>> *6771 [second-vat] DEBUG >>>> cc.ganymede.pauwau.presentation.PauwauTerminal - sending message: >>>> DeliverOnlyMessage(receiverId: 5 action: value args: [NearRefImpl(hash: >>>> 790206055, receiver: 42)])* >>>> 6805 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverOnlyMessage(receiverId: 2 action: value args: >>>> [FarRefImpl(hash: 1332394016)]) >>>> 6805 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverOnlyMessage(receiverId: 3 action: value args: >>>> [42]) >>>> *6805 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverOnlyMessage(receiverId: 4 action: value args: >>>> [42])* >>>> *6805 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverOnlyMessage(receiverId: 5 action: value args: >>>> [42])* >>>> 6806 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: DeliverOnlyMessage(receiverId: 3 action: value args: >>>> [42]) >>>> 19932 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: GCAnswerMessage(answerId: -1) >>>> 19934 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: GCAnswerMessage(answerId: -2) >>>> 19934 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: GCAnswerMessage(answerId: -3) >>>> 19984 [second-vat] DEBUG >>>> cc.ganymede.pauwau.presentation.PauwauTerminal - receiving message: >>>> GCAnswerMessage(answerId: -1) >>>> 19984 [second-vat] DEBUG >>>> cc.ganymede.pauwau.presentation.PauwauTerminal - receiving message: >>>> GCAnswerMessage(answerId: -2) >>>> 19985 [second-vat] DEBUG >>>> cc.ganymede.pauwau.presentation.PauwauTerminal - receiving message: >>>> GCAnswerMessage(answerId: -3) >>>> 29679 [third-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: GCAnswerMessage(answerId: -1) >>>> 29680 [third-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverOnlyMessage(receiverId: 1 action: value args: >>>> [FarRefImpl(hash: 734824022)]) >>>> 29680 [third-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverOnlyMessage(receiverId: 2 action: value args: >>>> [FarRefImpl(hash: 1223086084)]) >>>> 29680 [third-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: DeliverOnlyMessage(receiverId: 3 action: value args: >>>> [42]) >>>> 29681 [third-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: GCAnswerMessage(answerId: -1) >>>> 29681 [third-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: GCAnswerMessage(answerId: -2) >>>> 29682 [third-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - sending message: GCAnswerMessage(answerId: -2) >>>> 29722 [second-vat] DEBUG >>>> cc.ganymede.pauwau.presentation.PauwauTerminal - receiving message: >>>> GCAnswerMessage(answerId: -1) >>>> 29722 [second-vat] DEBUG >>>> cc.ganymede.pauwau.presentation.PauwauTerminal - receiving message: >>>> GCAnswerMessage(answerId: -2) >>>> 29726 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: GCAnswerMessage(answerId: -1) >>>> 29726 [first-vat] DEBUG cc.ganymede.pauwau.presentation.PauwauTerminal >>>> - receiving message: GCAnswerMessage(answerId: -2) >>>> >>>> >>>> >>>> *// DelayedRedirector code:* >>>> public void value(Object obj) throws NotResolvedException { >>>> if(resolver == null) >>>> return; >>>> >>>> if(resolver.isFresh()) { >>>> resolver.resolve(obj); >>>> resolver = null; >>>> return; >>>> } >>>> >>>> if(RefUtil.isLocal(obj)) { >>>> resolver.resolve(obj); >>>> resolver = null; >>>> return; >>>> } >>>> >>>> Ref ref = (Ref)RefUtil.wrap(obj, resolver.handler.getVat()); >>>> boolean isLocalToResolverScope = false; >>>> try { >>>> isLocalToResolverScope = >>>> RefUtil.isLocalToScope(resolver.handler.scope, ref); >>>> if(isLocalToResolverScope) { >>>> resolver.resolve(obj); >>>> resolver = null; >>>> return; >>>> } >>>> } catch (Exception e) { >>>> reactToLostClient(e); >>>> } >>>> >>>> Pair<PromiseRefImpl, Resolver> pair = >>>> RefUtil.promise(ref.getVat()); >>>> Redirector redirector = new Redirector((ProxyResolver) >>>> pair.second()); >>>> resolver.getProxy().whenResolved(redirector); >>>> resolver.resolve(pair.first()); >>>> resolver = null; >>>> } >>>> >>>> >>>> *// ProxyResolver code:* >>>> public void resolve(final Object result) throws >>>> NotResolvedException { >>>> handler.scope.getVat().sendRunnable(new Runnable() { >>>> public void run() { >>>> if(ref == null) >>>> return; >>>> if(ref.get() == null) >>>> return; >>>> if(Exception.class.isAssignableFrom(result.getClass())) >>>> { >>>> } >>>> Ref newRef = RefUtil.wrap(result, >>>> handler.scope.getVat()); >>>> try { >>>> if (newRef == null) >>>> ref.get().getRefImpl().becomeContext(null); >>>> else >>>> >>>> ref.get().getRefImpl().becomeContext(newRef.getRefImpl()); >>>> if(RefUtil.isResolved(newRef.getRefImpl())) { >>>> handler = null; >>>> ref = null; >>>> } >>>> } catch (NotResolvedException e) { >>>> // TODO Auto-generated catch block >>>> e.printStackTrace(); >>>> } >>>> }}); >>>> } >>>> >>>> >>>> >>>> _______________________________________________ >>>> e-lang mailing list >>>> [email protected] >>>> http://www.eros-os.org/mailman/listinfo/e-lang >>>> >>>> >>> >>> >>> -- >>> Cheers, >>> --MarkM >>> >>> >>> _______________________________________________ >>> e-lang mailing [email protected]://www.eros-os.org/mailman/listinfo/e-lang >>> >>> >>> >>> _______________________________________________ >>> e-lang mailing list >>> [email protected] >>> http://www.eros-os.org/mailman/listinfo/e-lang >>> >>> >> >> >> -- >> Cheers, >> --MarkM >> >> >> _______________________________________________ >> e-lang mailing [email protected]://www.eros-os.org/mailman/listinfo/e-lang >> >> >> >> >> >> _______________________________________________ >> e-lang mailing list >> [email protected] >> http://www.eros-os.org/mailman/listinfo/e-lang >> >> > > > -- > Cheers, > --MarkM > > > _______________________________________________ > e-lang mailing [email protected]://www.eros-os.org/mailman/listinfo/e-lang > > > > _______________________________________________ > e-lang mailing list > [email protected] > http://www.eros-os.org/mailman/listinfo/e-lang > > -- Cheers, --MarkM --001a1143fc448377270524d5d025 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr">Note that this is an old message that may be redundant wit= h other messages from around the same time. I do not know why this one was = stuck in the moderator queue or why I had not noticed it till now. I did ju= st notice it and release it. Sorry for the temporal confusion.<div><br></di= v><div><br><div><br></div></div></div><div class=3D"gmail_extra"><br><div c= lass=3D"gmail_quote">On Sat, Mar 7, 2015 at 7:28 PM, Rob Withers <span dir= =3D"ltr"><<a href=3D"mailto:[email protected]" target=3D"_blank= ">[email protected]</a>></span> wrote:<br><blockquote class=3D"= gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-= left:1ex"> =20 =20 =20 <div bgcolor=3D"#FFFFFF" text=3D"#000000"> I truly hope not, Mark.=C2=A0 I have this tendency to explicitly burn bridges when I perceive they are burned, to clarify and out of frustration that I keep bouncing.=C2=A0 My apologies for that as it hel= ps no one, as well as my lack of patience for a response.=C2=A0 I had not realized I had posted such a challenging question.<br> <br> In consideration, if I may suggest the following.<br> <br> <ol> <li>Carol sends to Alice with a ref to Bob and Alice redirects a call to Bob, returning a RemotePromise both in Carol and in Alice.</li> <li>3-way: Carol sends a provideFor to Bob and Alice sends an AcceptFrom to Bob.</li> <li>Carol sends a followOn to Alice's first resolution, which is = a RemotePromise to Bob, so this flows to Bob.</li> <li>3-way: In Alice, the followOn should become a 3-way to the followOn Resolver in Carol.=C2=A0 So Alice would send a provideFor = to Carol and Bob would send an AcceptFrom to Carol and send the result of the followOn to the gift resolver in Carol. </li> </ol> I think I am saying this the way I am thinking it.<br> <br> Thank you.<div><div class=3D"h5"><br> <br> <div>On 3/7/2015 5:07 PM, Mark S. Miller wrote:<br> </div> <blockquote type=3D"cite"> <div dir=3D"ltr">Wait wait apologies! You did nothing at all to offend!=C2=A0Really! <div><br> </div> <div>I was just saying to a current houseguest last night, as close as I can remember:</div> <div><br> </div> <div>"Have you seen the question Rob Withers has asked lately = on e-lang about captp? It relates to race conditions and GC, but I haven't yet been able to reload enough context to think about it. Could you have a look?" We then went off on a long discussion on race conditions in captp-like systems x gc x partition x malice, how difficult it is to do a full case analysis of the cross product by hand, and how much automated tools could help. Sadly, we did not get back to the subject of your question.</div> <div><br> </div> <div>True story. I am posting this without first checking with the houseguest, which is why I'm omitting their name.</div> <div><br> </div> <div>I should have said something to explain my lack of response. The rudeness really is mine.</div> <div><br> </div> <div><br> </div> <div><br> </div> </div> <div class=3D"gmail_extra"><br> <div class=3D"gmail_quote">On Sat, Mar 7, 2015 at 3:28 PM, Rob Withers <span dir=3D"ltr"><<a href=3D"mailto:robert.w.withers@= gmail.com" target=3D"_blank">[email protected]</a>></span> wrote:<br> <blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;bord= er-left:1px #ccc solid;padding-left:1ex"> <div bgcolor=3D"#FFFFFF" text=3D"#000000"> Thanks for all the reticent help over the years, everyone.=C2=A0 It's been f= un.=C2=A0 Such a pity that that help seems permanently revoked, like an untrusted capability.=C2=A0 I must not have participated well in the social context, but that is par for the course for folks with Aspergers, I am learning.=C2=A0 I just can'= ;t ever seem to say the right thing and more often than not, I piss people off.=C2=A0 The issue is I truly just don't = get it.=C2=A0 <br> <br> Best regards, <br> <div>Robert</div> <div> <div> <br> <div>On 3/4/2015 9:27 AM, Rob Withers wrote:<br> </div> <blockquote type=3D"cite"> Might someone be able to comment on this, please?=C2=A0 It would help me a great deal.=C2=A0 I do not think it is the unimplemented far3Desc situation.<br> <br> Thanks,<br> Robert<br> <br> <div>On 3/1/2015 3:12 PM, Rob Withers wrote:<br> </div> <blockquote type=3D"cite"> I see.=C2=A0 Could you comme= nt on how a Vine (and promise3Desc/far3Desc) get introduced into the machinery when a followOn msg gets forwarded to a third vat?=C2=A0 In my example, redirectForTheAnswer sends getTheAnswer to Bob and returns a RemotePromise, which receives a hashCode followOn msg, forwarded to Bob.<br> <br> - Robert<br> <br> <div>On 3/1/2015 2:56 PM, Mark S. Miller wrote:<br> </div> <blockquote type=3D"cite"> <div dir=3D"ltr">No, the 2-vat interactions never use, or engage in any way with, vines, promise3Desc or far3Desc. <div><br> </div> </div> <div class=3D"gmail_extra"><br> <div class=3D"gmail_quote">On Sun, Mar 1, 2015 at 9:37 AM, Robert Withers <span dir=3D"ltr">&l= t;<a href=3D"mailto:[email protected]" target=3D"_blank">robert.w.= [email protected]</a>></span> wrote:<br> <blockquote class=3D"gmail_quote" style=3D"marg= in:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I have a question about elib. Do you use promise3Desc and far3Desc for 2-vat interactions such that a vine is always in play in any interaction?<br> <br> - Robert <div> <div><br> <br> Rob Withers <<a href=3D"mailto:robert.= [email protected]" target=3D"_blank">[email protected]</a>> wrote:<br> <br> Mark, your instincts were right on, it seems.=C2=A0 I have an issue with my use = of the Vine and on reflection it makes perfect sense. I am bending the send from Carol to Alice over to Bob, so as it is a 3-way interaction, I need a Vine.=C2=A0 In analyzing ELib code, you have 9 references to the Vine's constructor, while I only have 7 (minus an extra unused constructor I have).=C2=A0 It is going to require some digging to unearth what I am missing, but the direction is clear.=C2=A0 The pla= ce it blows up is in my ProxyResolver.resolve() method, as the WeakReference has lost the ref.=C2=A0 However, this is not where the reference is maintained.=C2=A0 I suspect = it may be a lack of an IdentityManager.<br> <br> I republished my code to: <a href=3D"http= s://github.com/tooantuh/pauwau" target=3D"_blank">https://github.com/tooant= uh/pauwau</a>.=C2=A0 The tests pass, though there is an issue with the RefTests and TestPauwau2VatException, as well as this issue affecting TestPauwau3VatFollowOnSend.=C2=A0 Additionally, the presentation tests need to be run one at a time as stopping and starting the Introducers can step on each other.<br> <br> thank you,<br> Robert<br> <br> <div>On 2/22/2015 8:02 PM, Mark S. Miller wrote:<br> </div> <blockquote type=3D"cite"> <div dir=3D"ltr">Have you looked at the Vine? Search for "Vine"= at=C2=A0<a href=3D"http://erights.org/elib/distrib/captp/index.html" targe= t=3D"_blank">http://erights.org/elib/distrib/captp/index.html</a> <div>and in the source code of=C2=A0<= a href=3D"https://code.google.com/p/caja-captp/" target=3D"_blank">https://= code.google.com/p/caja-captp/</a></div> <div><br> </div> <div>I don't quite understand you= r question, so I'm not sure if this is even relevant to the answer. Is it?</div> <div><br> </div> <div><br> </div> </div> <div class=3D"gmail_extra"><br> <div class=3D"gmail_quote">On Sun, Feb 22, 2015 at 5:51 PM, Rob Withers <span dir=3D"ltr"><<a hr= ef=3D"mailto:[email protected]" target=3D"_blank">robert.w.withers= @gmail.com</a>></span> wrote:<br> <blockquote class=3D"gmail_quote" s= tyle=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> <div bgcolor=3D"#FFFFFF" text=3D"= #000000"> I found some more info: it looks as if the Ref in Alice's ProxyResolver is being GCed, before resolution from Bob.=C2= =A0 This is specific to my machinery, but knowing how Elib maintains a reference to the Ref, in this case, may help make mine better. How does Elib handle this?<br> <br> Thank you,<br> - Robert <div> <div><br> <br> <div>On 2/22/2015 6:19 PM, Rob Withers wrote:<br= > </div> <blockquote type=3D"cite"> I am stuck, both conceptually, as well as understanding code I wrote a long while ago.=C2=A0 I was hoping t= o gain a little insight from the list of the insides of resolution redirection in the 3-way case.=C2=A0 The recent change I have made results from my thinking I finally understand the ordering that MirandaMethods ensure.=C2=A0 I made changes such that a whenMoreResolved directly follows the message that generates is by adding to the front of the msg queue.=C2=A0 <br> <br> In the 3-way case, Carol is sending a message to Alice, passing Bob.=C2=A0 Alice receives the message and executes, which sends a message to Bob, then returns the result to Carol.=C2=A0 In Alice's vat, the DelayedRedirector is resolved to the RemotePromise of the call to Bob, the return of Alice's computation and I think it sends whenMoreResolved to the proxy of the new promise resolver of the send to Bob.=C2=A0 Wh= at little tracing I have I am posting below, as well as the DelayedRedirector value() and the ProxyResolver resolve() code, at the bottom.=C2=A0 However, th= is is my question, what should the redirector do in Alice's Vat to propagate the resolution from Bob, back to Carol?<br> <br> Thank you,<br> - Robert<br> <br> <br> // There are 3 messages sent to Bob, from Alice:<br> // =C2=A0=C2=A0=C2=A0 1) getTheAnswer, which returns 42, <br> // =C2=A0=C2=A0=C2=A0 2) = <b>hashCode, again 42</b> and <br> //=C2=A0=C2=A0 =C2=A0 3) = <b>whenMoreResolved</b>, to forward to the redirector back in Alice.<br> <br> 0 [main] INFO cc.ganymede.pauwau.presen= tation.AbstractPauwauTest=C2=A0 - 3 Introducers starting<br> 549 [main] INFO cc.ganymede.pauwau.presen= tation.AbstractPauwauTest=C2=A0 - 3 Introducers on the air<br> 4553 [main] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverMessage(receiverId= : 0 answerId: -1 resolverId: -1 action: lookupSwiss args: [497273074681788564315291= 637588644948944089734358])<br> 4952 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverMessage(receiverId= : 0 answerId: -1 resolverId: null action: lookupSwiss args: [497273074681788564315291= 637588644948944089734358])<br> 4958 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverOnlyMessage(receiv= erId: 1 action: value args: [NearRefImpl(hash: 109537538, receiver: TestObject)])<br> 4998 [third-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverOnlyMessage(receiv= erId: 1 action: value args: [FarRefImpl(hash: 68783569)])<br> 5353 [main] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverMessage(receiverId= : 0 answerId: -1 resolverId: -1 action: lookupSwiss args: [-68625483170285595598032= 9529540587585277617841038])<br> 5593 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverMessage(receiverId= : 0 answerId: -1 resolverId: null action: lookupSwiss args: [-68625483170285595598032= 9529540587585277617841038])<br> 5593 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverOnlyMessage(receiv= erId: 1 action: value args: [NearRefImpl(hash: 1530099003, receiver: TestObject)])<br> 6201 [main] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverMessage(receiverId= : -1 answerId: -2 resolverId: -2 action: redirectForTheAnswer args: [RemotePromiseRefImpl(has= h: 1034568234)])<br> 6203 [main] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverMessage(receiverId= : 0 answerId: -2 resolverId: -2 action: provideFor args: [-56868728519600488495448= 0990488973591228663758441, RemotePromiseRefImpl(hash= : 1034568234), -676914875674370369045480105305401075435688776666])<br> 6239 [main] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverMessage(receiverId= : -2 answerId: -3 resolverId: -3 action: hashCode args: [])<br> 6255 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverMessage(receiverId= : 0 answerId: -2 resolverId: null action: provideFor args: [-56868728519600488495448= 0990488973591228663758441, NearRefImpl(hash: 1530099003, receiver: TestObject), -676914875674370369045480= 105305401075435688776666])<br> 6259 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverOnlyMessage(receiv= erId: 2 action: value args: [NearRefImpl(hash: 1323165787, receiver: cc.ganymede.pauwau.presentation.lib.vat.Vine@4842def1)])<br> 6403 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverMessage(receiverId= : 0 answerId: -1 resolverId: -1 action: acceptFrom args: [HouseAtreides:10003/-687= 934017861573292334955567350102524989066643525, -676914875674370369045480105305401075435688776666, cc.ganymede.pauwau.presentation.lib.vat.Vine@6a8400ff])<br> 6410 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverMessage(receiverId= : -1 answerId: -2 resolverId: null action: redirectForTheAnswer args: [RemotePromiseRefImpl(has= h: 598908224)])<br> 6411 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverMessage(receiverId= : -2 answerId: -3 resolverId: null action: hashCode args: [])<br> 6411 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverMessage(receiverId= : -1 answerId: -2 resolverId: -2 action: getTheAnswer args: [])<br= > 6412 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverMessage(receiverId= : -2 answerId: -3 resolverId: -3 action: hashCode args: [])<br> 6412 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverOnlyMessage(receiv= erId: -2 action: whenMoreResolved args: [RedirectorProxy: FarRefImpl(hash: 177595052)])<br> 6766 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverMessage(receiverId= : 0 answerId: -1 resolverId: null action: acceptFrom args: [HouseAtreides:10003/-687= 934017861573292334955567350102524989066643525, -676914875674370369045480= 105305401075435688776666, FarRefImpl(hash: 690984748)])<br> 6767 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverMessage(receiverId= : -1 answerId: -2 resolverId: null action: getTheAnswer args: [])<br> 6767 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverMessage(receiverId= : -2 answerId: -3 resolverId: null action: hashCode args: [])<br> 6767 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverOnlyMessage(receiv= erId: -2 action: whenMoreResolved args: [NearRefImpl(hash: 363771261, receiver: RedirectorProxy: FarRefImpl(hash: 196981675))])<br> 6768 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverOnlyMessage(receiv= erId: 2 action: value args: [NearRefImpl(hash: 1530099003, receiver: TestObject)])<br> 6769 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverOnlyMessage(receiv= erId: 3 action: value args: [NearRefImpl(hash: 790206055, receiver: 42)])<br> <b>6770 [second-vat] DEBUG cc.ganymede.pauwau.pres= entation.PauwauTerminal=C2=A0 - sending message: DeliverOnlyMessage(rece= iverId: 4 action: value args: [NearRefImpl(hash: 878991039, receiver: 42)])</b><b><br> </b><b>6771 [second-vat] DEBUG cc.ganymede.pauwau.pres= entation.PauwauTerminal=C2=A0 - sending message: DeliverOnlyMessage(rece= iverId: 5 action: value args: [NearRefImpl(hash: 790206055, receiver: 42)])</b><b><br> </b>6805 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverOnlyMessage(receiv= erId: 2 action: value args: [FarRefImpl(hash: 1332394016)])<br> 6805 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverOnlyMessage(receiv= erId: 3 action: value args: [42])<br> <b>6805 [first-vat] DEBUG cc.ganymede.pauwau.pres= entation.PauwauTerminal=C2=A0 - receiving message: DeliverOnlyMessage(rece= iverId: 4 action: value args: [42])</b><b><br> </b><b>6805 [first-vat] DEBUG cc.ganymede.pauwau.pres= entation.PauwauTerminal=C2=A0 - receiving message: DeliverOnlyMessage(rece= iverId: 5 action: value args: [42])</b><b><br> </b>6806 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: DeliverOnlyMessage(receiv= erId: 3 action: value args: [42])<br> 19932 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: GCAnswerMessage(answerId: -1)<br> 19934 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: GCAnswerMessage(answerId: -2)<br> 19934 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: GCAnswerMessage(answerId: -3)<br> 19984 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: GCAnswerMessage(answerId: -1)<br> 19984 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: GCAnswerMessage(answerId: -2)<br> 19985 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: GCAnswerMessage(answerId: -3)<br> 29679 [third-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: GCAnswerMessage(answerId: -1)<br> 29680 [third-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverOnlyMessage(receiv= erId: 1 action: value args: [FarRefImpl(hash: 734824022)])<br> 29680 [third-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverOnlyMessage(receiv= erId: 2 action: value args: [FarRefImpl(hash: 1223086084)])<br> 29680 [third-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: DeliverOnlyMessage(receiv= erId: 3 action: value args: [42])<br> 29681 [third-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: GCAnswerMessage(answerId: -1)<br> 29681 [third-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: GCAnswerMessage(answerId: -2)<br> 29682 [third-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - sending message: GCAnswerMessage(answerId: -2)<br> 29722 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: GCAnswerMessage(answerId: -1)<br> 29722 [second-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: GCAnswerMessage(answerId: -2)<br> 29726 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: GCAnswerMessage(answerId: -1)<br> 29726 [first-vat] DEBUG cc.ganymede.pauwau.presen= tation.PauwauTerminal=C2=A0 - receiving message: GCAnswerMessage(answerId: -2)<br> <br> <br> <br> <b>// DelayedRedirector code:</b><br> =C2=A0=C2=A0=C2=A0 public= void value(Object obj) throws NotResolvedException {<br= > =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 if(resolver =3D=3D null)<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 return;<br> <br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 if(resolver.isFresh()) {<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 resolver.resolve(obj);<br= > =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 resolver =3D null;<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 return;<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 }<br> <br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 if(RefUtil.isLocal(obj)) {<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 resolver.resolve(obj);<br= > =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 resolver =3D null;<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 return;<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 }<br> <br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 Ref ref =3D (Ref)RefUtil.wrap(obj, resolver.handler.getVat());<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 boolean isLocalToResolverScope =3D false;<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 try {<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 isLocalToResolverScope =3D RefUtil.isLocalToScope(re= solver.handler.scope, ref);<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if(isLocalToResolverScope= ) {<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 resolver.resolve(obj);<br= > =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 resolver =3D null;<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 return;<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 } catch (Exception e) {<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 reactToLostClient(e);<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 }<br> <br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 Pair<PromiseRefImpl, Resolver> pair =3D RefUtil.promise(ref.getVa= t());<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 Redirector redirector =3D new Redirector((ProxyResolver= ) pair.second());<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 resolver.getProxy().whenR= esolved(redirector);<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 resolver.resolve(pair.fir= st());<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 resolver =3D null;<br> =C2=A0=C2=A0=C2=A0 }<br> <br> <br> <b>// ProxyResolver code:</b><br> =C2=A0=C2=A0=C2=A0 public= void resolve(final Object result) throws NotResolvedException {<br= > =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 handler.scope.getVat().se= ndRunnable(new Runnable() {<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 public void run() {<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if(ref =3D=3D null)<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 return;<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if(ref.get() =3D=3D null)= <br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 return;<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if(Exception.class.isAssi= gnableFrom(result.getClass())) {<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 Ref newRef =3D RefUtil.wrap(result, handler.scope.getVat());<= br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 try {<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (newRef =3D=3D null)<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 ref.get().getRefImpl().be= comeContext(null);<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 else<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ref.get().getRefImpl().be= comeContext(newRef.getRefImpl());<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if(RefUtil.isResolved(new= Ref.getRefImpl())) {<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 handle= r =3D null;<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ref = =3D null;<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 } catch (NotResolvedException e) {<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 // TODO Auto-generated catch block<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 e.printStackTrace();<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }<br> =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }});<br> =C2=A0=C2=A0=C2=A0 }<br> <br> </blockquote> <br> </div> </div> </div> <br> _______________________________________________<br> e-lang mailing list<br> <a href=3D"mailto:[email protected]= s-os.org" target=3D"_blank">[email protected]</a><br> <a href=3D"http://www.eros-os.org= /mailman/listinfo/e-lang" target=3D"_blank">http://www.eros-os.org/mailman/= listinfo/e-lang</a><br> <br> </blockquote> </div> <br> <br clear=3D"all"> <div><br> </div> -- <br> <div>=C2=A0 =C2=A0 Cheers,<br> =C2=A0 =C2=A0 --MarkM</div> </div> <br> <fieldset></fieldset> <br> <pre>__________________________________= _____________ e-lang mailing list <a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]= os-os.org</a> <a href=3D"http://www.eros-os.org/mailman/listinfo/e-lang" target=3D"_blank= ">http://www.eros-os.org/mailman/listinfo/e-lang</a> </pre> </blockquote> <br> </div> </div> <br> _______________________________________________<br> e-lang mailing list<br> <a href=3D"mailto:[email protected]" ta= rget=3D"_blank">[email protected]</a><br> <a href=3D"http://www.eros-os.org/mailman/lis= tinfo/e-lang" target=3D"_blank">http://www.eros-os.org/mailman/listinfo/e-l= ang</a><br> <br> </blockquote> </div> <br> <br clear=3D"all"> <div><br> </div> -- <br> <div>=C2=A0 =C2=A0 Cheers,<br> =C2=A0 =C2=A0 --MarkM</div> </div> <br> <fieldset></fieldset> <br> <pre>______________________________________________= _ e-lang mailing list <a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]= os-os.org</a> <a href=3D"http://www.eros-os.org/mailman/listinfo/e-lang" target=3D"_blank= ">http://www.eros-os.org/mailman/listinfo/e-lang</a> </pre> </blockquote> <br> </blockquote> <br> </blockquote> <br> </div> </div> </div> <br> _______________________________________________<br> e-lang mailing list<br> <a href=3D"mailto:[email protected]" target=3D"_blank">e-= [email protected]</a><br> <a href=3D"http://www.eros-os.org/mailman/listinfo/e-lang" targ= et=3D"_blank">http://www.eros-os.org/mailman/listinfo/e-lang</a><br> <br> </blockquote> </div> <br> <br clear=3D"all"> <div><br> </div> -- <br> <div>=C2=A0 =C2=A0 Cheers,<br> =C2=A0 =C2=A0 --MarkM</div> </div> <br> <fieldset></fieldset> <br> <pre>_______________________________________________ e-lang mailing list <a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]= os-os.org</a> <a href=3D"http://www.eros-os.org/mailman/listinfo/e-lang" target=3D"_blank= ">http://www.eros-os.org/mailman/listinfo/e-lang</a> </pre> </blockquote> <br> </div></div></div> <br>_______________________________________________<br> e-lang mailing list<br> <a href=3D"mailto:[email protected]">[email protected]</a><br> <a href=3D"http://www.eros-os.org/mailman/listinfo/e-lang" rel=3D"noreferre= r" target=3D"_blank">http://www.eros-os.org/mailman/listinfo/e-lang</a><br> <br></blockquote></div><br><br clear=3D"all"><div><br></div>-- <br><div cla= ss=3D"gmail_signature">=C2=A0 =C2=A0 Cheers,<br>=C2=A0 =C2=A0 --MarkM</div> </div> --001a1143fc448377270524d5d025-- --===============6790961531683999032== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ e-lang mailing list [email protected] http://www.eros-os.org/mailman/listinfo/e-lang --===============6790961531683999032==--