erlang: send_after deadline-ordering + cancel-of-fired tests (T3+T4, 769/769)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 45s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 45s
T3 — concurrent timers fire in deadline order, not schedule order (scheduler jumps the clock to the earliest pending deadline each time the runnable queue drains). T4 — cancel_timer on an already-fired timer returns the atom false. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"language": "erlang",
|
"language": "erlang",
|
||||||
"total_pass": 766,
|
"total_pass": 769,
|
||||||
"total": 766,
|
"total": 769,
|
||||||
"suites": [
|
"suites": [
|
||||||
{"name":"tokenize","pass":62,"total":62,"status":"ok"},
|
{"name":"tokenize","pass":62,"total":62,"status":"ok"},
|
||||||
{"name":"parse","pass":52,"total":52,"status":"ok"},
|
{"name":"parse","pass":52,"total":52,"status":"ok"},
|
||||||
@@ -14,6 +14,6 @@
|
|||||||
{"name":"fib","pass":8,"total":8,"status":"ok"},
|
{"name":"fib","pass":8,"total":8,"status":"ok"},
|
||||||
{"name":"ffi","pass":37,"total":37,"status":"ok"},
|
{"name":"ffi","pass":37,"total":37,"status":"ok"},
|
||||||
{"name":"vm","pass":78,"total":78,"status":"ok"},
|
{"name":"vm","pass":78,"total":78,"status":"ok"},
|
||||||
{"name":"send_after","pass":5,"total":5,"status":"ok"}
|
{"name":"send_after","pass":8,"total":8,"status":"ok"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Erlang-on-SX Scoreboard
|
# Erlang-on-SX Scoreboard
|
||||||
|
|
||||||
**Total: 766 / 766 tests passing**
|
**Total: 769 / 769 tests passing**
|
||||||
|
|
||||||
| | Suite | Pass | Total |
|
| | Suite | Pass | Total |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
| ✅ | fib | 8 | 8 |
|
| ✅ | fib | 8 | 8 |
|
||||||
| ✅ | ffi | 37 | 37 |
|
| ✅ | ffi | 37 | 37 |
|
||||||
| ✅ | vm | 78 | 78 |
|
| ✅ | vm | 78 | 78 |
|
||||||
| ✅ | send_after | 5 | 5 |
|
| ✅ | send_after | 8 | 8 |
|
||||||
|
|
||||||
|
|
||||||
Generated by `lib/erlang/conformance.sh`.
|
Generated by `lib/erlang/conformance.sh`.
|
||||||
|
|||||||
@@ -78,3 +78,43 @@
|
|||||||
receive late -> got after 50 -> none end")
|
receive late -> got after 50 -> none end")
|
||||||
:name)
|
:name)
|
||||||
"none")
|
"none")
|
||||||
|
|
||||||
|
;; ── T3 — multiple timers fire in deadline order, not schedule order ──
|
||||||
|
;; `b` is scheduled first (deadline 80) but `a` second (deadline 20).
|
||||||
|
;; Two plain receives drain the mailbox in arrival order — and arrival
|
||||||
|
;; is governed by deadline, so the first message out is `a`.
|
||||||
|
(er-sa-test
|
||||||
|
"T3 timers fire in deadline order"
|
||||||
|
(er-format-value
|
||||||
|
(sa-ev
|
||||||
|
"erlang:send_after(80, self(), b),
|
||||||
|
erlang:send_after(20, self(), a),
|
||||||
|
X = receive M1 -> M1 end,
|
||||||
|
Y = receive M2 -> M2 end,
|
||||||
|
{X, Y}"))
|
||||||
|
"{a,b}")
|
||||||
|
|
||||||
|
;; A selective receive on `a` matches the earlier-deadline timer even
|
||||||
|
;; though `b` was scheduled first.
|
||||||
|
(er-sa-test
|
||||||
|
"T3 selective receive picks earliest deadline"
|
||||||
|
(get
|
||||||
|
(sa-ev
|
||||||
|
"erlang:send_after(80, self(), b),
|
||||||
|
erlang:send_after(20, self(), a),
|
||||||
|
receive a -> first end")
|
||||||
|
:name)
|
||||||
|
"first")
|
||||||
|
|
||||||
|
;; ── T4 — cancel_timer on an already-fired timer returns false ──────
|
||||||
|
;; Once `x` has been received the timer has fired; cancelling its ref
|
||||||
|
;; now yields the atom `false`.
|
||||||
|
(er-sa-test
|
||||||
|
"T4 cancel of fired timer is false"
|
||||||
|
(get
|
||||||
|
(sa-ev
|
||||||
|
"Ref = erlang:send_after(20, self(), x),
|
||||||
|
receive x -> ok end,
|
||||||
|
erlang:cancel_timer(Ref)")
|
||||||
|
:name)
|
||||||
|
"false")
|
||||||
|
|||||||
Reference in New Issue
Block a user