9 #include "sanitizer_common/print_address.h"
12 #include <mach/mach_time.h>
15 // TSan-invisible barrier.
16 // Tests use it to establish necessary execution order in a way that does not
17 // interfere with tsan (does not establish synchronization between threads).
18 typedef unsigned long long invisible_barrier_t
;
23 void __tsan_testonly_barrier_init(invisible_barrier_t
*barrier
,
25 void __tsan_testonly_barrier_wait(invisible_barrier_t
*barrier
);
26 unsigned long __tsan_testonly_shadow_stack_current_size();
31 static inline void barrier_init(invisible_barrier_t
*barrier
, unsigned count
) {
32 __tsan_testonly_barrier_init(barrier
, count
);
35 static inline void barrier_wait(invisible_barrier_t
*barrier
) {
36 __tsan_testonly_barrier_wait(barrier
);
39 // Default instance of the barrier, but a test can declare more manually.
40 invisible_barrier_t barrier
;
43 unsigned long long monotonic_clock_ns() {
44 static mach_timebase_info_data_t timebase_info
;
45 if (timebase_info
.denom
== 0) mach_timebase_info(&timebase_info
);
46 return (mach_absolute_time() * timebase_info
.numer
) / timebase_info
.denom
;
49 unsigned long long monotonic_clock_ns() {
51 clock_gettime(CLOCK_MONOTONIC
, &t
);
52 return (unsigned long long)t
.tv_sec
* 1000000000ull + t
.tv_nsec
;
56 //The const kPCInc must be in sync with StackTrace::GetPreviousInstructionPc
57 #if defined(__powerpc64__)
58 // PCs are always 4 byte aligned.
60 #elif defined(__sparc__) || defined(__mips__)
70 void AnnotateRWLockCreate(const char *f
, int l
, void *m
);
71 void AnnotateRWLockCreateStatic(const char *f
, int l
, void *m
);
72 void AnnotateRWLockDestroy(const char *f
, int l
, void *m
);
73 void AnnotateRWLockAcquired(const char *f
, int l
, void *m
, long is_w
);
74 void AnnotateRWLockReleased(const char *f
, int l
, void *m
, long is_w
);
80 #define ANNOTATE_RWLOCK_CREATE(m) \
81 AnnotateRWLockCreate(__FILE__, __LINE__, m)
82 #define ANNOTATE_RWLOCK_CREATE_STATIC(m) \
83 AnnotateRWLockCreateStatic(__FILE__, __LINE__, m)
84 #define ANNOTATE_RWLOCK_DESTROY(m) \
85 AnnotateRWLockDestroy(__FILE__, __LINE__, m)
86 #define ANNOTATE_RWLOCK_ACQUIRED(m, is_w) \
87 AnnotateRWLockAcquired(__FILE__, __LINE__, m, is_w)
88 #define ANNOTATE_RWLOCK_RELEASED(m, is_w) \
89 AnnotateRWLockReleased(__FILE__, __LINE__, m, is_w)