aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-01-23 09:24:21 +0000
committergingerBill <bill@gingerbill.org>2023-01-23 09:24:21 +0000
commit117c0cceb1c7673a55a2c71d82d47f3e09e27e9b (patch)
tree4abdba0d1e2a1114b1e938ab65792efad7ac7097
parentc949e404c38355daea2fcea0faa161e0a14e20b4 (diff)
Add helgrind markers to package sync
-rw-r--r--core/sync/extended.odin8
-rw-r--r--core/sync/primitives_internal.odin59
2 files changed, 67 insertions, 0 deletions
diff --git a/core/sync/extended.odin b/core/sync/extended.odin
index 7370d6544..a3fe28b69 100644
--- a/core/sync/extended.odin
+++ b/core/sync/extended.odin
@@ -1,6 +1,8 @@
package sync
import "core:time"
+import vg "core:sys/valgrind"
+_ :: vg
// A Wait_Group waits for a collection of threads to finish
//
@@ -108,6 +110,9 @@ Barrier :: struct {
}
barrier_init :: proc "contextless" (b: ^Barrier, thread_count: int) {
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_barrier_resize_pre(b, uint(thread_count))
+ }
b.index = 0
b.generation_id = 0
b.thread_count = thread_count
@@ -116,6 +121,9 @@ barrier_init :: proc "contextless" (b: ^Barrier, thread_count: int) {
// Block the current thread until all threads have rendezvoused
// Barrier can be reused after all threads rendezvoused once, and can be used continuously
barrier_wait :: proc "contextless" (b: ^Barrier) -> (is_leader: bool) {
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_barrier_wait_pre(b)
+ }
guard(&b.mutex)
local_gen := b.generation_id
b.index += 1
diff --git a/core/sync/primitives_internal.odin b/core/sync/primitives_internal.odin
index d613d821d..b14b2f151 100644
--- a/core/sync/primitives_internal.odin
+++ b/core/sync/primitives_internal.odin
@@ -2,20 +2,31 @@
package sync
import "core:time"
+import vg "core:sys/valgrind"
+_ :: vg
_Sema :: struct {
atomic: Atomic_Sema,
}
_sema_post :: proc "contextless" (s: ^Sema, count := 1) {
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_sem_post_pre(s)
+ }
atomic_sema_post(&s.impl.atomic, count)
}
_sema_wait :: proc "contextless" (s: ^Sema) {
atomic_sema_wait(&s.impl.atomic)
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_sem_wait_post(s)
+ }
}
_sema_wait_with_timeout :: proc "contextless" (s: ^Sema, duration: time.Duration) -> bool {
+ when ODIN_ARCH == .amd64 {
+ defer vg.helgrind_sem_wait_post(s)
+ }
return atomic_sema_wait_with_timeout(&s.impl.atomic, duration)
}
@@ -26,6 +37,11 @@ _Recursive_Mutex :: struct {
}
_recursive_mutex_lock :: proc "contextless" (m: ^Recursive_Mutex) {
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_mutex_lock_pre(m, false)
+ defer vg.helgrind_mutex_lock_post(m)
+ }
+
tid := Futex(current_thread_id())
for {
prev_owner := atomic_compare_exchange_strong_explicit(&m.impl.owner, 0, tid, .Acquire, .Acquire)
@@ -41,6 +57,11 @@ _recursive_mutex_lock :: proc "contextless" (m: ^Recursive_Mutex) {
}
_recursive_mutex_unlock :: proc "contextless" (m: ^Recursive_Mutex) {
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_mutex_unlock_pre(m)
+ defer vg.helgrind_mutex_unlock_post(m)
+ }
+
m.impl.recursion -= 1
if m.impl.recursion != 0 {
return
@@ -71,14 +92,26 @@ when ODIN_OS != .Windows {
}
_mutex_lock :: proc "contextless" (m: ^Mutex) {
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_mutex_lock_pre(m, false)
+ defer vg.helgrind_mutex_lock_post(m)
+ }
atomic_mutex_lock(&m.impl.mutex)
}
_mutex_unlock :: proc "contextless" (m: ^Mutex) {
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_mutex_unlock_pre(m)
+ defer vg.helgrind_mutex_unlock_post(m)
+ }
atomic_mutex_unlock(&m.impl.mutex)
}
_mutex_try_lock :: proc "contextless" (m: ^Mutex) -> bool {
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_mutex_lock_pre(m, true)
+ defer vg.helgrind_mutex_lock_post(m)
+ }
return atomic_mutex_try_lock(&m.impl.mutex)
}
@@ -87,18 +120,32 @@ when ODIN_OS != .Windows {
}
_cond_wait :: proc "contextless" (c: ^Cond, m: ^Mutex) {
+ when ODIN_ARCH == .amd64 {
+ _ = vg.helgrind_cond_wait_pre(c, m)
+ defer _ = vg.helgrind_cond_wait_post(c, m)
+ }
atomic_cond_wait(&c.impl.cond, &m.impl.mutex)
}
_cond_wait_with_timeout :: proc "contextless" (c: ^Cond, m: ^Mutex, duration: time.Duration) -> bool {
+ when ODIN_ARCH == .amd64 {
+ _ = vg.helgrind_cond_wait_pre(c, m)
+ defer _ = vg.helgrind_cond_wait_post(c, m)
+ }
return atomic_cond_wait_with_timeout(&c.impl.cond, &m.impl.mutex, duration)
}
_cond_signal :: proc "contextless" (c: ^Cond) {
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_cond_signal_pre(c)
+ }
atomic_cond_signal(&c.impl.cond)
}
_cond_broadcast :: proc "contextless" (c: ^Cond) {
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_cond_broadcast_pre(c)
+ }
atomic_cond_broadcast(&c.impl.cond)
}
@@ -108,11 +155,17 @@ when ODIN_OS != .Windows {
}
_rw_mutex_lock :: proc "contextless" (rw: ^RW_Mutex) {
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_rwlock_lock_pre(rw, true)
+ }
atomic_rw_mutex_lock(&rw.impl.mutex)
}
_rw_mutex_unlock :: proc "contextless" (rw: ^RW_Mutex) {
atomic_rw_mutex_unlock(&rw.impl.mutex)
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_rwlock_unlock_post(rw, true)
+ }
}
_rw_mutex_try_lock :: proc "contextless" (rw: ^RW_Mutex) -> bool {
@@ -120,11 +173,17 @@ when ODIN_OS != .Windows {
}
_rw_mutex_shared_lock :: proc "contextless" (rw: ^RW_Mutex) {
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_rwlock_lock_pre(rw, false)
+ }
atomic_rw_mutex_shared_lock(&rw.impl.mutex)
}
_rw_mutex_shared_unlock :: proc "contextless" (rw: ^RW_Mutex) {
atomic_rw_mutex_shared_unlock(&rw.impl.mutex)
+ when ODIN_ARCH == .amd64 {
+ vg.helgrind_rwlock_unlock_post(rw, false)
+ }
}
_rw_mutex_try_shared_lock :: proc "contextless" (rw: ^RW_Mutex) -> bool {