Browse Source

captp: Allow for non-promise-pipelined messages requesting a resolution

add-remove-to-filo-queue
Christine Lemmer-Webber 4 years ago
parent
commit
79ff12cfa6
No known key found for this signature in database
GPG Key ID: 4BC025925FF8F4D3
  1. 29
      goblins/ocapn/captp.rkt

29
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

Loading…
Cancel
Save