pthread_freebsd.odin 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //+build freebsd
  2. package unix
  3. import "core:c"
  4. pthread_t :: distinct u64
  5. // pthread_t :: struct #align(16) { x: u64 }
  6. PTHREAD_COND_T_SIZE :: 8
  7. PTHREAD_MUTEXATTR_T_SIZE :: 8
  8. PTHREAD_CONDATTR_T_SIZE :: 8
  9. PTHREAD_RWLOCKATTR_T_SIZE :: 8
  10. PTHREAD_BARRIERATTR_T_SIZE :: 8
  11. // WARNING: The sizes of these things are different yet again
  12. // on non-X86!
  13. when size_of(int) == 8 {
  14. PTHREAD_ATTR_T_SIZE :: 8
  15. PTHREAD_MUTEX_T_SIZE :: 8
  16. PTHREAD_RWLOCK_T_SIZE :: 8
  17. PTHREAD_BARRIER_T_SIZE :: 8
  18. } else when size_of(int) == 4 { // TODO
  19. PTHREAD_ATTR_T_SIZE :: 32
  20. PTHREAD_MUTEX_T_SIZE :: 32
  21. PTHREAD_RWLOCK_T_SIZE :: 44
  22. PTHREAD_BARRIER_T_SIZE :: 20
  23. }
  24. pthread_cond_t :: struct #align(16) {
  25. _: [PTHREAD_COND_T_SIZE] c.char,
  26. }
  27. pthread_mutex_t :: struct #align(16) {
  28. _: [PTHREAD_MUTEX_T_SIZE] c.char,
  29. }
  30. pthread_rwlock_t :: struct #align(16) {
  31. _: [PTHREAD_RWLOCK_T_SIZE] c.char,
  32. }
  33. pthread_barrier_t :: struct #align(16) {
  34. _: [PTHREAD_BARRIER_T_SIZE] c.char,
  35. }
  36. pthread_attr_t :: struct #align(16) {
  37. _: [PTHREAD_ATTR_T_SIZE] c.char,
  38. }
  39. pthread_condattr_t :: struct #align(16) {
  40. _: [PTHREAD_CONDATTR_T_SIZE] c.char,
  41. }
  42. pthread_mutexattr_t :: struct #align(16) {
  43. _: [PTHREAD_MUTEXATTR_T_SIZE] c.char,
  44. }
  45. pthread_rwlockattr_t :: struct #align(16) {
  46. _: [PTHREAD_RWLOCKATTR_T_SIZE] c.char,
  47. }
  48. pthread_barrierattr_t :: struct #align(16) {
  49. _: [PTHREAD_BARRIERATTR_T_SIZE] c.char,
  50. }
  51. PTHREAD_MUTEX_ERRORCHECK :: 1
  52. PTHREAD_MUTEX_RECURSIVE :: 2
  53. PTHREAD_MUTEX_NORMAL :: 3
  54. PTHREAD_CREATE_JOINABLE :: 0
  55. PTHREAD_CREATE_DETACHED :: 1
  56. PTHREAD_INHERIT_SCHED :: 4
  57. PTHREAD_EXPLICIT_SCHED :: 0
  58. PTHREAD_PROCESS_PRIVATE :: 0
  59. PTHREAD_PROCESS_SHARED :: 1
  60. SCHED_FIFO :: 1
  61. SCHED_OTHER :: 2
  62. SCHED_RR :: 3 // Round robin.
  63. sched_param :: struct {
  64. sched_priority: c.int,
  65. }
  66. _usem :: struct {
  67. _has_waiters: u32,
  68. _count: u32,
  69. _flags: u32,
  70. }
  71. _usem2 :: struct {
  72. _count: u32,
  73. _flags: u32,
  74. }
  75. sem_t :: struct {
  76. _magic: u32,
  77. _kern: _usem2,
  78. _padding: u32,
  79. }
  80. PTHREAD_CANCEL_ENABLE :: 0
  81. PTHREAD_CANCEL_DISABLE :: 1
  82. PTHREAD_CANCEL_DEFERRED :: 0
  83. PTHREAD_CANCEL_ASYNCHRONOUS :: 2
  84. foreign import "system:pthread"
  85. @(default_calling_convention="c")
  86. foreign pthread {
  87. // create named semaphore.
  88. // used in process-shared semaphores.
  89. sem_open :: proc(name: cstring, flags: c.int) -> ^sem_t ---
  90. sem_init :: proc(sem: ^sem_t, pshared: c.int, initial_value: c.uint) -> c.int ---
  91. sem_destroy :: proc(sem: ^sem_t) -> c.int ---
  92. sem_post :: proc(sem: ^sem_t) -> c.int ---
  93. sem_wait :: proc(sem: ^sem_t) -> c.int ---
  94. sem_trywait :: proc(sem: ^sem_t) -> c.int ---
  95. // sem_timedwait :: proc(sem: ^sem_t, timeout: time.TimeSpec) -> c.int ---
  96. // NOTE: unclear whether pthread_yield is well-supported on Linux systems,
  97. // see https://linux.die.net/man/3/pthread_yield
  98. pthread_yield :: proc() ---
  99. pthread_setcancelstate :: proc (state: c.int, old_state: ^c.int) -> c.int ---
  100. pthread_setcanceltype :: proc (type: c.int, old_type: ^c.int) -> c.int ---
  101. pthread_cancel :: proc (thread: pthread_t) -> c.int ---
  102. }