1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/* Copyright (c) 2008-2009, Google Inc.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * All rights reserved.
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Redistribution and use in source and binary forms, with or without
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * modification, are permitted provided that the following conditions are
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * met:
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *     * Redistributions of source code must retain the above copyright
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * notice, this list of conditions and the following disclaimer.
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *     * Neither the name of Google Inc. nor the names of its
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * contributors may be used to endorse or promote products derived from
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * this software without specific prior written permission.
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * ---
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Author: Kostya Serebryany
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/* This file defines dynamic annotations for use with dynamic analysis
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   tool such as valgrind, PIN, etc.
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   Dynamic annotation is a source code annotation that affects
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   the generated code (that is, the annotation is not a comment).
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   Each such annotation is attached to a particular
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   instruction and/or to a particular object (address) in the program.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   The annotations that should be used by users are macros in all upper-case
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   (e.g., ANNOTATE_NEW_MEMORY).
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   Actual implementation of these macros may differ depending on the
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   dynamic analysis tool being used.
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   See http://code.google.com/p/data-race-test/  for more information.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   This file supports the following dynamic analysis tools:
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   - None (DYNAMIC_ANNOTATIONS_ENABLED is not defined or zero).
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Macros are defined empty.
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   - ThreadSanitizer, Helgrind, DRD (DYNAMIC_ANNOTATIONS_ENABLED is 1).
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Macros are defined as calls to non-inlinable empty functions
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      that are intercepted by Valgrind. */
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef __DYNAMIC_ANNOTATIONS_H__
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define __DYNAMIC_ANNOTATIONS_H__
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef DYNAMIC_ANNOTATIONS_PREFIX
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen# define DYNAMIC_ANNOTATIONS_PREFIX
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef DYNAMIC_ANNOTATIONS_PROVIDE_RUNNING_ON_VALGRIND
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen# define DYNAMIC_ANNOTATIONS_PROVIDE_RUNNING_ON_VALGRIND 1
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifdef DYNAMIC_ANNOTATIONS_WANT_ATTRIBUTE_WEAK
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen# ifdef __GNUC__
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#  define DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK __attribute__((weak))
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen# else
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/* TODO(glider): for Windows support we may want to change this macro in order
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   to prepend __declspec(selectany) to the annotations' declarations. */
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#  error weak annotations are not supported for your compiler
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen# endif
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#else
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen# define DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/* The following preprocessor magic prepends the value of
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   DYNAMIC_ANNOTATIONS_PREFIX to annotation function names. */
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define DYNAMIC_ANNOTATIONS_GLUE0(A, B) A##B
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define DYNAMIC_ANNOTATIONS_GLUE(A, B) DYNAMIC_ANNOTATIONS_GLUE0(A, B)
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define DYNAMIC_ANNOTATIONS_NAME(name) \
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DYNAMIC_ANNOTATIONS_GLUE(DYNAMIC_ANNOTATIONS_PREFIX, name)
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef DYNAMIC_ANNOTATIONS_ENABLED
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# define DYNAMIC_ANNOTATIONS_ENABLED 0
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if DYNAMIC_ANNOTATIONS_ENABLED != 0
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* -------------------------------------------------------------
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Annotations useful when implementing condition variables such as CondVar,
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     using conditional critical sections (Await/LockWhen) and when constructing
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     user-defined synchronization mechanisms.
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     The annotations ANNOTATE_HAPPENS_BEFORE() and ANNOTATE_HAPPENS_AFTER() can
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     be used to define happens-before arcs in user-defined synchronization
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     mechanisms:  the race detector will infer an arc from the former to the
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     latter when they share the same argument pointer.
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Example 1 (reference counting):
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     void Unref() {
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       ANNOTATE_HAPPENS_BEFORE(&refcount_);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       if (AtomicDecrementByOne(&refcount_) == 0) {
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         ANNOTATE_HAPPENS_AFTER(&refcount_);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         delete this;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       }
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     }
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Example 2 (message queue):
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     void MyQueue::Put(Type *e) {
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       MutexLock lock(&mu_);
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       ANNOTATE_HAPPENS_BEFORE(e);
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       PutElementIntoMyQueue(e);
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     }
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Type *MyQueue::Get() {
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       MutexLock lock(&mu_);
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       Type *e = GetElementFromMyQueue();
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       ANNOTATE_HAPPENS_AFTER(e);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       return e;
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     }
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Note: when possible, please use the existing reference counting and message
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     queue implementations instead of inventing new ones. */
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that wait on the condition variable at address "cv" has succeeded
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     and the lock at address "lock" is held. */
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_CONDVAR_LOCK_WAIT(cv, lock) \
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateCondVarWait)(__FILE__, __LINE__, cv, lock)
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that wait on the condition variable at "cv" has succeeded.  Variant
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     w/o lock. */
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_CONDVAR_WAIT(cv) \
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateCondVarWait)(__FILE__, __LINE__, cv, NULL)
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that we are about to signal on the condition variable at address
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     "cv". */
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_CONDVAR_SIGNAL(cv) \
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateCondVarSignal)(__FILE__, __LINE__, cv)
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that we are about to signal_all on the condition variable at address
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     "cv". */
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_CONDVAR_SIGNAL_ALL(cv) \
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateCondVarSignalAll)(__FILE__, __LINE__, cv)
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Annotations for user-defined synchronization mechanisms. */
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_HAPPENS_BEFORE(obj) ANNOTATE_CONDVAR_SIGNAL(obj)
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_HAPPENS_AFTER(obj)  ANNOTATE_CONDVAR_WAIT(obj)
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  /* DEPRECATED. Don't use it. */
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_PUBLISH_MEMORY_RANGE(pointer, size) \
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotatePublishMemoryRange)(__FILE__, __LINE__, \
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        pointer, size)
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* DEPRECATED. Don't use it. */
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_UNPUBLISH_MEMORY_RANGE(pointer, size) \
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateUnpublishMemoryRange)(__FILE__, __LINE__, \
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        pointer, size)
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* DEPRECATED. Don't use it. */
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_SWAP_MEMORY_RANGE(pointer, size)   \
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    do {                                              \
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ANNOTATE_UNPUBLISH_MEMORY_RANGE(pointer, size); \
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ANNOTATE_PUBLISH_MEMORY_RANGE(pointer, size);   \
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } while (0)
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Instruct the tool to create a happens-before arc between mu->Unlock() and
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     mu->Lock(). This annotation may slow down the race detector and hide real
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     races. Normally it is used only when it would be difficult to annotate each
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     of the mutex's critical sections individually using the annotations above.
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     This annotation makes sense only for hybrid race detectors. For pure
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     happens-before detectors this is a no-op. For more details see
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     http://code.google.com/p/data-race-test/wiki/PureHappensBeforeVsHybrid . */
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mu) \
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateMutexIsUsedAsCondVar)(__FILE__, __LINE__, \
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        mu)
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  /* Opposite to ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX.
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     Instruct the tool to NOT create h-b arcs between Unlock and Lock, even in
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     pure happens-before mode. For a hybrid mode this is a no-op. */
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  #define ANNOTATE_NOT_HAPPENS_BEFORE_MUTEX(mu) \
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateMutexIsNotPHB)(__FILE__, __LINE__, mu)
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Deprecated. Use ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX. */
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_MUTEX_IS_USED_AS_CONDVAR(mu) \
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateMutexIsUsedAsCondVar)(__FILE__, __LINE__, \
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        mu)
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* -------------------------------------------------------------
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Annotations useful when defining memory allocators, or when memory that
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     was protected in one way starts to be protected in another. */
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that a new memory at "address" of size "size" has been allocated.
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     This might be used when the memory has been retrieved from a free list and
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     is about to be reused, or when a the locking discipline for a variable
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     changes. */
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_NEW_MEMORY(address, size) \
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateNewMemory)(__FILE__, __LINE__, address, \
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        size)
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* -------------------------------------------------------------
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Annotations useful when defining FIFO queues that transfer data between
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     threads. */
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that the producer-consumer queue (such as ProducerConsumerQueue) at
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     address "pcq" has been created.  The ANNOTATE_PCQ_* annotations
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     should be used only for FIFO queues.  For non-FIFO queues use
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     ANNOTATE_HAPPENS_BEFORE (for put) and ANNOTATE_HAPPENS_AFTER (for get). */
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_PCQ_CREATE(pcq) \
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQCreate)(__FILE__, __LINE__, pcq)
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that the queue at address "pcq" is about to be destroyed. */
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_PCQ_DESTROY(pcq) \
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQDestroy)(__FILE__, __LINE__, pcq)
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that we are about to put an element into a FIFO queue at address
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     "pcq". */
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_PCQ_PUT(pcq) \
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQPut)(__FILE__, __LINE__, pcq)
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that we've just got an element from a FIFO queue at address
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     "pcq". */
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_PCQ_GET(pcq) \
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQGet)(__FILE__, __LINE__, pcq)
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* -------------------------------------------------------------
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Annotations that suppress errors.  It is usually better to express the
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     program's synchronization using the other annotations, but these can
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     be used when all else fails. */
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that we may have a benign race at "pointer", with size
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     "sizeof(*(pointer))". "pointer" must be a non-void* pointer.  Insert at the
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     point where "pointer" has been allocated, preferably close to the point
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     where the race happens.  See also ANNOTATE_BENIGN_RACE_STATIC. */
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BENIGN_RACE(pointer, description) \
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateBenignRaceSized)(__FILE__, __LINE__, \
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        pointer, sizeof(*(pointer)), description)
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Same as ANNOTATE_BENIGN_RACE(address, description), but applies to
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     the memory range [address, address+size). */
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BENIGN_RACE_SIZED(address, size, description) \
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateBenignRaceSized)(__FILE__, __LINE__, \
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        address, size, description)
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Request the analysis tool to ignore all reads in the current thread
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     until ANNOTATE_IGNORE_READS_END is called.
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Useful to ignore intentional racey reads, while still checking
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     other reads and all writes.
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     See also ANNOTATE_UNPROTECTED_READ. */
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_READS_BEGIN() \
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreReadsBegin)(__FILE__, __LINE__)
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Stop ignoring reads. */
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_READS_END() \
25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreReadsEnd)(__FILE__, __LINE__)
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Similar to ANNOTATE_IGNORE_READS_BEGIN, but ignore writes. */
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_WRITES_BEGIN() \
26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreWritesBegin)(__FILE__, __LINE__)
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Stop ignoring writes. */
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_WRITES_END() \
26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreWritesEnd)(__FILE__, __LINE__)
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Start ignoring all memory accesses (reads and writes). */
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() \
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    do {\
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ANNOTATE_IGNORE_READS_BEGIN();\
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ANNOTATE_IGNORE_WRITES_BEGIN();\
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }while(0)\
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Stop ignoring all memory accesses. */
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_READS_AND_WRITES_END() \
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    do {\
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ANNOTATE_IGNORE_WRITES_END();\
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ANNOTATE_IGNORE_READS_END();\
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }while(0)\
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Similar to ANNOTATE_IGNORE_READS_BEGIN, but ignore synchronization events:
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     RWLOCK* and CONDVAR*. */
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_SYNC_BEGIN() \
28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreSyncBegin)(__FILE__, __LINE__)
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Stop ignoring sync events. */
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_SYNC_END() \
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreSyncEnd)(__FILE__, __LINE__)
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Enable (enable!=0) or disable (enable==0) race detection for all threads.
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     This annotation could be useful if you want to skip expensive race analysis
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     during some period of program execution, e.g. during initialization. */
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_ENABLE_RACE_DETECTION(enable) \
29472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateEnableRaceDetection)(__FILE__, __LINE__, \
29572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        enable)
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* -------------------------------------------------------------
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Annotations useful for debugging. */
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Request to trace every access to "address". */
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_TRACE_MEMORY(address) \
30272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateTraceMemory)(__FILE__, __LINE__, address)
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report the current thread name to a race detector. */
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_THREAD_NAME(name) \
30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateThreadName)(__FILE__, __LINE__, name)
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* -------------------------------------------------------------
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Annotations useful when implementing locks.  They are not
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     normally needed by modules that merely use locks.
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     The "lock" argument is a pointer to the lock object. */
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that a lock has been created at address "lock". */
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_RWLOCK_CREATE(lock) \
31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockCreate)(__FILE__, __LINE__, lock)
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that the lock at address "lock" is about to be destroyed. */
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_RWLOCK_DESTROY(lock) \
31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockDestroy)(__FILE__, __LINE__, lock)
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that the lock at address "lock" has been acquired.
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     is_w=1 for writer lock, is_w=0 for reader lock. */
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) \
32472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockAcquired)(__FILE__, __LINE__, lock, \
32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        is_w)
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that the lock at address "lock" is about to be released. */
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_RWLOCK_RELEASED(lock, is_w) \
32972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockReleased)(__FILE__, __LINE__, lock, \
33072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        is_w)
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* -------------------------------------------------------------
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Annotations useful when implementing barriers.  They are not
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     normally needed by modules that merely use barriers.
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     The "barrier" argument is a pointer to the barrier object. */
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that the "barrier" has been initialized with initial "count".
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   If 'reinitialization_allowed' is true, initialization is allowed to happen
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   multiple times w/o calling barrier_destroy() */
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BARRIER_INIT(barrier, count, reinitialization_allowed) \
34172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierInit)(__FILE__, __LINE__, barrier, \
34272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        count, reinitialization_allowed)
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that we are about to enter barrier_wait("barrier"). */
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BARRIER_WAIT_BEFORE(barrier) \
34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierWaitBefore)(__FILE__, __LINE__, \
34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        barrier)
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that we just exited barrier_wait("barrier"). */
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BARRIER_WAIT_AFTER(barrier) \
35172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierWaitAfter)(__FILE__, __LINE__, \
35272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        barrier)
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that the "barrier" has been destroyed. */
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BARRIER_DESTROY(barrier) \
35672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierDestroy)(__FILE__, __LINE__, \
35772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        barrier)
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* -------------------------------------------------------------
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Annotations useful for testing race detectors. */
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Report that we expect a race on the variable at "address".
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Use only in unit tests for a race detector. */
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_EXPECT_RACE(address, description) \
36572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateExpectRace)(__FILE__, __LINE__, address, \
36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        description)
36772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
36872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  #define ANNOTATE_FLUSH_EXPECTED_RACES() \
36972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateFlushExpectedRaces)(__FILE__, __LINE__)
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* A no-op. Insert where you like to test the interceptors. */
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_NO_OP(arg) \
37372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateNoOp)(__FILE__, __LINE__, arg)
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Force the race detector to flush its state. The actual effect depends on
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   * the implementation of the detector. */
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_FLUSH_STATE() \
37872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DYNAMIC_ANNOTATIONS_NAME(AnnotateFlushState)(__FILE__, __LINE__)
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else  /* DYNAMIC_ANNOTATIONS_ENABLED == 0 */
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_RWLOCK_CREATE(lock) /* empty */
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_RWLOCK_DESTROY(lock) /* empty */
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) /* empty */
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_RWLOCK_RELEASED(lock, is_w) /* empty */
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BARRIER_INIT(barrier, count, reinitialization_allowed) /* */
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BARRIER_WAIT_BEFORE(barrier) /* empty */
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BARRIER_WAIT_AFTER(barrier) /* empty */
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BARRIER_DESTROY(barrier) /* empty */
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_CONDVAR_LOCK_WAIT(cv, lock) /* empty */
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_CONDVAR_WAIT(cv) /* empty */
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_CONDVAR_SIGNAL(cv) /* empty */
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_CONDVAR_SIGNAL_ALL(cv) /* empty */
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_HAPPENS_BEFORE(obj) /* empty */
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_HAPPENS_AFTER(obj) /* empty */
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_PUBLISH_MEMORY_RANGE(address, size) /* empty */
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_UNPUBLISH_MEMORY_RANGE(address, size)  /* empty */
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_SWAP_MEMORY_RANGE(address, size)  /* empty */
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_PCQ_CREATE(pcq) /* empty */
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_PCQ_DESTROY(pcq) /* empty */
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_PCQ_PUT(pcq) /* empty */
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_PCQ_GET(pcq) /* empty */
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_NEW_MEMORY(address, size) /* empty */
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_EXPECT_RACE(address, description) /* empty */
40672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  #define ANNOTATE_FLUSH_EXPECTED_RACES(address, description) /* empty */
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BENIGN_RACE(address, description) /* empty */
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BENIGN_RACE_SIZED(address, size, description) /* empty */
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mu) /* empty */
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_MUTEX_IS_USED_AS_CONDVAR(mu) /* empty */
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_TRACE_MEMORY(arg) /* empty */
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_THREAD_NAME(name) /* empty */
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_READS_BEGIN() /* empty */
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_READS_END() /* empty */
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_WRITES_BEGIN() /* empty */
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_WRITES_END() /* empty */
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() /* empty */
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_READS_AND_WRITES_END() /* empty */
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_SYNC_BEGIN() /* empty */
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_IGNORE_SYNC_END() /* empty */
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_ENABLE_RACE_DETECTION(enable) /* empty */
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_NO_OP(arg) /* empty */
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_FLUSH_STATE() /* empty */
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  /* DYNAMIC_ANNOTATIONS_ENABLED */
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/* Use the macros above rather than using these functions directly. */
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef __cplusplus
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochextern "C" {
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
43372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockCreate)(
43472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *lock) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockDestroy)(
43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *lock) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
43972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockAcquired)(
44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *lock, long is_w) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockReleased)(
44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *lock, long is_w) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierInit)(
44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *barrier, long count,
44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    long reinitialization_allowed) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierWaitBefore)(
44972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *barrier) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierWaitAfter)(
45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
45372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *barrier) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
45472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierDestroy)(
45572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
45672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *barrier) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
45772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateCondVarWait)(
45872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *cv,
45972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *lock) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
46072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateCondVarSignal)(
46172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
46272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *cv) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
46372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateCondVarSignalAll)(
46472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
46572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *cv) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
46672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotatePublishMemoryRange)(
46772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
46872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *address, long size) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
46972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateUnpublishMemoryRange)(
47072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
47172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *address, long size) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
47272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQCreate)(
47372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
47472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *pcq) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
47572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQDestroy)(
47672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
47772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *pcq) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
47872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQPut)(
47972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
48072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *pcq) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
48172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQGet)(
48272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
48372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *pcq) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
48472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateNewMemory)(
48572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
48672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *mem, long size) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
48772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateExpectRace)(
48872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *mem,
48972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *description) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
49072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateFlushExpectedRaces)(
49172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
49272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateBenignRace)(
49372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *mem,
49472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *description) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
49572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateBenignRaceSized)(
49672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *mem, long size,
49772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *description) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
49872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateMutexIsUsedAsCondVar)(
49972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
50072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *mu) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
50172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateMutexIsNotPHB)(
50272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
50372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *mu) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
50472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateTraceMemory)(
50572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
50672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *arg) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
50772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateThreadName)(
50872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
50972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *name) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
51072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreReadsBegin)(
51172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
51272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreReadsEnd)(
51372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
51472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreWritesBegin)(
51572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
51672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreWritesEnd)(
51772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
51872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreSyncBegin)(
51972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
52072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreSyncEnd)(
52172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
52272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateEnableRaceDetection)(
52372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, int enable) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
52472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateNoOp)(
52572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line,
52672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *arg) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
52772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateFlushState)(
52872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line) DYNAMIC_ANNOTATIONS_ATTRIBUTE_WEAK;
52972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
53072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if DYNAMIC_ANNOTATIONS_PROVIDE_RUNNING_ON_VALGRIND == 1
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/* Return non-zero value if running under valgrind.
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  If "valgrind.h" is included into dynamic_annotations.c,
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  the regular valgrind mechanism will be used.
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  See http://valgrind.org/docs/manual/manual-core-adv.html about
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RUNNING_ON_VALGRIND and other valgrind "client requests".
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  The file "valgrind.h" may be obtained by doing
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     svn co svn://svn.valgrind.org/valgrind/trunk/include
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  If for some reason you can't use "valgrind.h" or want to fake valgrind,
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  there are two ways to make this function return non-zero:
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    - Use environment variable: export RUNNING_ON_VALGRIND=1
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    - Make your tool intercept the function RunningOnValgrind() and
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      change its return value.
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint RunningOnValgrind(void);
54772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif /* DYNAMIC_ANNOTATIONS_PROVIDE_RUNNING_ON_VALGRIND == 1 */
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef __cplusplus
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if DYNAMIC_ANNOTATIONS_ENABLED != 0 && defined(__cplusplus)
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* ANNOTATE_UNPROTECTED_READ is the preferred way to annotate racey reads.
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     Instead of doing
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ANNOTATE_IGNORE_READS_BEGIN();
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ... = x;
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ANNOTATE_IGNORE_READS_END();
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     one can use
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ... = ANNOTATE_UNPROTECTED_READ(x); */
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <class T>
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inline T ANNOTATE_UNPROTECTED_READ(const volatile T &x) {
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ANNOTATE_IGNORE_READS_BEGIN();
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    T res = x;
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ANNOTATE_IGNORE_READS_END();
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return res;
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Apply ANNOTATE_BENIGN_RACE_SIZED to a static variable. */
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BENIGN_RACE_STATIC(static_var, description)        \
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    namespace {                                                       \
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      class static_var ## _annotator {                                \
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       public:                                                        \
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        static_var ## _annotator() {                                  \
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          ANNOTATE_BENIGN_RACE_SIZED(&static_var,                     \
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      sizeof(static_var),             \
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            # static_var ": " description);                           \
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }                                                             \
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      };                                                              \
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      static static_var ## _annotator the ## static_var ## _annotator;\
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else /* DYNAMIC_ANNOTATIONS_ENABLED == 0 */
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_UNPROTECTED_READ(x) (x)
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  #define ANNOTATE_BENIGN_RACE_STATIC(static_var, description)  /* empty */
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif /* DYNAMIC_ANNOTATIONS_ENABLED */
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  /* __DYNAMIC_ANNOTATIONS_H__ */
591