erlang: receive...after Ms timeout clause (+9 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
This commit is contained in:
@@ -954,8 +954,12 @@
|
||||
(fn
|
||||
(node env)
|
||||
(let
|
||||
((pid (er-sched-current-pid)))
|
||||
(er-eval-receive-loop node pid env))))
|
||||
((pid (er-sched-current-pid))
|
||||
(after-node (get node :after-ms)))
|
||||
(if
|
||||
(= after-node nil)
|
||||
(er-eval-receive-loop node pid env)
|
||||
(er-eval-receive-with-after node pid env after-node)))))
|
||||
|
||||
(define
|
||||
er-eval-receive-loop
|
||||
@@ -975,6 +979,57 @@
|
||||
er-suspend-marker))
|
||||
(er-eval-receive-loop node pid env))))))
|
||||
|
||||
(define
|
||||
er-eval-receive-with-after
|
||||
(fn
|
||||
(node pid env after-node)
|
||||
(let
|
||||
((ms (er-eval-expr after-node env)))
|
||||
(cond
|
||||
(and (er-atom? ms) (= (get ms :name) "infinity"))
|
||||
(er-eval-receive-loop node pid env)
|
||||
(= ms 0) (er-eval-receive-poll node pid env)
|
||||
:else (er-eval-receive-timed node pid env)))))
|
||||
|
||||
;; after 0 — poll once; on no match, run the after-body immediately.
|
||||
(define
|
||||
er-eval-receive-poll
|
||||
(fn
|
||||
(node pid env)
|
||||
(let
|
||||
((r (er-try-receive (get node :clauses) pid env)))
|
||||
(if
|
||||
(get r :matched)
|
||||
(get r :value)
|
||||
(er-eval-body (get node :after-body) env)))))
|
||||
|
||||
;; after Ms — suspend; on resume check :timed-out. When the scheduler
|
||||
;; runs out of other work it fires one pending timeout per round.
|
||||
(define
|
||||
er-eval-receive-timed
|
||||
(fn
|
||||
(node pid env)
|
||||
(let
|
||||
((r (er-try-receive (get node :clauses) pid env)))
|
||||
(if
|
||||
(get r :matched)
|
||||
(get r :value)
|
||||
(do
|
||||
(er-proc-set! pid :has-timeout true)
|
||||
(shift
|
||||
k
|
||||
(do
|
||||
(er-proc-set! pid :continuation k)
|
||||
(er-proc-set! pid :state "waiting")
|
||||
er-suspend-marker))
|
||||
(if
|
||||
(er-proc-field pid :timed-out)
|
||||
(do
|
||||
(er-proc-set! pid :timed-out false)
|
||||
(er-proc-set! pid :has-timeout false)
|
||||
(er-eval-body (get node :after-body) env))
|
||||
(er-eval-receive-timed node pid env)))))))
|
||||
|
||||
;; Scan mailbox in arrival order. For each msg, try every clause.
|
||||
;; On first match: remove that msg from mailbox and return body value.
|
||||
(define
|
||||
|
||||
Reference in New Issue
Block a user