Merge branch 'integration' into dev
[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 #ifdef CDS_THREAD_SANITIZER_ENABLED
10 #   define CDS_TSAN_ANNOTATE_HAPPENS_BEFORE(addr)   AnnotateHappensBefore(__FILE__, __LINE__, (void*)(addr))\r
11 #   define CDS_TSAN_ANNOTATE_HAPPENS_AFTER(addr)    AnnotateHappensAfter(__FILE__, __LINE__, (void*)(addr))\r
12 \r
13 #   define CDS_TSAN_ANNOTATE_IGNORE_READS_BEGIN     AnnotateIgnoreReadsBegin(__FILE__, __LINE__)\r
14 #   define CDS_TSAN_ANNOTATE_IGNORE_READS_END       AnnotateIgnoreReadsEnd(__FILE__, __LINE__)\r
15 #   define CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN    AnnotateIgnoreWritesBegin(__FILE__, __LINE__)\r
16 #   define CDS_TSAN_ANNOTATE_IGNORE_WRITES_END      AnnotateIgnoreWritesEnd(__FILE__, __LINE__)\r
17 #   define CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN        \\r
18                                                     CDS_TSAN_ANNOTATE_IGNORE_READS_BEGIN; \\r
19                                                     CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN\r
20 #   define CDS_TSAN_ANNOTATE_IGNORE_RW_END          \\r
21                                                     CDS_TSAN_ANNOTATE_IGNORE_WRITES_END;\\r
22                                                     CDS_TSAN_ANNOTATE_IGNORE_READS_END\r
23 \r
24     // provided by TSan\r
25     extern "C" {\r
26         void AnnotateHappensBefore(const char *f, int l, void *addr);\r
27         void AnnotateHappensAfter(const char *f, int l, void *addr);\r
28 \r
29         void AnnotateIgnoreReadsBegin(const char *f, int l);\r
30         void AnnotateIgnoreReadsEnd(const char *f, int l);\r
31         void AnnotateIgnoreWritesBegin(const char *f, int l);\r
32         void AnnotateIgnoreWritesEnd(const char *f, int l);\r
33     }\r
34 #else\r
35 #   define CDS_TSAN_ANNOTATE_HAPPENS_BEFORE(addr)\r
36 #   define CDS_TSAN_ANNOTATE_HAPPENS_AFTER(addr)
37
38 #   define CDS_TSAN_ANNOTATE_IGNORE_READS_BEGIN\r
39 #   define CDS_TSAN_ANNOTATE_IGNORE_READS_END\r
40 #   define CDS_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN\r
41 #   define CDS_TSAN_ANNOTATE_IGNORE_WRITES_END\r
42 #   define CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN\r
43 #   define CDS_TSAN_ANNOTATE_IGNORE_RW_END\r
44 #endif
45
46 #endif  // #ifndef CDSLIB_COMPILER_FEATURE_TSAN_H