pthread_linux.odin 3.2 KB

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