39 lines
881 B
Nim
39 lines
881 B
Nim
import chronos, chronos/threadsync
|
|
import os
|
|
|
|
type
|
|
Context = object
|
|
# Context allocated by `createShared` should contain no garbage-collected
|
|
# types!
|
|
signal: ThreadSignalPtr
|
|
value: int
|
|
|
|
proc myThread(ctx: ptr Context) {.thread.} =
|
|
echo "Doing some work in a thread"
|
|
sleep(3000)
|
|
ctx.value = 42
|
|
echo "Done, firing the signal"
|
|
discard ctx.signal.fireSync().expect("correctly initialized signal should not fail")
|
|
|
|
proc main() {.async.} =
|
|
let
|
|
signal = ThreadSignalPtr.new().expect("free file descriptor for signal")
|
|
context = createShared(Context)
|
|
context.signal = signal
|
|
|
|
var thread: Thread[ptr Context]
|
|
|
|
echo "Starting thread"
|
|
createThread(thread, myThread, context)
|
|
|
|
await signal.wait()
|
|
|
|
echo "Work done: ", context.value
|
|
|
|
joinThread(thread)
|
|
|
|
signal.close().expect("closing once works")
|
|
deallocShared(context)
|
|
|
|
waitFor main()
|