futex_linux.odin 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. //+private
  2. //+build linux
  3. package sync
  4. import "core:time"
  5. import "core:sys/linux"
  6. _futex_wait :: proc "contextless" (futex: ^Futex, expected: u32) -> bool {
  7. errno := linux.futex(cast(^linux.Futex) futex, linux.FUTEX_WAIT, {.PRIVATE}, expected)
  8. if errno == .ETIMEDOUT {
  9. return false
  10. }
  11. #partial switch errno {
  12. case .NONE, .EINTR, .EAGAIN:
  13. return true
  14. case:
  15. // TODO(flysand): More descriptive panic messages based on the vlaue of `errno`
  16. _panic("futex_wait failure")
  17. }
  18. }
  19. _futex_wait_with_timeout :: proc "contextless" (futex: ^Futex, expected: u32, duration: time.Duration) -> bool {
  20. if duration <= 0 {
  21. return false
  22. }
  23. errno := linux.futex(cast(^linux.Futex) futex, linux.FUTEX_WAIT, {.PRIVATE}, expected, &linux.Time_Spec{
  24. time_sec = cast(uint)(duration/1e9),
  25. time_nsec = cast(uint)(duration%1e9),
  26. })
  27. if errno == .ETIMEDOUT {
  28. return false
  29. }
  30. #partial switch errno {
  31. case .NONE, .EINTR, .EAGAIN:
  32. return true
  33. case:
  34. _panic("futex_wait_with_timeout failure")
  35. }
  36. }
  37. _futex_signal :: proc "contextless" (futex: ^Futex) {
  38. _, errno := linux.futex(cast(^linux.Futex) futex, linux.FUTEX_WAKE, {.PRIVATE}, 1)
  39. #partial switch errno {
  40. case .NONE:
  41. return
  42. case:
  43. _panic("futex_wake_single failure")
  44. }
  45. }
  46. _futex_broadcast :: proc "contextless" (futex: ^Futex) {
  47. // NOTE(flysand): This code was kinda funny and I don't want to remove it, but here I will
  48. // record history of what has been in here before
  49. // FUTEX_WAKE_PRIVATE | FUTEX_WAKE
  50. _, errno := linux.futex(cast(^linux.Futex) futex, linux.FUTEX_WAKE, {.PRIVATE}, max(i32))
  51. #partial switch errno {
  52. case .NONE:
  53. return
  54. case:
  55. _panic("_futex_wake_all failure")
  56. }
  57. }