ba5e3ef1606d568b51b0a78c9b87fa0f5c5c3907
[libcds.git] / cds / compiler / feature_tsan.h
1 //$$CDS-header$$
2
3 #ifndef CDSLIB_COMPILER_FEATURE_TSAN_H
4 #define CDSLIB_COMPILER_FEATURE_TSAN_H
5
6 // Thread Sanitizer annotations.
7 // From https://groups.google.com/d/msg/thread-sanitizer/SsrHB7FTnTk/mNTGNLQj-9cJ
8
9 //@cond
10
11 #ifdef CDS_THREAD_SANITIZER_ENABLED
12 #   define CDS_TSAN_ANNOTATE_HAPPENS_BEFORE(addr)   AnnotateHappensBefore(__FILE__, __LINE__, reinterpret_cast<void*>(addr))
13 #   define CDS_TSAN_ANNOTATE_HAPPENS_AFTER(addr)    AnnotateHappensAfter(__FILE__, __LINE__, reinterpret_cast<void*>(addr))
14
15 #   define CDS_TSAN_ANNOTATE_IGNORE_READS_BEGIN     AnnotateIgnoreReadsBegin(__FILE__, __LINE__)
16 #   define CDS_TSAN_ANNOTATE_IGNORE_READS_END       AnnotateIgnoreReadsEnd(__FILE__, __LINE__)
17 #   define CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN    AnnotateIgnoreWritesBegin(__FILE__, __LINE__)
18 #   define CDS_TSAN_ANNOTATE_IGNORE_WRITES_END      AnnotateIgnoreWritesEnd(__FILE__, __LINE__)
19 #   define CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN        \
20                                                     CDS_TSAN_ANNOTATE_IGNORE_READS_BEGIN; \
21                                                     CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN
22 #   define CDS_TSAN_ANNOTATE_IGNORE_RW_END          \
23                                                     CDS_TSAN_ANNOTATE_IGNORE_WRITES_END;\
24                                                     CDS_TSAN_ANNOTATE_IGNORE_READS_END
25 #   define CDS_TSAN_ANNOTATE_NEW_MEMORY( addr, sz ) AnnotateNewMemory( (char *) __FILE__, __LINE__, reinterpret_cast<void *>(addr), sz )
26
27     // provided by TSan
28     extern "C" {
29         void AnnotateHappensBefore(const char *f, int l, void *addr);
30         void AnnotateHappensAfter(const char *f, int l, void *addr);
31
32         void AnnotateIgnoreReadsBegin(const char *f, int l);
33         void AnnotateIgnoreReadsEnd(const char *f, int l);
34         void AnnotateIgnoreWritesBegin(const char *f, int l);
35         void AnnotateIgnoreWritesEnd(const char *f, int l);
36
37         void AnnotateNewMemory(char *f, int l, void * mem, size_t size);
38
39     }
40
41 #else // CDS_THREAD_SANITIZER_ENABLED
42
43 #   define CDS_TSAN_ANNOTATE_HAPPENS_BEFORE(addr)
44 #   define CDS_TSAN_ANNOTATE_HAPPENS_AFTER(addr)
45
46 #   define CDS_TSAN_ANNOTATE_IGNORE_READS_BEGIN
47 #   define CDS_TSAN_ANNOTATE_IGNORE_READS_END
48 #   define CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN
49 #   define CDS_TSAN_ANNOTATE_IGNORE_WRITES_END
50 #   define CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN
51 #   define CDS_TSAN_ANNOTATE_IGNORE_RW_END
52
53 #   define CDS_TSAN_ANNOTATE_NEW_MEMORY( addr, sz )
54
55 #endif
56
57 //@endcond
58 #endif  // #ifndef CDSLIB_COMPILER_FEATURE_TSAN_H