@salang/sa 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/sa.js +19 -1
- package/package.json +8 -7
- package/sa_std/alloc/layout.sal +12 -0
- package/sa_std/alloc/prelude.sa +1 -0
- package/sa_std/alloc/prelude.sal +1 -0
- package/sa_std/alloc/string.sa +3 -0
- package/sa_std/alloc/vec.sa +684 -0
- package/sa_std/alloc/vec.sal +4 -0
- package/sa_std/any.sa +130 -0
- package/sa_std/any.sal +23 -0
- package/sa_std/array.sa +1876 -0
- package/sa_std/ascii.sa +2 -0
- package/sa_std/ascii.sal +1 -0
- package/sa_std/async.sla +116 -0
- package/sa_std/binary_heap.sa +3003 -0
- package/sa_std/binary_heap.sal +7 -0
- package/sa_std/borrow.sa +171 -0
- package/sa_std/borrow.sal +13 -0
- package/sa_std/btree_map.sa +2210 -0
- package/sa_std/btree_map.sal +11 -0
- package/sa_std/btree_set.sa +1072 -0
- package/sa_std/btree_set.sal +6 -0
- package/sa_std/char.sa +1309 -0
- package/sa_std/char.sal +50 -0
- package/sa_std/cmp.sa +554 -0
- package/sa_std/cmp.sal +14 -0
- package/sa_std/collections/binary_heap.sa +1 -0
- package/sa_std/collections/btree_map.sa +1 -0
- package/sa_std/collections/btree_set.sa +1 -0
- package/sa_std/collections/hashmap.sa +1 -0
- package/sa_std/collections/hashset.sa +1 -0
- package/sa_std/collections/linked_list.sa +1120 -0
- package/sa_std/collections/linked_list.sal +10 -0
- package/sa_std/collections/prelude.sa +7 -0
- package/sa_std/collections/prelude.sal +1 -0
- package/sa_std/collections/vec_deque.sa +1 -0
- package/sa_std/collections.sal +13 -0
- package/sa_std/convert.sa +1115 -0
- package/sa_std/convert.sal +24 -0
- package/sa_std/core/arc.sa +233 -0
- package/sa_std/core/arc.sal +4 -0
- package/sa_std/core/ascii.sa +784 -0
- package/sa_std/core/ascii.sal +34 -0
- package/sa_std/core/bit.sa +41 -0
- package/sa_std/core/box.sa +1 -0
- package/sa_std/core/box.sal +2 -0
- package/sa_std/core/cell.sa +108 -0
- package/sa_std/core/cell.sal +5 -0
- package/sa_std/core/cleanup.sa +26 -0
- package/sa_std/core/control.sa +20 -0
- package/sa_std/core/derive.sa +60 -0
- package/sa_std/core/derive.sal +1 -0
- package/sa_std/core/dispatch.sa +7 -0
- package/sa_std/core/dispatch.sal +5 -0
- package/sa_std/core/future.sa +777 -0
- package/sa_std/core/future.sal +73 -0
- package/sa_std/core/hash.sa +48 -0
- package/sa_std/core/iter.sa +2805 -0
- package/sa_std/core/iter.sal +4 -0
- package/sa_std/core/loop.sa +60 -0
- package/sa_std/core/mem.sa +220 -0
- package/sa_std/core/option.sa +825 -0
- package/sa_std/core/option.sal +11 -0
- package/sa_std/core/panic.sa +23 -0
- package/sa_std/core/panic.sal +12 -0
- package/sa_std/core/prelude.sa +18 -0
- package/sa_std/core/prelude.sal +18 -0
- package/sa_std/core/rc.sa +225 -0
- package/sa_std/core/rc.sal +4 -0
- package/sa_std/core/refcell.sa +283 -0
- package/sa_std/core/refcell.sal +13 -0
- package/sa_std/core/result.sa +708 -0
- package/sa_std/core/result.sal +6 -0
- package/sa_std/core/rust_patterns.sal +295 -0
- package/sa_std/core/sa_core.sa +84 -0
- package/sa_std/core/slice.sa +4021 -0
- package/sa_std/core/slice.sal +7 -0
- package/sa_std/core/task.sa +112 -0
- package/sa_std/core/task.sal +15 -0
- package/sa_std/core/trait_object.sa +26 -0
- package/sa_std/core/trait_object.sal +4 -0
- package/sa_std/core/waker.sa +289 -0
- package/sa_std/core/waker.sal +31 -0
- package/sa_std/core/weak.sa +2 -0
- package/sa_std/core/weak.sal +4 -0
- package/sa_std/cow.sa +3 -0
- package/sa_std/cow.sal +2 -0
- package/sa_std/cstring.sa +3 -0
- package/sa_std/cstring.sal +2 -0
- package/sa_std/default.sa +99 -0
- package/sa_std/duration.sa +3 -0
- package/sa_std/duration.sal +2 -0
- package/sa_std/encoding/json.sa +259 -0
- package/sa_std/encoding/json.sai +54 -0
- package/sa_std/encoding/json.sal +35 -0
- package/sa_std/encoding/prelude.sa +1 -0
- package/sa_std/encoding/prelude.sal +0 -0
- package/sa_std/env.sa +390 -0
- package/sa_std/env.sai +25 -0
- package/sa_std/error.sa +253 -0
- package/sa_std/error.sal +44 -0
- package/sa_std/ffi/cstring.sa +3 -0
- package/sa_std/ffi/cstring.sal +1 -0
- package/sa_std/ffi/prelude.sa +2 -0
- package/sa_std/ffi/prelude.sal +2 -0
- package/sa_std/ffi.sa +635 -0
- package/sa_std/ffi.sal +51 -0
- package/sa_std/fmt.sa +2 -0
- package/sa_std/fmt.sai +18 -0
- package/sa_std/fmt.sal +35 -0
- package/sa_std/fs.sa +1023 -0
- package/sa_std/fs.sai +127 -0
- package/sa_std/fs.sal +51 -0
- package/sa_std/future.sa +2 -0
- package/sa_std/future.sal +1 -0
- package/sa_std/hash.sa +1486 -0
- package/sa_std/hash.sal +13 -0
- package/sa_std/hashmap.sa +1962 -0
- package/sa_std/hashmap.sal +20 -0
- package/sa_std/hashset.sa +1004 -0
- package/sa_std/hashset.sal +18 -0
- package/sa_std/http2.sa +78 -0
- package/sa_std/http2.sai +26 -0
- package/sa_std/http2.sal +36 -0
- package/sa_std/instant.sa +3 -0
- package/sa_std/instant.sal +2 -0
- package/sa_std/io/buf_reader.sa +43 -0
- package/sa_std/io/buf_writer.sa +35 -0
- package/sa_std/io/bufio.sa +4 -0
- package/sa_std/io/bufio.sal +4 -0
- package/sa_std/io/prelude.sa +1 -0
- package/sa_std/io/prelude.sal +1 -0
- package/sa_std/io/print.sa +2 -0
- package/sa_std/io/print.sai +3 -0
- package/sa_std/io.sa +925 -0
- package/sa_std/io.sai +25 -0
- package/sa_std/io.sal +84 -0
- package/sa_std/iter.sa +2 -0
- package/sa_std/iter.sal +1 -0
- package/sa_std/join_handle.sa +3 -0
- package/sa_std/join_handle.sal +2 -0
- package/sa_std/libsa_async.sa +80 -0
- package/sa_std/m_async.sa +137 -0
- package/sa_std/m_async.sal +30 -0
- package/sa_std/m_async.sla +2 -0
- package/sa_std/manually_drop.sa +3 -0
- package/sa_std/manually_drop.sal +2 -0
- package/sa_std/marker/phantom_data.sa +3 -0
- package/sa_std/marker/phantom_data.sal +1 -0
- package/sa_std/marker/prelude.sa +4 -0
- package/sa_std/marker/prelude.sal +4 -0
- package/sa_std/marker.sa +220 -0
- package/sa_std/marker.sal +15 -0
- package/sa_std/math.sa +84 -0
- package/sa_std/math.sai +10 -0
- package/sa_std/mem/manually_drop.sa +3 -0
- package/sa_std/mem/manually_drop.sal +1 -0
- package/sa_std/mem/prelude.sa +2 -0
- package/sa_std/mem/prelude.sal +2 -0
- package/sa_std/mem.sa +564 -0
- package/sa_std/mem.sal +40 -0
- package/sa_std/modstate.sai +19 -0
- package/sa_std/net.sa +4227 -0
- package/sa_std/net.sai +239 -0
- package/sa_std/net.sal +159 -0
- package/sa_std/netx.sa +85 -0
- package/sa_std/netx.sai +11 -0
- package/sa_std/netx.sal +39 -0
- package/sa_std/nonzero.sa +3 -0
- package/sa_std/nonzero.sal +2 -0
- package/sa_std/num/nonzero.sa +3 -0
- package/sa_std/num/nonzero.sal +1 -0
- package/sa_std/num/prelude.sa +3 -0
- package/sa_std/num/prelude.sal +3 -0
- package/sa_std/num.sa +17302 -0
- package/sa_std/num.sai +11 -0
- package/sa_std/num.sal +341 -0
- package/sa_std/ops.sa +1884 -0
- package/sa_std/ops.sal +68 -0
- package/sa_std/option.sa +2 -0
- package/sa_std/option.sal +1 -0
- package/sa_std/os/fd.sa +96 -0
- package/sa_std/os/fd.sai +7 -0
- package/sa_std/os/fd.sal +11 -0
- package/sa_std/os/prelude.sa +2 -0
- package/sa_std/os/prelude.sal +1 -0
- package/sa_std/os/unix_ffi.sa +271 -0
- package/sa_std/panic.sa +1 -0
- package/sa_std/panic.sal +1 -0
- package/sa_std/path.sa +3170 -0
- package/sa_std/path.sal +12 -0
- package/sa_std/phantom_data.sa +3 -0
- package/sa_std/phantom_data.sal +2 -0
- package/sa_std/pin.sa +79 -0
- package/sa_std/pin.sal +5 -0
- package/sa_std/plugin_async.sa +90 -0
- package/sa_std/plugin_async.sal +29 -0
- package/sa_std/plugin_async.sla +4 -0
- package/sa_std/plugin_http_async.sa +46 -0
- package/sa_std/plugin_http_server.sa +61 -0
- package/sa_std/plugin_http_server.sla +2 -0
- package/sa_std/plugin_sqlite.sa +106 -0
- package/sa_std/plugin_sqlite.sla +2 -0
- package/sa_std/prelude.sa +60 -0
- package/sa_std/prelude.sal +55 -0
- package/sa_std/process.sa +916 -0
- package/sa_std/process.sai +57 -0
- package/sa_std/process.sal +27 -0
- package/sa_std/ptr.sa +503 -0
- package/sa_std/ptr.sal +2 -0
- package/sa_std/result.sa +2 -0
- package/sa_std/result.sal +1 -0
- package/sa_std/rust_core.sa +51 -0
- package/sa_std/rust_core.sal +26 -0
- package/sa_std/sa.mod +7 -0
- package/sa_std/sort.sa +156 -0
- package/sa_std/str.sla +13 -0
- package/sa_std/string.sa +12240 -0
- package/sa_std/string.sai +25 -0
- package/sa_std/string.sal +17 -0
- package/sa_std/string_format.sa +269 -0
- package/sa_std/sync/atomic.sa +1500 -0
- package/sa_std/sync/atomic.sal +45 -0
- package/sa_std/sync/barrier.sa +105 -0
- package/sa_std/sync/barrier.sal +7 -0
- package/sa_std/sync/condvar.sa +240 -0
- package/sa_std/sync/condvar.sal +4 -0
- package/sa_std/sync/mpsc.sa +758 -0
- package/sa_std/sync/mpsc.sal +42 -0
- package/sa_std/sync/mpsc_list.sa +255 -0
- package/sa_std/sync/mpsc_list.sal +3 -0
- package/sa_std/sync/mutex.sa +182 -0
- package/sa_std/sync/mutex.sal +7 -0
- package/sa_std/sync/once.sa +371 -0
- package/sa_std/sync/once.sal +31 -0
- package/sa_std/sync/poison.sa +36 -0
- package/sa_std/sync/poison.sal +11 -0
- package/sa_std/sync/prelude.sa +8 -0
- package/sa_std/sync/prelude.sal +7 -0
- package/sa_std/sync/rwlock.sa +369 -0
- package/sa_std/sync/rwlock.sal +13 -0
- package/sa_std/task.sa +2 -0
- package/sa_std/task.sal +1 -0
- package/sa_std/term.sa +2 -0
- package/sa_std/term.sai +10 -0
- package/sa_std/term.sal +33 -0
- package/sa_std/testing/assert.sai +4 -0
- package/sa_std/testing/mock_io.sa +174 -0
- package/sa_std/testing/mock_io.sal +5 -0
- package/sa_std/testing/prelude.sa +2 -0
- package/sa_std/testing/prelude.sal +1 -0
- package/sa_std/text/prelude.sa +1 -0
- package/sa_std/text/prelude.sal +1 -0
- package/sa_std/text/regex.sa +2 -0
- package/sa_std/text/regex.sai +9 -0
- package/sa_std/text/regex.sal +33 -0
- package/sa_std/thread/join_handle.sa +3 -0
- package/sa_std/thread/join_handle.sal +1 -0
- package/sa_std/thread/prelude.sa +4 -0
- package/sa_std/thread/prelude.sal +3 -0
- package/sa_std/thread.sa +160 -0
- package/sa_std/thread.sai +11 -0
- package/sa_std/thread.sal +4 -0
- package/sa_std/thread_local.sa +45 -0
- package/sa_std/thread_local.sai +9 -0
- package/sa_std/time/duration.sa +3 -0
- package/sa_std/time/duration.sal +1 -0
- package/sa_std/time/instant.sa +3 -0
- package/sa_std/time/instant.sal +1 -0
- package/sa_std/time/prelude.sa +4 -0
- package/sa_std/time/prelude.sal +4 -0
- package/sa_std/time.sa +850 -0
- package/sa_std/time.sai +37 -0
- package/sa_std/time.sal +35 -0
- package/sa_std/time.sla +67 -0
- package/sa_std/tls_client.sai +39 -0
- package/sa_std/vec.sa +5754 -0
- package/sa_std/vec.sal +1 -0
- package/sa_std/vec_deque.sa +4925 -0
- package/sa_std/vec_deque.sal +8 -0
- package/sa_std/vec_runtime_macros.sa +11 -0
- package/sa_std/ws_client.sai +57 -0
package/sa_std/thread.sa
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
@import "thread.sai"
|
|
2
|
+
@import "time.sa"
|
|
3
|
+
|
|
4
|
+
[MACRO] THREAD_SPAWN %out_handle, %entry_ptr, %arg_ptr
|
|
5
|
+
%out_handle = call @pthread_spawn(%entry_ptr, %arg_ptr)
|
|
6
|
+
[END_MACRO]
|
|
7
|
+
|
|
8
|
+
[MACRO] THREAD_SPAWN_DETACHED %out_handle, %entry_ptr, %arg_ptr
|
|
9
|
+
%out_handle = call @pthread_spawn_detached(%entry_ptr, %arg_ptr)
|
|
10
|
+
[END_MACRO]
|
|
11
|
+
|
|
12
|
+
[MACRO] THREAD_JOIN_STATUS %out_status, %handle, %out_ptr
|
|
13
|
+
%out_status = call @pthread_join(%handle, *%out_ptr)
|
|
14
|
+
[END_MACRO]
|
|
15
|
+
|
|
16
|
+
[MACRO] THREAD_DROP %handle
|
|
17
|
+
call @pthread_drop(%handle)
|
|
18
|
+
[END_MACRO]
|
|
19
|
+
|
|
20
|
+
[MACRO] THREAD_CURRENT_ID %out_id
|
|
21
|
+
%out_id = call @sa_thread_current_id()
|
|
22
|
+
[END_MACRO]
|
|
23
|
+
|
|
24
|
+
// Rust-named aliases for current-thread identity and cooperative yield.
|
|
25
|
+
|
|
26
|
+
[MACRO] THREAD_CURRENT %out_id
|
|
27
|
+
EXPAND THREAD_CURRENT_ID %out_id
|
|
28
|
+
[END_MACRO]
|
|
29
|
+
|
|
30
|
+
[MACRO] THREAD_YIELD %out_status
|
|
31
|
+
EXPAND THREAD_YIELD_NOW %out_status
|
|
32
|
+
[END_MACRO]
|
|
33
|
+
|
|
34
|
+
[MACRO] THREAD_YIELD_NOW %out_status
|
|
35
|
+
%out_status = call @sa_thread_yield_now()
|
|
36
|
+
[END_MACRO]
|
|
37
|
+
|
|
38
|
+
[MACRO] THREAD_AS_PTHREAD_T %out_status, %out_raw, %handle
|
|
39
|
+
__thread_as_pthread_slot_%out_raw = stack_alloc 8
|
|
40
|
+
%out_status = call @sa_thread_as_pthread_t(%handle, &__thread_as_pthread_slot_%out_raw)
|
|
41
|
+
%out_raw = load __thread_as_pthread_slot_%out_raw+0 as u64
|
|
42
|
+
[END_MACRO]
|
|
43
|
+
|
|
44
|
+
[MACRO] THREAD_INTO_PTHREAD_T %out_status, %out_raw, %handle
|
|
45
|
+
__thread_into_pthread_slot_%out_raw = stack_alloc 8
|
|
46
|
+
%out_status = call @sa_thread_into_pthread_t(%handle, &__thread_into_pthread_slot_%out_raw)
|
|
47
|
+
%out_raw = load __thread_into_pthread_slot_%out_raw+0 as u64
|
|
48
|
+
[END_MACRO]
|
|
49
|
+
|
|
50
|
+
[MACRO] THREAD_RAW_PTHREAD_JOIN_STATUS %out_status, %raw, %out_ptr
|
|
51
|
+
%out_status = call @sa_thread_raw_pthread_join(%raw, *%out_ptr)
|
|
52
|
+
[END_MACRO]
|
|
53
|
+
|
|
54
|
+
// Builder-style SSA facade over existing spawn helpers.
|
|
55
|
+
// State is a single detached flag (0/1); no stack-size/name runtime ABI yet.
|
|
56
|
+
|
|
57
|
+
[MACRO] THREAD_BUILDER_NEW %out_detached
|
|
58
|
+
%out_detached = add 0, 0
|
|
59
|
+
[END_MACRO]
|
|
60
|
+
|
|
61
|
+
[MACRO] THREAD_BUILDER_WITH_DETACHED %out_detached, %in_detached, %flag
|
|
62
|
+
__thread_builder_zero_%out_detached = eq %flag, 0
|
|
63
|
+
br __thread_builder_zero_%out_detached -> L_THREAD_BUILDER_DETACHED_OFF_%out_detached, L_THREAD_BUILDER_DETACHED_ON_%out_detached
|
|
64
|
+
L_THREAD_BUILDER_DETACHED_OFF_%out_detached:
|
|
65
|
+
%out_detached = add 0, 0
|
|
66
|
+
!__thread_builder_zero_%out_detached
|
|
67
|
+
!%in_detached
|
|
68
|
+
jmp L_THREAD_BUILDER_DETACHED_END_%out_detached
|
|
69
|
+
L_THREAD_BUILDER_DETACHED_ON_%out_detached:
|
|
70
|
+
%out_detached = add 0, 1
|
|
71
|
+
!__thread_builder_zero_%out_detached
|
|
72
|
+
!%in_detached
|
|
73
|
+
jmp L_THREAD_BUILDER_DETACHED_END_%out_detached
|
|
74
|
+
L_THREAD_BUILDER_DETACHED_END_%out_detached:
|
|
75
|
+
[END_MACRO]
|
|
76
|
+
|
|
77
|
+
[MACRO] THREAD_BUILDER_SPAWN %out_handle, %detached, %entry_ptr, %arg_ptr
|
|
78
|
+
__thread_builder_spawn_detached_%out_handle = ne %detached, 0
|
|
79
|
+
br __thread_builder_spawn_detached_%out_handle -> L_THREAD_BUILDER_SPAWN_DETACHED_%out_handle, L_THREAD_BUILDER_SPAWN_JOINABLE_%out_handle
|
|
80
|
+
L_THREAD_BUILDER_SPAWN_DETACHED_%out_handle:
|
|
81
|
+
EXPAND THREAD_SPAWN_DETACHED %out_handle, %entry_ptr, %arg_ptr
|
|
82
|
+
!__thread_builder_spawn_detached_%out_handle
|
|
83
|
+
jmp L_THREAD_BUILDER_SPAWN_END_%out_handle
|
|
84
|
+
L_THREAD_BUILDER_SPAWN_JOINABLE_%out_handle:
|
|
85
|
+
EXPAND THREAD_SPAWN %out_handle, %entry_ptr, %arg_ptr
|
|
86
|
+
!__thread_builder_spawn_detached_%out_handle
|
|
87
|
+
jmp L_THREAD_BUILDER_SPAWN_END_%out_handle
|
|
88
|
+
L_THREAD_BUILDER_SPAWN_END_%out_handle:
|
|
89
|
+
[END_MACRO]
|
|
90
|
+
|
|
91
|
+
// Sleep helpers aliased over the existing time facade.
|
|
92
|
+
|
|
93
|
+
[MACRO] THREAD_SLEEP_NS %ns
|
|
94
|
+
EXPAND TIME_SLEEP_NS %ns
|
|
95
|
+
[END_MACRO]
|
|
96
|
+
|
|
97
|
+
[MACRO] THREAD_SLEEP_MS %ms
|
|
98
|
+
EXPAND TIME_SLEEP_MS %ms
|
|
99
|
+
[END_MACRO]
|
|
100
|
+
|
|
101
|
+
// Sleep for a concrete Duration-like nanosecond scalar.
|
|
102
|
+
[MACRO] THREAD_SLEEP_DURATION_NS %duration_ns
|
|
103
|
+
EXPAND THREAD_SLEEP_NS %duration_ns
|
|
104
|
+
[END_MACRO]
|
|
105
|
+
|
|
106
|
+
// JoinHandle value facade over the pthread-backed thread handle.
|
|
107
|
+
[MACRO] JOIN_HANDLE_NEW %out_join_handle, %raw_handle
|
|
108
|
+
%out_join_handle = alloc JoinHandle_SIZE
|
|
109
|
+
store %out_join_handle+JoinHandle_handle, %raw_handle as i32
|
|
110
|
+
store %out_join_handle+JoinHandle_result, 0 as u64
|
|
111
|
+
[END_MACRO]
|
|
112
|
+
|
|
113
|
+
[MACRO] JOIN_HANDLE_JOIN_STATUS %out_status, %join_handle, %out_ptr
|
|
114
|
+
__join_handle_raw_%out_status = load %join_handle+JoinHandle_handle as i32
|
|
115
|
+
__join_handle_joinable_%out_status = ne __join_handle_raw_%out_status, 0
|
|
116
|
+
br __join_handle_joinable_%out_status -> L_JOIN_HANDLE_JOIN_CALL_%out_status, L_JOIN_HANDLE_JOINED_%out_status
|
|
117
|
+
L_JOIN_HANDLE_JOIN_CALL_%out_status:
|
|
118
|
+
%out_status = call @pthread_join(__join_handle_raw_%out_status, *%out_ptr)
|
|
119
|
+
store %join_handle+JoinHandle_result, %out_status as u64
|
|
120
|
+
store %join_handle+JoinHandle_handle, 0 as i32
|
|
121
|
+
!__join_handle_joinable_%out_status
|
|
122
|
+
!__join_handle_raw_%out_status
|
|
123
|
+
jmp L_JOIN_HANDLE_JOIN_DONE_%out_status
|
|
124
|
+
L_JOIN_HANDLE_JOINED_%out_status:
|
|
125
|
+
%out_status = load %join_handle+JoinHandle_result as i32
|
|
126
|
+
!__join_handle_joinable_%out_status
|
|
127
|
+
!__join_handle_raw_%out_status
|
|
128
|
+
L_JOIN_HANDLE_JOIN_DONE_%out_status:
|
|
129
|
+
[END_MACRO]
|
|
130
|
+
|
|
131
|
+
[MACRO] JOIN_HANDLE_IS_FINISHED %out_done, %join_handle
|
|
132
|
+
__join_handle_state_%out_done = load %join_handle+JoinHandle_handle as i32
|
|
133
|
+
%out_done = eq __join_handle_state_%out_done, 0
|
|
134
|
+
!__join_handle_state_%out_done
|
|
135
|
+
[END_MACRO]
|
|
136
|
+
|
|
137
|
+
[MACRO] JOIN_HANDLE_JOIN %out_status, %join_handle, %out_ptr
|
|
138
|
+
EXPAND JOIN_HANDLE_JOIN_STATUS %out_status, %join_handle, %out_ptr
|
|
139
|
+
[END_MACRO]
|
|
140
|
+
|
|
141
|
+
[MACRO] JOIN_HANDLE_DROP %join_handle
|
|
142
|
+
__join_handle_drop_raw_%join_handle = load %join_handle+JoinHandle_handle as i32
|
|
143
|
+
__join_handle_drop_live_%join_handle = ne __join_handle_drop_raw_%join_handle, 0
|
|
144
|
+
br __join_handle_drop_live_%join_handle -> L_JOIN_HANDLE_DROP_CALL_%join_handle, L_JOIN_HANDLE_DROP_DONE_%join_handle
|
|
145
|
+
L_JOIN_HANDLE_DROP_CALL_%join_handle:
|
|
146
|
+
call @pthread_drop(__join_handle_drop_raw_%join_handle)
|
|
147
|
+
L_JOIN_HANDLE_DROP_DONE_%join_handle:
|
|
148
|
+
store %join_handle+JoinHandle_handle, 0 as i32
|
|
149
|
+
!__join_handle_drop_raw_%join_handle
|
|
150
|
+
!__join_handle_drop_live_%join_handle
|
|
151
|
+
!%join_handle
|
|
152
|
+
[END_MACRO]
|
|
153
|
+
|
|
154
|
+
[MACRO] JOIN_HANDLE_AS_RAW %out_raw, %join_handle
|
|
155
|
+
%out_raw = load %join_handle+JoinHandle_handle as u64
|
|
156
|
+
[END_MACRO]
|
|
157
|
+
|
|
158
|
+
[MACRO] JOIN_HANDLE_RESULT_STATUS %out_status, %join_handle
|
|
159
|
+
%out_status = load %join_handle+JoinHandle_result as i32
|
|
160
|
+
[END_MACRO]
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// SA-facing contracts for the std::thread runtime facade.
|
|
2
|
+
// Handles are opaque i32 slots owned by the Zig-backed sa_std runtime.
|
|
3
|
+
@extern pthread_spawn(*entry: ptr, *arg: ptr) -> i32
|
|
4
|
+
@extern pthread_spawn_detached(*entry: ptr, *arg: ptr) -> i32
|
|
5
|
+
@extern pthread_join(handle: i32, *out: ptr) -> i32
|
|
6
|
+
@extern pthread_drop(handle: i32) -> void
|
|
7
|
+
@extern sa_thread_current_id() -> u64
|
|
8
|
+
@extern sa_thread_yield_now() -> i32
|
|
9
|
+
@extern sa_thread_as_pthread_t(handle: i32, &out_raw: ptr) -> i32
|
|
10
|
+
@extern sa_thread_into_pthread_t(handle: i32, &out_raw: ptr) -> i32
|
|
11
|
+
@extern sa_thread_raw_pthread_join(raw: u64, *out: ptr) -> i32
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Rust `thread_local!` / `LocalKey<T>` storage over the sa_thread_local_slot
|
|
2
|
+
// registry (src/runtime/sa_thread_local.zig). No second implementation lives
|
|
3
|
+
// here: this file is a thin macro facade, reusing only existing SA core
|
|
4
|
+
// (`alloc`/`load`/`store`, `call @extern`) plus the Cell u32/u64 width
|
|
5
|
+
// convention from sa_std/core/cell.sa.
|
|
6
|
+
//
|
|
7
|
+
// Rust mapping (see sarust/STD_MAP.md):
|
|
8
|
+
// thread_local! { static K: Cell<u32> } -> key = FNV1a(DefPath), slot u64
|
|
9
|
+
// LocalKey::with(|c| …) -> THREAD_LOCAL_SLOT + call indirect
|
|
10
|
+
// EagerStorage::get (internal accessor) -> THREAD_LOCAL_SLOT (the lowered
|
|
11
|
+
// ThreadLocal rvalue shape)
|
|
12
|
+
// Cell::get / Cell::set -> THREAD_LOCAL_U32_GET / SET
|
|
13
|
+
// Cell<u64> variants -> THREAD_LOCAL_U64_GET / SET
|
|
14
|
+
@import "thread_local.sai"
|
|
15
|
+
|
|
16
|
+
// Resolve (or lazily create) the calling thread's u64 slot for %key.
|
|
17
|
+
// Loud on OOM (registry returns null) via panic(1403), same family as the
|
|
18
|
+
// mpsc 1401/1402 allocation-failure codes.
|
|
19
|
+
[MACRO] THREAD_LOCAL_SLOT %out_slot, %key
|
|
20
|
+
%out_slot = call @sa_thread_local_slot(%key)
|
|
21
|
+
__tls_slot_ok_%out_slot = ne %out_slot, 0
|
|
22
|
+
br __tls_slot_ok_%out_slot -> L_TLS_SLOT_OK_%out_slot, L_TLS_SLOT_OOM_%out_slot
|
|
23
|
+
L_TLS_SLOT_OOM_%out_slot:
|
|
24
|
+
panic(1403)
|
|
25
|
+
L_TLS_SLOT_OK_%out_slot:
|
|
26
|
+
!__tls_slot_ok_%out_slot
|
|
27
|
+
[END_MACRO]
|
|
28
|
+
|
|
29
|
+
// Cell<u32> view of a resolved slot (the TLS_N corpus shape).
|
|
30
|
+
[MACRO] THREAD_LOCAL_U32_GET %out_value, %slot_reg
|
|
31
|
+
%out_value = load %slot_reg+0 as u32
|
|
32
|
+
[END_MACRO]
|
|
33
|
+
|
|
34
|
+
[MACRO] THREAD_LOCAL_U32_SET %slot_reg, %value
|
|
35
|
+
store %slot_reg+0, %value as u32
|
|
36
|
+
[END_MACRO]
|
|
37
|
+
|
|
38
|
+
// Cell<u64> view of a resolved slot.
|
|
39
|
+
[MACRO] THREAD_LOCAL_U64_GET %out_value, %slot_reg
|
|
40
|
+
%out_value = load %slot_reg+0 as u64
|
|
41
|
+
[END_MACRO]
|
|
42
|
+
|
|
43
|
+
[MACRO] THREAD_LOCAL_U64_SET %slot_reg, %value
|
|
44
|
+
store %slot_reg+0, %value as u64
|
|
45
|
+
[END_MACRO]
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// SA-facing contracts for Rust `thread_local!` storage.
|
|
2
|
+
//
|
|
3
|
+
// Backed by the pure-Zig registry in src/runtime/sa_thread_local.zig:
|
|
4
|
+
// slots are keyed by (OS thread id, key), zero-initialized, never freed.
|
|
5
|
+
// Each `thread_local!` static maps to one u64 key (FNV-1a of its rustc
|
|
6
|
+
// DefPath, computed by the sarust rsc driver so .sa stays string-free).
|
|
7
|
+
// A slot holds raw u64 bits; Cell<u32>/Cell<u64> narrow/widen at the macros.
|
|
8
|
+
@extern sa_thread_local_slot(key: u64) -> ptr
|
|
9
|
+
@extern sa_thread_local_supported(&out_supported: ptr) -> i32
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import "../time.sal"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import "../time.sal"
|