sync_util.odin 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package sync
  2. /*
  3. Example:
  4. if guard(&m) {
  5. ...
  6. }
  7. */
  8. guard :: proc{
  9. mutex_guard,
  10. rw_mutex_guard,
  11. recursive_mutex_guard,
  12. ticket_mutex_guard,
  13. benaphore_guard,
  14. recursive_benaphore_guard,
  15. atomic_mutex_guard,
  16. atomic_recursive_mutex_guard,
  17. atomic_rw_mutex_guard,
  18. }
  19. /*
  20. Example:
  21. if shared_guard(&m) {
  22. ...
  23. }
  24. */
  25. shared_guard :: proc{
  26. rw_mutex_shared_guard,
  27. atomic_rw_mutex_shared_guard,
  28. }
  29. // lock locks m
  30. lock :: proc{
  31. mutex_lock,
  32. rw_mutex_lock,
  33. recursive_mutex_lock,
  34. ticket_mutex_lock,
  35. benaphore_lock,
  36. recursive_benaphore_lock,
  37. atomic_mutex_lock,
  38. atomic_recursive_mutex_lock,
  39. atomic_rw_mutex_lock,
  40. }
  41. // unlock locks m
  42. unlock :: proc{
  43. mutex_unlock,
  44. rw_mutex_unlock,
  45. recursive_mutex_unlock,
  46. ticket_mutex_unlock,
  47. benaphore_unlock,
  48. recursive_benaphore_unlock,
  49. atomic_mutex_unlock,
  50. atomic_recursive_mutex_unlock,
  51. atomic_rw_mutex_unlock,
  52. }
  53. // try_lock tries to lock m, will return true on success, and false on failure
  54. try_lock :: proc{
  55. mutex_try_lock,
  56. rw_mutex_try_lock,
  57. recursive_mutex_try_lock,
  58. benaphore_try_lock,
  59. recursive_benaphore_try_lock,
  60. atomic_mutex_try_lock,
  61. atomic_recursive_mutex_try_lock,
  62. atomic_rw_mutex_try_lock,
  63. }
  64. // shared_lock locks rw for reading (with arbitrary number of readers)
  65. shared_lock :: proc{
  66. rw_mutex_shared_lock,
  67. atomic_rw_mutex_shared_lock,
  68. }
  69. // shared_unlock unlocks rw for reading (with arbitrary number of readers)
  70. shared_unlock :: proc{
  71. rw_mutex_shared_unlock,
  72. atomic_rw_mutex_shared_unlock,
  73. }
  74. // try_shared_lock tries to lock rw for reading (with arbitrary number of readers)
  75. try_shared_lock :: proc{
  76. rw_mutex_try_shared_lock,
  77. atomic_rw_mutex_try_shared_lock,
  78. }
  79. wait :: proc{
  80. cond_wait,
  81. sema_wait,
  82. atomic_cond_wait,
  83. atomic_sema_wait,
  84. futex_wait,
  85. wait_group_wait,
  86. }
  87. wait_with_timeout :: proc{
  88. cond_wait_with_timeout,
  89. sema_wait_with_timeout,
  90. atomic_cond_wait_with_timeout,
  91. atomic_sema_wait_with_timeout,
  92. futex_wait_with_timeout,
  93. wait_group_wait_with_timeout,
  94. }
  95. post :: proc{
  96. sema_post,
  97. atomic_sema_post,
  98. }
  99. signal :: proc{
  100. cond_signal,
  101. atomic_cond_signal,
  102. futex_signal,
  103. }
  104. broadcast :: proc{
  105. cond_broadcast,
  106. atomic_cond_broadcast,
  107. futex_broadcast,
  108. }