15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Copyright (c) 2011, Google Inc. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted provided that the following conditions are 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * met: 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * Redistributions of source code must retain the above copyright 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * contributors may be used to endorse or promote products derived from 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this software without specific prior written permission. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _MSC_VER 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <windows.h> 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __cplusplus 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# error "This file should be built as pure C to avoid name mangling" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/third_party/dynamic_annotations/dynamic_annotations.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __GNUC__ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* valgrind.h uses gcc extensions so it won't build with other compilers */ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include "base/third_party/valgrind/valgrind.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Compiler-based ThreadSanitizer defines 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL = 1 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) and provides its own definitions of the functions. */ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL 0 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Each function is empty and called (via a macro) only in debug mode. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) The arguments are captured by dynamic tools at runtime. */ 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if DYNAMIC_ANNOTATIONS_ENABLED == 1 \ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL == 0 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Identical code folding(-Wl,--icf=all) countermeasures. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) This makes all Annotate* functions different, which prevents the linker from 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) folding them. */ 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __COUNTER__ 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DYNAMIC_ANNOTATIONS_IMPL \ 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile short lineno = (__LINE__ << 8) + __COUNTER__; (void)lineno; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DYNAMIC_ANNOTATIONS_IMPL \ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile short lineno = (__LINE__ << 8); (void)lineno; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* WARNING: always add new annotations to the end of the list. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Otherwise, lineno (see above) numbers for different Annotate* functions may 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) conflict. */ 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockCreate)( 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *lock) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockDestroy)( 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *lock) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockAcquired)( 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *lock, long is_w) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockReleased)( 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *lock, long is_w) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierInit)( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *barrier, long count, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long reinitialization_allowed) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierWaitBefore)( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *barrier) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierWaitAfter)( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *barrier) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierDestroy)( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *barrier) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateCondVarWait)( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *cv, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const volatile void *lock) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateCondVarSignal)( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *cv) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateCondVarSignalAll)( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *cv) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateHappensBefore)( 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *obj) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL}; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateHappensAfter)( 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *obj) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL}; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotatePublishMemoryRange)( 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *address, long size) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateUnpublishMemoryRange)( 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *address, long size) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQCreate)( 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *pcq) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQDestroy)( 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *pcq) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQPut)( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *pcq) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQGet)( 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *pcq) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateNewMemory)( 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *mem, long size) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateExpectRace)( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *mem, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *description) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateFlushExpectedRaces)( 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateBenignRace)( 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *mem, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *description) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateBenignRaceSized)( 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *mem, long size, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *description) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateMutexIsUsedAsCondVar)( 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *mu) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateMutexIsNotPHB)( 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *mu) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateTraceMemory)( 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *arg) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateThreadName)( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const char *name) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreReadsBegin)( 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreReadsEnd)( 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreWritesBegin)( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreWritesEnd)( 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreSyncBegin)( 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreSyncEnd)( 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateEnableRaceDetection)( 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, int enable) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateNoOp)( 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line, const volatile void *arg) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DYNAMIC_ANNOTATIONS_NAME(AnnotateFlushState)( 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *file, int line) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){DYNAMIC_ANNOTATIONS_IMPL} 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* DYNAMIC_ANNOTATIONS_ENABLED == 1 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL == 0 */ 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if DYNAMIC_ANNOTATIONS_PROVIDE_RUNNING_ON_VALGRIND == 1 \ 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL == 0 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int GetRunningOnValgrind(void) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef RUNNING_ON_VALGRIND 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RUNNING_ON_VALGRIND) return 1; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _MSC_VER 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *running_on_valgrind_str = getenv("RUNNING_ON_VALGRIND"); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (running_on_valgrind_str) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return strcmp(running_on_valgrind_str, "0") != 0; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Visual Studio issues warnings if we use getenv, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * so we use GetEnvironmentVariableA instead. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char value[100] = "1"; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int res = GetEnvironmentVariableA("RUNNING_ON_VALGRIND", 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value, sizeof(value)); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* value will remain "1" if res == 0 or res >= sizeof(value). The latter 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * can happen only if the given value is long, in this case it can't be "0". 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res > 0 && strcmp(value, "0") != 0) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* See the comments in dynamic_annotations.h */ 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RunningOnValgrind(void) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static volatile int running_on_valgrind = -1; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* C doesn't have thread-safe initialization of statics, and we 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) don't want to depend on pthread_once here, so hack it. */ 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int local_running_on_valgrind = running_on_valgrind; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (local_running_on_valgrind == -1) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) running_on_valgrind = local_running_on_valgrind = GetRunningOnValgrind(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return local_running_on_valgrind; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* DYNAMIC_ANNOTATIONS_PROVIDE_RUNNING_ON_VALGRIND == 1 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL == 0 */ 270