17db96d56Sopenharmony_ci/* Copyright (c) 2008-2009, Google Inc. 27db96d56Sopenharmony_ci * All rights reserved. 37db96d56Sopenharmony_ci * 47db96d56Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 57db96d56Sopenharmony_ci * modification, are permitted provided that the following conditions are 67db96d56Sopenharmony_ci * met: 77db96d56Sopenharmony_ci * 87db96d56Sopenharmony_ci * * Redistributions of source code must retain the above copyright 97db96d56Sopenharmony_ci * notice, this list of conditions and the following disclaimer. 107db96d56Sopenharmony_ci * * Neither the name of Google Inc. nor the names of its 117db96d56Sopenharmony_ci * contributors may be used to endorse or promote products derived from 127db96d56Sopenharmony_ci * this software without specific prior written permission. 137db96d56Sopenharmony_ci * 147db96d56Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 157db96d56Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 167db96d56Sopenharmony_ci * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 177db96d56Sopenharmony_ci * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 187db96d56Sopenharmony_ci * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 197db96d56Sopenharmony_ci * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 207db96d56Sopenharmony_ci * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 217db96d56Sopenharmony_ci * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 227db96d56Sopenharmony_ci * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 237db96d56Sopenharmony_ci * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 247db96d56Sopenharmony_ci * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 257db96d56Sopenharmony_ci * 267db96d56Sopenharmony_ci * --- 277db96d56Sopenharmony_ci * Author: Kostya Serebryany 287db96d56Sopenharmony_ci */ 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci#ifdef _MSC_VER 317db96d56Sopenharmony_ci# include <windows.h> 327db96d56Sopenharmony_ci#endif 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci#ifdef __cplusplus 357db96d56Sopenharmony_ci# error "This file should be built as pure C to avoid name mangling" 367db96d56Sopenharmony_ci#endif 377db96d56Sopenharmony_ci 387db96d56Sopenharmony_ci#include <stdlib.h> 397db96d56Sopenharmony_ci#include <string.h> 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ci#include "dynamic_annotations.h" 427db96d56Sopenharmony_ci 437db96d56Sopenharmony_ci/* Each function is empty and called (via a macro) only in debug mode. 447db96d56Sopenharmony_ci The arguments are captured by dynamic tools at runtime. */ 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ci#if DYNAMIC_ANNOTATIONS_ENABLED == 1 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_civoid AnnotateRWLockCreate(const char *file, int line, 497db96d56Sopenharmony_ci const volatile void *lock){} 507db96d56Sopenharmony_civoid AnnotateRWLockDestroy(const char *file, int line, 517db96d56Sopenharmony_ci const volatile void *lock){} 527db96d56Sopenharmony_civoid AnnotateRWLockAcquired(const char *file, int line, 537db96d56Sopenharmony_ci const volatile void *lock, long is_w){} 547db96d56Sopenharmony_civoid AnnotateRWLockReleased(const char *file, int line, 557db96d56Sopenharmony_ci const volatile void *lock, long is_w){} 567db96d56Sopenharmony_civoid AnnotateBarrierInit(const char *file, int line, 577db96d56Sopenharmony_ci const volatile void *barrier, long count, 587db96d56Sopenharmony_ci long reinitialization_allowed) {} 597db96d56Sopenharmony_civoid AnnotateBarrierWaitBefore(const char *file, int line, 607db96d56Sopenharmony_ci const volatile void *barrier) {} 617db96d56Sopenharmony_civoid AnnotateBarrierWaitAfter(const char *file, int line, 627db96d56Sopenharmony_ci const volatile void *barrier) {} 637db96d56Sopenharmony_civoid AnnotateBarrierDestroy(const char *file, int line, 647db96d56Sopenharmony_ci const volatile void *barrier) {} 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_civoid AnnotateCondVarWait(const char *file, int line, 677db96d56Sopenharmony_ci const volatile void *cv, 687db96d56Sopenharmony_ci const volatile void *lock){} 697db96d56Sopenharmony_civoid AnnotateCondVarSignal(const char *file, int line, 707db96d56Sopenharmony_ci const volatile void *cv){} 717db96d56Sopenharmony_civoid AnnotateCondVarSignalAll(const char *file, int line, 727db96d56Sopenharmony_ci const volatile void *cv){} 737db96d56Sopenharmony_civoid AnnotatePublishMemoryRange(const char *file, int line, 747db96d56Sopenharmony_ci const volatile void *address, 757db96d56Sopenharmony_ci long size){} 767db96d56Sopenharmony_civoid AnnotateUnpublishMemoryRange(const char *file, int line, 777db96d56Sopenharmony_ci const volatile void *address, 787db96d56Sopenharmony_ci long size){} 797db96d56Sopenharmony_civoid AnnotatePCQCreate(const char *file, int line, 807db96d56Sopenharmony_ci const volatile void *pcq){} 817db96d56Sopenharmony_civoid AnnotatePCQDestroy(const char *file, int line, 827db96d56Sopenharmony_ci const volatile void *pcq){} 837db96d56Sopenharmony_civoid AnnotatePCQPut(const char *file, int line, 847db96d56Sopenharmony_ci const volatile void *pcq){} 857db96d56Sopenharmony_civoid AnnotatePCQGet(const char *file, int line, 867db96d56Sopenharmony_ci const volatile void *pcq){} 877db96d56Sopenharmony_civoid AnnotateNewMemory(const char *file, int line, 887db96d56Sopenharmony_ci const volatile void *mem, 897db96d56Sopenharmony_ci long size){} 907db96d56Sopenharmony_civoid AnnotateExpectRace(const char *file, int line, 917db96d56Sopenharmony_ci const volatile void *mem, 927db96d56Sopenharmony_ci const char *description){} 937db96d56Sopenharmony_civoid AnnotateBenignRace(const char *file, int line, 947db96d56Sopenharmony_ci const volatile void *mem, 957db96d56Sopenharmony_ci const char *description){} 967db96d56Sopenharmony_civoid AnnotateBenignRaceSized(const char *file, int line, 977db96d56Sopenharmony_ci const volatile void *mem, 987db96d56Sopenharmony_ci long size, 997db96d56Sopenharmony_ci const char *description) {} 1007db96d56Sopenharmony_civoid AnnotateMutexIsUsedAsCondVar(const char *file, int line, 1017db96d56Sopenharmony_ci const volatile void *mu){} 1027db96d56Sopenharmony_civoid AnnotateTraceMemory(const char *file, int line, 1037db96d56Sopenharmony_ci const volatile void *arg){} 1047db96d56Sopenharmony_civoid AnnotateThreadName(const char *file, int line, 1057db96d56Sopenharmony_ci const char *name){} 1067db96d56Sopenharmony_civoid AnnotateIgnoreReadsBegin(const char *file, int line){} 1077db96d56Sopenharmony_civoid AnnotateIgnoreReadsEnd(const char *file, int line){} 1087db96d56Sopenharmony_civoid AnnotateIgnoreWritesBegin(const char *file, int line){} 1097db96d56Sopenharmony_civoid AnnotateIgnoreWritesEnd(const char *file, int line){} 1107db96d56Sopenharmony_civoid AnnotateIgnoreSyncBegin(const char *file, int line){} 1117db96d56Sopenharmony_civoid AnnotateIgnoreSyncEnd(const char *file, int line){} 1127db96d56Sopenharmony_civoid AnnotateEnableRaceDetection(const char *file, int line, int enable){} 1137db96d56Sopenharmony_civoid AnnotateNoOp(const char *file, int line, 1147db96d56Sopenharmony_ci const volatile void *arg){} 1157db96d56Sopenharmony_civoid AnnotateFlushState(const char *file, int line){} 1167db96d56Sopenharmony_ci 1177db96d56Sopenharmony_cistatic int GetRunningOnValgrind(void) { 1187db96d56Sopenharmony_ci#ifdef RUNNING_ON_VALGRIND 1197db96d56Sopenharmony_ci if (RUNNING_ON_VALGRIND) return 1; 1207db96d56Sopenharmony_ci#endif 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci#ifndef _MSC_VER 1237db96d56Sopenharmony_ci const char *running_on_valgrind_str = getenv("RUNNING_ON_VALGRIND"); 1247db96d56Sopenharmony_ci if (running_on_valgrind_str) { 1257db96d56Sopenharmony_ci return strcmp(running_on_valgrind_str, "0") != 0; 1267db96d56Sopenharmony_ci } 1277db96d56Sopenharmony_ci#else 1287db96d56Sopenharmony_ci /* Visual Studio issues warnings if we use getenv, 1297db96d56Sopenharmony_ci * so we use GetEnvironmentVariableA instead. 1307db96d56Sopenharmony_ci */ 1317db96d56Sopenharmony_ci char value[100] = "1"; 1327db96d56Sopenharmony_ci int res = GetEnvironmentVariableA("RUNNING_ON_VALGRIND", 1337db96d56Sopenharmony_ci value, sizeof(value)); 1347db96d56Sopenharmony_ci /* value will remain "1" if res == 0 or res >= sizeof(value). The latter 1357db96d56Sopenharmony_ci * can happen only if the given value is long, in this case it can't be "0". 1367db96d56Sopenharmony_ci */ 1377db96d56Sopenharmony_ci if (res > 0 && !strcmp(value, "0")) 1387db96d56Sopenharmony_ci return 1; 1397db96d56Sopenharmony_ci#endif 1407db96d56Sopenharmony_ci return 0; 1417db96d56Sopenharmony_ci} 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci/* See the comments in dynamic_annotations.h */ 1447db96d56Sopenharmony_ciint RunningOnValgrind(void) { 1457db96d56Sopenharmony_ci static volatile int running_on_valgrind = -1; 1467db96d56Sopenharmony_ci /* C doesn't have thread-safe initialization of statics, and we 1477db96d56Sopenharmony_ci don't want to depend on pthread_once here, so hack it. */ 1487db96d56Sopenharmony_ci int local_running_on_valgrind = running_on_valgrind; 1497db96d56Sopenharmony_ci if (local_running_on_valgrind == -1) 1507db96d56Sopenharmony_ci running_on_valgrind = local_running_on_valgrind = GetRunningOnValgrind(); 1517db96d56Sopenharmony_ci return local_running_on_valgrind; 1527db96d56Sopenharmony_ci} 1537db96d56Sopenharmony_ci 1547db96d56Sopenharmony_ci#endif /* DYNAMIC_ANNOTATIONS_ENABLED == 1 */ 155