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