futex_wasm.odin 721 B

123456789101112131415161718192021222324252627282930313233343536
  1. //+private
  2. //+build wasm32, wasm64
  3. package sync
  4. import "core:intrinsics"
  5. import "core:time"
  6. _futex_wait :: proc(f: ^Futex, expected: u32) -> bool {
  7. s := intrinsics.wasm_memory_atomic_wait32((^u32)(f), expected, -1)
  8. return s != 0
  9. }
  10. _futex_wait_with_timeout :: proc(f: ^Futex, expected: u32, duration: time.Duration) -> bool {
  11. s := intrinsics.wasm_memory_atomic_wait32((^u32)(f), expected, i64(duration))
  12. return s != 0
  13. }
  14. _futex_signal :: proc(f: ^Futex) {
  15. loop: for {
  16. s := intrinsics.wasm_memory_atomic_notify32((^u32)(f), 1)
  17. if s >= 1 {
  18. return
  19. }
  20. }
  21. }
  22. _futex_broadcast :: proc(f: ^Futex) {
  23. loop: for {
  24. s := intrinsics.wasm_memory_atomic_notify32((^u32)(f), ~u32(0))
  25. if s >= 0 {
  26. return
  27. }
  28. }
  29. }