From 79ff12cfa6f8a7d191b992cd511ddec6938789d3 Mon Sep 17 00:00:00 2001 From: Christine Lemmer-Webber Date: Sat, 11 Dec 2021 17:39:02 -0500 Subject: [PATCH] captp: Allow for non-promise-pipelined messages requesting a resolution --- goblins/ocapn/captp.rkt | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/goblins/ocapn/captp.rkt b/goblins/ocapn/captp.rkt index 5d18986..db2ad25 100644 --- a/goblins/ocapn/captp.rkt +++ b/goblins/ocapn/captp.rkt @@ -756,11 +756,11 @@ [(op:deliver to-desc method args-marshalled kw-args-marshalled - answer-pos + ;; answer-pos is either an integer (promise pipelining) + ;; or #f (no pipelining) + (and (or (? integer?) #f) + answer-pos) resolve-me-desc) - (define-values (_answer-promise answer-resolver) - (install-answer! answer-pos resolve-me-desc)) - (define args (incoming-post-unmarshall! args-marshalled)) (define kw-args @@ -770,7 +770,26 @@ (kws-hasheq->kws-lists kw-args)) (define sent-promise (keyword-apply <- kws kw-vals target args)) - ($ answer-resolver 'fulfill sent-promise) + ;; We're either resolving the to the answer promise we create + ;; or we're resolving to the actual object described by resolve-me-desc + ;; + ;; The former case is an indirection because messages pipelined + ;; to a to-be-answered object are simply sent to a local promise + ;; which will eventually resolve to the answer. + ;; + ;; It's possible that something more efficient could be done + ;; than throwing in an intermediate promise pair that we inform the + ;; other side of; maybe re-evaluate when we handle + ;; automatic-severance-on-session-disconnect. + (cond + [answer-pos + (define-values (_answer-promise answer-resolver) + (install-answer! answer-pos resolve-me-desc)) + ($ answer-resolver 'fulfill sent-promise)] + [else + (define to-resolve + (maybe-install-import! resolve-me-desc)) + (<-np to-resolve 'fulfill sent-promise)]) (void)] ;; TODO: Here's where we have to record that a listening interest