Minimal native concurrency primitives for MoonBit.
moon add Nanaloveyuki/sync@0.7.1import {
"Nanaloveyuki/sync",
}import {
"Nanaloveyuki/sync/unsafe",
}
let (sender, receiver) = try! @sync.owned_bytes_bounded(32)
let worker_sender = try! sender.share()
let worker = try! @unsafe.spawn(fn() raise {
ignore(worker_sender.send(b"serialized request"))
})
match try! receiver.recv() {
Some(payload) => handle_ipc(payload)
None => ()
}
worker.join()let (sender, receiver) = try! @sync.owned_bytes_bounded_with_limits(
64,
max_message_bytes=1024 * 1024,
max_queued_bytes=8 * 1024 * 1024,
)
match try! sender.send_checked(payload) {
@sync.OwnedBytesSendResult::Sent => ()
@sync.OwnedBytesSendResult::MessageTooLarge(actual, maximum) =>
report_rejected_payload(actual, maximum)
@sync.OwnedBytesSendResult::Closed => ()
}let worker = try! @unsafe.spawn(fn() raise {
// Capture only thread-local data or shared native handles.
do_native_work()
})
worker.join()| Before | 0.7 |
|---|---|
| @sync.Once | @unsafe.Once |
| @sync.RwLock | @unsafe.RwLock |
| Nanaloveyuki/sync/once | Nanaloveyuki/sync/unsafe/once |
| Nanaloveyuki/sync/rwlock | Nanaloveyuki/sync/unsafe/rwlock |
| Before | 0.3.0 |
|---|---|
| @sync.spawn, @sync.Thread, @sync.ThreadPool | @unsafe.spawn, @unsafe.Thread, @unsafe.ThreadPool |
| @sync.bounded, @sync.Sender, @sync.Receiver | @unsafe.bounded, @unsafe.Sender, @unsafe.Receiver |
| @sync.Mutex, @sync.Condvar | @unsafe.Mutex, @unsafe.Condvar |
| Primitive | Close and drop behavior |
|---|---|
| OwnedBytesSender | close is idempotent. The final sender drop closes the channel. |
| OwnedBytesReceiver | close is idempotent and wakes blocked endpoints. Queued messages drain before recv returns None. |
| unsafe.Sender / unsafe.Receiver | Their close and drain semantics are unchanged, but payload ownership remains caller-enforced. |
| unsafe.Thread / unsafe.UnsafeThread[T] | join or detach is required exactly once; dropping a joinable handle aborts. |
| unsafe.ThreadPool | close rejects new tasks. shutdown drains accepted tasks, is idempotent from external threads, and rejects calls from a pool worker. |
moon fmt --check
moon check --target native --deny-warn
moon test --target native --deny-warnpython3 scripts/run-asan.py --repo-root .
python3 scripts/run-tsan.py --repo-root .fn owned_bytes_bounded_with_limits(capacity : Int, max_message_bytes~ : Int, max_queued_bytes~ : Int) -> (OwnedBytesSender, OwnedBytesReceiver) raise SyncErrorMinimal native concurrency primitives for MoonBit.