sync_util.odin 2.0 KB

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