@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/ascii.sa
ADDED
package/sa_std/ascii.sal
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import "core/ascii.sal"
|
package/sa_std/async.sla
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// sa_std/async.sla — minimal multi-threaded async task executor, pure SLA.
|
|
2
|
+
//
|
|
3
|
+
// Layered over CI-proven primitives:
|
|
4
|
+
// - mpsc::channel() pipes (SLA surface; per-worker — Receiver is not Clone)
|
|
5
|
+
// - thread::spawn(^|| f(...)) OS threads
|
|
6
|
+
// - Arc<Mutex<T>> shared state
|
|
7
|
+
// - Instant / thread::sleep time
|
|
8
|
+
//
|
|
9
|
+
// Programming model:
|
|
10
|
+
// Each worker owns one pipe (Sender<i32>, Receiver<i32>). A task is a u64 id
|
|
11
|
+
// polled by a worker-side poll fn: it returns 0 when complete, otherwise the
|
|
12
|
+
// number of milliseconds to back off before re-enqueueing the id on the
|
|
13
|
+
// same pipe. Shared results live in Arc<Mutex<i32>> cells.
|
|
14
|
+
//
|
|
15
|
+
// sched_spawn_worker(...) -> start a drain thread for one pipe
|
|
16
|
+
// sched_backoff_ms(d) -> cooperative backoff before re-enqueue
|
|
17
|
+
// sched_now_ns() -> monotonic clock
|
|
18
|
+
//
|
|
19
|
+
// Async-fn integration (verified in scratch/async_p1 t6-t8):
|
|
20
|
+
// An async fn call produces a `future<T>` value that can be moved across
|
|
21
|
+
// functions AND across threads (thread::spawn(^|| drive(f))). Drive it to
|
|
22
|
+
// completion with a polling loop; future::defer_ready(v).await suspends on
|
|
23
|
+
// the first poll and resumes with v on the second. The loop-block_on below
|
|
24
|
+
// is the reference driver (replaces demo-09's poll-once-else-panic form).
|
|
25
|
+
//
|
|
26
|
+
// NOTE: a shared multi-consumer ready queue needs Receiver::clone or the raw
|
|
27
|
+
// MPSC_LIST macros with compiler-generated out temporaries; both are follow-up
|
|
28
|
+
// work tracked under the P1 runtime plan. The per-worker pipe form below is
|
|
29
|
+
// the CI-proven baseline.
|
|
30
|
+
@import "sa_std/sync/mpsc.sa"
|
|
31
|
+
@import "sa_std/sync/mutex.sa"
|
|
32
|
+
@import "sa_std/core/result.sa"
|
|
33
|
+
@import "sa_std/core/arc.sa"
|
|
34
|
+
@import "sa_std/thread.sa"
|
|
35
|
+
@import "sa_std/time.sla"
|
|
36
|
+
@import "sa_std/future.sa"
|
|
37
|
+
@import "sa_std/core/waker.sa"
|
|
38
|
+
@import "sa_std/pin.sa"
|
|
39
|
+
@import "sa_std/ptr.sa"
|
|
40
|
+
@import "sa_std/core/box.sa"
|
|
41
|
+
|
|
42
|
+
struct WorkerPipe {
|
|
43
|
+
tx: Sender<i32>,
|
|
44
|
+
rx: Receiver<i32>,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
fn sched_now_ns() -> u64 {
|
|
48
|
+
let started = Instant::now();
|
|
49
|
+
return started.raw_ns();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
fn sched_get(c: Arc<Mutex<i32> >) -> i32 {
|
|
53
|
+
let g = (*c).lock().unwrap();
|
|
54
|
+
return *g;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
fn sched_set(c: Arc<Mutex<i32> >, v: i32) {
|
|
58
|
+
let g = (*c).lock().unwrap();
|
|
59
|
+
*g = v;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
fn sched_bump(c: Arc<Mutex<i32> >) -> i32 {
|
|
63
|
+
let g = (*c).lock().unwrap();
|
|
64
|
+
let cur = *g;
|
|
65
|
+
let next = cur + 1;
|
|
66
|
+
*g = next;
|
|
67
|
+
return next;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Cooperative backoff for a pending task: quarter of the remaining wait,
|
|
71
|
+
// minimum 1ms. Returns 0 once the deadline has passed.
|
|
72
|
+
fn sched_backoff_ms(deadline_ns: u64) -> u64 {
|
|
73
|
+
let now = sched_now_ns();
|
|
74
|
+
if now >= deadline_ns {
|
|
75
|
+
return 0;
|
|
76
|
+
};
|
|
77
|
+
let remaining_ms = (deadline_ns - now) / 1000000;
|
|
78
|
+
let mut step: u64 = remaining_ms / 4;
|
|
79
|
+
if step < 1 {
|
|
80
|
+
step = 1;
|
|
81
|
+
};
|
|
82
|
+
return step;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
fn sched_new_pipe() -> WorkerPipe {
|
|
86
|
+
let pair = mpsc::channel();
|
|
87
|
+
return WorkerPipe { tx: pair.0, rx: pair.1 };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Looping block_on: polls the future until Ready; on Pending backs off ~1ms
|
|
91
|
+
// and re-polls. Panics if not ready within `timeout_ms`. Time-driven
|
|
92
|
+
// re-polling matches the cooperative baseline (no wake channel yet).
|
|
93
|
+
fn sched_block_on_timeout(future: future<i32>, timeout_ms: u64) -> i32 {
|
|
94
|
+
let data: ptr = PTR_NULL();
|
|
95
|
+
let raw = RAW_WAKER_NEW(data, data);
|
|
96
|
+
let waker = WAKER_FROM_RAW(raw);
|
|
97
|
+
let context = CONTEXT_FROM_WAKER(waker);
|
|
98
|
+
let boxed = Box::new(future);
|
|
99
|
+
let future_ref = *boxed;
|
|
100
|
+
let pinned = stack_alloc();
|
|
101
|
+
PIN_MUT_NEW(pinned, future_ref);
|
|
102
|
+
|
|
103
|
+
let started = Instant::now();
|
|
104
|
+
let deadline_ns = started.raw_ns() + timeout_ms * 1000000;
|
|
105
|
+
while sched_now_ns() < deadline_ns {
|
|
106
|
+
let poll = FUTURE_READY_POLL_STATE(PIN_MUT_GET_MUT(pinned));
|
|
107
|
+
let ready = POLL_IS_READY(poll);
|
|
108
|
+
if ready == true {
|
|
109
|
+
let value: i32 = POLL_VALUE(poll);
|
|
110
|
+
return value;
|
|
111
|
+
};
|
|
112
|
+
THREAD_SLEEP_MS(1);
|
|
113
|
+
}
|
|
114
|
+
panic(96);
|
|
115
|
+
}
|
|
116
|
+
|