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