2
0

pthread_freebsd.odin 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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 :: opaque struct #align 16 {
  24. _: [PTHREAD_COND_T_SIZE] c.char,
  25. };
  26. pthread_mutex_t :: opaque struct #align 16 {
  27. _: [PTHREAD_MUTEX_T_SIZE] c.char,
  28. };
  29. pthread_rwlock_t :: opaque struct #align 16 {
  30. _: [PTHREAD_RWLOCK_T_SIZE] c.char,
  31. };
  32. pthread_barrier_t :: opaque struct #align 16 {
  33. _: [PTHREAD_BARRIER_T_SIZE] c.char,
  34. };
  35. pthread_attr_t :: opaque struct #align 16 {
  36. _: [PTHREAD_ATTR_T_SIZE] c.char,
  37. };
  38. pthread_condattr_t :: opaque struct #align 16 {
  39. _: [PTHREAD_CONDATTR_T_SIZE] c.char,
  40. };
  41. pthread_mutexattr_t :: opaque struct #align 16 {
  42. _: [PTHREAD_MUTEXATTR_T_SIZE] c.char,
  43. };
  44. pthread_rwlockattr_t :: opaque struct #align 16 {
  45. _: [PTHREAD_RWLOCKATTR_T_SIZE] c.char,
  46. };
  47. pthread_barrierattr_t :: opaque 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_OTHER :: 0;
  60. SCHED_FIFO :: 1;
  61. SCHED_RR :: 2; // Round robin.
  62. */
  63. sched_param :: struct {
  64. sched_priority: c.int,
  65. }
  66. /*sem_t :: struct #align 16 {
  67. _: [SEM_T_SIZE] c.char,
  68. }*/
  69. SEM_T_SIZE :: 16;
  70. _usem :: struct {
  71. _has_waiters: u32,
  72. _count: u32,
  73. _flags: u32,
  74. }
  75. _usem2 :: struct {
  76. _count: u32,
  77. _flags: u32,
  78. }
  79. sem_t :: struct {
  80. _magic: u32,
  81. _kern: _usem2,
  82. _padding: u32,
  83. }
  84. /*when size_of(int) == 8 {
  85. SEM_T_SIZE :: 32;
  86. } else when size_of(int) == 4 {
  87. SEM_T_SIZE :: 16;
  88. }*/
  89. foreign import "system:pthread"
  90. @(default_calling_convention="c")
  91. foreign pthread {
  92. // create named semaphore.
  93. // used in process-shared semaphores.
  94. sem_open :: proc(name: cstring, flags: c.int) -> ^sem_t ---;
  95. sem_init :: proc(sem: ^sem_t, pshared: c.int, initial_value: c.uint) -> c.int ---;
  96. sem_destroy :: proc(sem: ^sem_t) -> c.int ---;
  97. sem_post :: proc(sem: ^sem_t) -> c.int ---;
  98. sem_wait :: proc(sem: ^sem_t) -> c.int ---;
  99. sem_trywait :: proc(sem: ^sem_t) -> c.int ---;
  100. // sem_timedwait :: proc(sem: ^sem_t, timeout: time.TimeSpec) -> c.int ---;
  101. // NOTE: unclear whether pthread_yield is well-supported on Linux systems,
  102. // see https://linux.die.net/man/3/pthread_yield
  103. pthread_yield :: proc() ---;
  104. }