blob: 595590b58ce2d5f19f0849f5e1f4956b01356d74 [file] [log] [blame]
Dmitry Vyukov3ab6b232015-01-21 13:50:02 +00001#include <pthread.h>
2#include <stdlib.h>
3#include <stdio.h>
4#include <unistd.h>
5#include <dlfcn.h>
6#include <stddef.h>
Dmitry Vyukov1041aab2015-11-12 10:24:22 +00007#include <sched.h>
Adhemerval Zanella7a096592015-11-30 19:43:03 +00008#include <stdarg.h>
Strahinja Petrovicf10d1142016-11-14 11:40:56 +00009#include "sanitizer_common/print_address.h"
Dmitry Vyukov3ab6b232015-01-21 13:50:02 +000010
Kuba Mracekdd13e4e2017-04-24 16:48:30 +000011#include <sanitizer/tsan_interface.h>
12
Kuba Brecka8aa56d32015-11-20 11:07:16 +000013#ifdef __APPLE__
14#include <mach/mach_time.h>
15#endif
16
Dmitry Vyukov3ab6b232015-01-21 13:50:02 +000017// TSan-invisible barrier.
18// Tests use it to establish necessary execution order in a way that does not
19// interfere with tsan (does not establish synchronization between threads).
Dmitry Vyukov4cd631c2015-11-06 11:52:24 +000020typedef unsigned long long invisible_barrier_t;
Dmitry Vyukov3ab6b232015-01-21 13:50:02 +000021
Dmitry Vyukoveee690b2015-12-08 17:54:47 +000022#ifdef __cplusplus
23extern "C" {
24#endif
25void __tsan_testonly_barrier_init(invisible_barrier_t *barrier,
26 unsigned count);
27void __tsan_testonly_barrier_wait(invisible_barrier_t *barrier);
Kuba Breckab0dd4542016-11-14 21:41:33 +000028unsigned long __tsan_testonly_shadow_stack_current_size();
Dmitry Vyukoveee690b2015-12-08 17:54:47 +000029#ifdef __cplusplus
30}
31#endif
32
33static inline void barrier_init(invisible_barrier_t *barrier, unsigned count) {
34 __tsan_testonly_barrier_init(barrier, count);
Dmitry Vyukov4cd631c2015-11-06 11:52:24 +000035}
Viktor Kutuzov281347a2015-03-13 14:08:55 +000036
Dmitry Vyukoveee690b2015-12-08 17:54:47 +000037static inline void barrier_wait(invisible_barrier_t *barrier) {
38 __tsan_testonly_barrier_wait(barrier);
Dmitry Vyukov3ab6b232015-01-21 13:50:02 +000039}
40
41// Default instance of the barrier, but a test can declare more manually.
Dmitry Vyukov4cd631c2015-11-06 11:52:24 +000042invisible_barrier_t barrier;
Dmitry Vyukov3ab6b232015-01-21 13:50:02 +000043
Kuba Brecka8aa56d32015-11-20 11:07:16 +000044#ifdef __APPLE__
45unsigned long long monotonic_clock_ns() {
46 static mach_timebase_info_data_t timebase_info;
47 if (timebase_info.denom == 0) mach_timebase_info(&timebase_info);
48 return (mach_absolute_time() * timebase_info.numer) / timebase_info.denom;
49}
50#else
51unsigned long long monotonic_clock_ns() {
52 struct timespec t;
53 clock_gettime(CLOCK_MONOTONIC, &t);
54 return (unsigned long long)t.tv_sec * 1000000000ull + t.tv_nsec;
55}
56#endif
Sagar Thakur8f3381e2016-03-02 13:53:22 +000057
58//The const kPCInc must be in sync with StackTrace::GetPreviousInstructionPc
Igor Kudrin13f8a772018-05-24 12:26:20 +000059#if defined(__powerpc64__) || defined(__arm__) || defined(__aarch64__)
Sagar Thakur8f3381e2016-03-02 13:53:22 +000060// PCs are always 4 byte aligned.
61const int kPCInc = 4;
62#elif defined(__sparc__) || defined(__mips__)
63const int kPCInc = 8;
64#else
65const int kPCInc = 1;
66#endif
Dmitry Vyukov0f7e9492016-06-03 11:48:27 +000067
68#ifdef __cplusplus
69extern "C" {
70#endif
71
72void AnnotateRWLockCreate(const char *f, int l, void *m);
73void AnnotateRWLockCreateStatic(const char *f, int l, void *m);
74void AnnotateRWLockDestroy(const char *f, int l, void *m);
75void AnnotateRWLockAcquired(const char *f, int l, void *m, long is_w);
76void AnnotateRWLockReleased(const char *f, int l, void *m, long is_w);
77
78#ifdef __cplusplus
79}
80#endif
81
82#define ANNOTATE_RWLOCK_CREATE(m) \
83 AnnotateRWLockCreate(__FILE__, __LINE__, m)
84#define ANNOTATE_RWLOCK_CREATE_STATIC(m) \
85 AnnotateRWLockCreateStatic(__FILE__, __LINE__, m)
86#define ANNOTATE_RWLOCK_DESTROY(m) \
87 AnnotateRWLockDestroy(__FILE__, __LINE__, m)
88#define ANNOTATE_RWLOCK_ACQUIRED(m, is_w) \
89 AnnotateRWLockAcquired(__FILE__, __LINE__, m, is_w)
90#define ANNOTATE_RWLOCK_RELEASED(m, is_w) \
91 AnnotateRWLockReleased(__FILE__, __LINE__, m, is_w)