@@ -1464,12 +1464,15 @@ canon ::= ...
14641464 | (canon future.drop-readable <typeidx> (core func <id>?)) 🔀
14651465 | (canon future.drop-writable <typeidx> (core func <id>?)) 🔀
14661466 | (canon thread.index (core func <id>?)) 🧵
1467+ | (canon thread.exit (core func <id>?)) 🧵
14671468 | (canon thread.new-indirect <typeidx> <core:tableidx> (core func <id>?)) 🧵
14681469 | (canon thread.resume-later (core func <id>?)) 🧵
14691470 | (canon thread.suspend cancellable? (core func <id>?)) 🧵
14701471 | (canon thread.yield cancellable? (core func <id>?)) 🔀
1471- | (canon thread.switch-to cancellable? (core func <id>?)) 🧵
1472- | (canon thread.yield-to cancellable? (core func <id>?)) 🧵
1472+ | (canon thread.suspend-then-resume cancellable? (core func <id>?)) 🧵
1473+ | (canon thread.yield-then-resume cancellable? (core func <id>?)) 🧵
1474+ | (canon thread.suspend-then-promote cancellable? (core func <id>?)) 🧵
1475+ | (canon thread.yield-then-promote cancellable? (core func <id>?)) 🧵
14731476 | (canon error-context.new <canonopt>* (core func <id>?)) 📝
14741477 | (canon error-context.debug-message <canonopt>* (core func <id>?)) 📝
14751478 | (canon error-context.drop (core func <id>?)) 📝
@@ -2067,6 +2070,23 @@ learn their index via `thread.index`.
20672070For details, see [ Thread Built-ins] in the concurrency explainer and
20682071[ ` canon_thread_index ` ] in the Canonical ABI explainer.
20692072
2073+ ###### 🧵 ` thread.exit `
2074+
2075+ | Synopsis | |
2076+ | -------------------------- | ---------- |
2077+ | Approximate WIT signature | ` func() ` |
2078+ | Canonical ABI signature | ` [] -> [] ` |
2079+
2080+ The ` thread.exit ` built-in immediately exits the [ current thread] without
2081+ running any Core WebAssembly handlers on the stack, as-if suspending with a
2082+ [ stack-switching] tag not exposed to Core WebAssembly and then dropping the
2083+ generated ` contref ` . Thus, producer toolchains should be careful to only call
2084+ ` thread.exit ` when unwinding is not expected (e.g., when calling
2085+ ` pthread_exit() ` ).
2086+
2087+ For details, see [ Thread Built-ins] in the concurrency explainer and
2088+ [ ` canon_thread_exit ` ] in the Canonical ABI explainer.
2089+
20702090###### 🧵 ` thread.new-indirect `
20712091
20722092| Synopsis | |
@@ -2089,7 +2109,7 @@ extended for [GC].
20892109
20902110As explained in the [ concurrency explainer] , a thread created by
20912111` thread.new-indirect ` is initially in a suspended state and must be resumed
2092- eagerly or lazily by [ ` thread.yield-to ` ] ( #-threadyield-to ) or
2112+ eagerly or lazily by [ ` thread.yield-then-resume ` ] ( #-threadyield-then-resume ) or
20932113[ ` thread.resume-later ` ] ( #-threadresume-later ) , resp., to begin execution.
20942114
20952115For details, see [ Thread Built-ins] in the concurrency explainer and
@@ -2122,9 +2142,6 @@ explicitly resumed by some other thread calling a built-in such as
21222142the current task was [ cancelled] by the caller; otherwise, ` thread.suspend `
21232143always returns ` false ` .
21242144
2125- A non-` async ` -typed function export that has not yet returned a value traps if
2126- it transitively attempts to call ` thread.suspend ` .
2127-
21282145For details, see [ Thread Built-ins] in the concurrency explainer and
21292146[ ` canon_thread_suspend ` ] in the Canonical ABI explainer.
21302147
@@ -2138,52 +2155,73 @@ For details, see [Thread Built-ins] in the concurrency explainer and
21382155The ` thread.yield ` built-in allows the runtime to potentially switch to any
21392156other thread in the "ready" state, enabling a long-running computation to
21402157cooperatively interleave execution without specifically requesting another
2141- thread to be resumed (as with ` thread.yield-to ` ). If ` cancellable ` is set,
2142- ` thread.yield ` returns whether the current task was [ cancelled] by the caller;
2143- otherwise, ` thread.yield ` always returns ` false ` .
2144-
2145- If ` thread.yield ` is called from a synchronous- or ` async callback ` -lifted
2146- export, it returns immediately without blocking (instead of trapping, as with
2147- other possibly-blocking operations like ` waitable-set.wait ` ). This is because,
2148- unlike other built-ins, ` thread.yield ` may be scattered liberally throughout
2149- code that might show up in the transitive call tree of a synchronous function
2150- call.
2158+ thread to be resumed (as with ` thread.yield-then-resume ` ). If ` cancellable ` is
2159+ set, ` thread.yield ` returns whether the current task was [ cancelled] by the
2160+ caller; otherwise, ` thread.yield ` always returns ` false ` .
21512161
21522162For details, see [ Thread Built-ins] in the concurrency explainer and
21532163[ ` canon_thread_yield ` ] in the Canonical ABI explainer.
21542164
2155- ###### 🧵 ` thread.switch-to `
2165+ ###### 🧵 ` thread.suspend-then-resume `
21562166
21572167| Synopsis | |
21582168| -------------------------- | --------------------------------------- |
21592169| Approximate WIT signature | ` func<cancellable?>(t: thread) -> bool ` |
21602170| Canonical ABI signature | ` [t:i32] -> [i32] ` |
21612171
2162- The ` thread.switch-to ` built-in suspends the [ current thread] and immediately
2163- resumes execution of the thread ` t ` , trapping if ` t ` is not in a "suspended"
2164- state. If ` cancellable ` is set, ` thread.switch-to ` returns whether the current
2165- task was [ cancelled] by the caller; otherwise, ` thread.switch-to ` always returns
2166- ` false ` .
2172+ The ` thread.suspend-then-resume ` built-in suspends the [ current thread] and
2173+ immediately resumes execution of the thread ` t ` , trapping if ` t ` is not in a
2174+ "suspended" state. If ` cancellable ` is set, ` thread.suspend-then-resume ` returns
2175+ whether the current task was [ cancelled] by the caller; otherwise,
2176+ ` thread.suspend-then-resume ` always returns ` false ` .
21672177
21682178For details, see [ Thread Built-ins] in the concurrency explainer and
2169- [ ` canon_thread_switch_to ` ] in the Canonical ABI explainer.
2179+ [ ` canon_thread_suspend_then_resume ` ] in the Canonical ABI explainer.
21702180
2171- ###### 🧵 ` thread.yield-to `
2181+ ###### 🧵 ` thread.yield-then-resume `
21722182
21732183| Synopsis | |
21742184| -------------------------- | --------------------------------------- |
21752185| Approximate WIT signature | ` func<cancellable?>(t: thread) -> bool ` |
21762186| Canonical ABI signature | ` [t:i32] -> [i32] ` |
21772187
2178- The ` thread.yield-to ` built-in immediately resumes execution of the thread ` t ` ,
2179- (trapping if ` t ` is not in a "suspended" state) leaving the [ current thread ] in
2180- a "ready" state so that the runtime can nondeterministically resume the current
2181- thread at some point in the future. If ` cancellable ` is set, ` thread.yield-to `
2182- returns whether the current task was [ cancelled] by the caller; otherwise,
2183- ` thread.yield-to ` always returns ` false ` .
2188+ The ` thread.yield-then-resume ` built-in immediately resumes execution of the
2189+ thread ` t ` , (trapping if ` t ` is not in a "suspended" state) leaving the [ current
2190+ thread ] in a "ready" state so that the runtime can nondeterministically resume
2191+ the current thread at some point in the future. If ` cancellable ` is set,
2192+ ` thread.yield-then-resume ` returns whether the current task was [ cancelled] by
2193+ the caller; otherwise, ` thread.yield-then-resume ` always returns ` false ` .
21842194
21852195For details, see [ Thread Built-ins] in the concurrency explainer and
2186- [ ` canon_thread_yield_to ` ] in the Canonical ABI explainer.
2196+ [ ` canon_thread_yield_then_resume ` ] in the Canonical ABI explainer.
2197+
2198+ ###### 🧵 ` thread.suspend-then-promote `
2199+
2200+ | Synopsis | |
2201+ | -------------------------- | --------------------------------------- |
2202+ | Approximate WIT signature | ` func<cancellable?>(t: thread) -> bool ` |
2203+ | Canonical ABI signature | ` [t:i32] -> [i32] ` |
2204+
2205+ The ` thread.suspend-then-promote ` built-in immediately resumes execution of the
2206+ thread ` t ` if ` t ` is in a "ready" state, in any case leaving the current thread
2207+ in a "suspended" state.
2208+
2209+ For details, see [ Thread Built-ins] in the concurrency explainer and
2210+ [ ` canon_thread_suspend_then_promote ` ] in the Canonical ABI explainer.
2211+
2212+ ###### 🧵 ` thread.yield-then-promote `
2213+
2214+ | Synopsis | |
2215+ | -------------------------- | --------------------------------------- |
2216+ | Approximate WIT signature | ` func<cancellable?>(t: thread) -> bool ` |
2217+ | Canonical ABI signature | ` [t:i32] -> [i32] ` |
2218+
2219+ The ` thread.yield-then-promote ` built-in immediately resumes execution of the
2220+ thread ` t ` if ` t ` is in a "ready" state, in any case leaving the current thread
2221+ in a "ready" state.
2222+
2223+ For details, see [ Thread Built-ins] in the concurrency explainer and
2224+ [ ` canon_thread_yield_then_promote ` ] in the Canonical ABI explainer.
21872225
21882226###### 🧵② ` thread.spawn-ref `
21892227
@@ -3282,12 +3320,15 @@ For some use-case-focused, worked examples, see:
32823320[ `canon_error_context_debug_message` ] : CanonicalABI.md#-canon-error-contextdebug-message
32833321[ `canon_error_context_drop` ] : CanonicalABI.md#-canon-error-contextdrop
32843322[ `canon_thread_index` ] : CanonicalABI.md#-canon-threadindex
3323+ [ `canon_thread_exit` ] : CanonicalABI.md#-canon-threadexit
32853324[ `canon_thread_new_indirect` ] : CanonicalABI.md#-canon-threadnew-indirect
3286- [ `canon_thread_suspend` ] : CanonicalABI.md#-canon-threadsuspend
3287- [ `canon_thread_switch_to` ] : CanonicalABI.md#-canon-threadswitch-to
32883325[ `canon_thread_resume_later` ] : CanonicalABI.md#-canon-threadresume-later
3289- [ `canon_thread_yield_to ` ] : CanonicalABI.md#-canon-threadyield-to
3326+ [ `canon_thread_suspend ` ] : CanonicalABI.md#-canon-threadsuspend
32903327[ `canon_thread_yield` ] : CanonicalABI.md#-canon-threadyield
3328+ [ `canon_thread_suspend_then_resume` ] : CanonicalABI.md#-canon-threadsuspend-then-resume
3329+ [ `canon_thread_yield_then_resume` ] : CanonicalABI.md#-canon-threadyield-then-resume
3330+ [ `canon_thread_suspend_then_promote` ] : CanonicalABI.md#-canon-threadsuspend-then-promote
3331+ [ `canon_thread_yield_then_promote` ] : CanonicalABI.md#-canon-threadyield-then-promote
32913332[ `canon_thread_spawn_ref` ] : CanonicalABI.md#-canon-threadspawn-ref
32923333[ `canon_thread_spawn_indirect` ] : CanonicalABI.md#-canon-threadspawn-indirect
32933334[ `canon_thread_available_parallelism` ] : CanonicalABI.md#-canon-threadavailable_parallelism
0 commit comments