pthread_freebsd.odin 2.6 KB

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