pthread_freebsd.odin 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. foreign import "system:pthread"
  81. @(default_calling_convention="c")
  82. foreign pthread {
  83. // create named semaphore.
  84. // used in process-shared semaphores.
  85. sem_open :: proc(name: cstring, flags: c.int) -> ^sem_t ---;
  86. sem_init :: proc(sem: ^sem_t, pshared: c.int, initial_value: c.uint) -> c.int ---;
  87. sem_destroy :: proc(sem: ^sem_t) -> c.int ---;
  88. sem_post :: proc(sem: ^sem_t) -> c.int ---;
  89. sem_wait :: proc(sem: ^sem_t) -> c.int ---;
  90. sem_trywait :: proc(sem: ^sem_t) -> c.int ---;
  91. // sem_timedwait :: proc(sem: ^sem_t, timeout: time.TimeSpec) -> c.int ---;
  92. // NOTE: unclear whether pthread_yield is well-supported on Linux systems,
  93. // see https://linux.die.net/man/3/pthread_yield
  94. pthread_yield :: proc() ---;
  95. }