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#ifdef _MSC_VER
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# include <windows.h>
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef __cplusplus
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# error "This file should be built as pure C to avoid name mangling"
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <stdlib.h>
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string.h>
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/third_party/dynamic_annotations/dynamic_annotations.h"
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef __GNUC__
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/* valgrind.h uses gcc extensions so it won't build with other compilers */
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# include "base/third_party/valgrind/valgrind.h"
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/* Each function is empty and called (via a macro) only in debug mode.
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   The arguments are captured by dynamic tools at runtime. */
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if DYNAMIC_ANNOTATIONS_ENABLED == 1
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockCreate)(
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *lock){}
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockDestroy)(
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *lock){}
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockAcquired)(
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *lock, long is_w){}
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateRWLockReleased)(
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *lock, long is_w){}
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierInit)(
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *barrier, long count,
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    long reinitialization_allowed) {}
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierWaitBefore)(
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *barrier) {}
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierWaitAfter)(
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *barrier) {}
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateBarrierDestroy)(
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *barrier) {}
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateCondVarWait)(
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *cv,
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const volatile void *lock){}
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateCondVarSignal)(
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *cv){}
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateCondVarSignalAll)(
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *cv){}
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotatePublishMemoryRange)(
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *address, long size){}
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateUnpublishMemoryRange)(
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *address, long size){}
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQCreate)(
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *pcq){}
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQDestroy)(
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *pcq){}
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQPut)(
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *pcq){}
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotatePCQGet)(
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *pcq){}
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateNewMemory)(
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *mem, long size){}
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateExpectRace)(
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *mem,
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *description){}
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateFlushExpectedRaces)(
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line){}
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateBenignRace)(
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *mem,
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *description){}
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateBenignRaceSized)(
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *mem, long size,
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *description){}
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateMutexIsUsedAsCondVar)(
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *mu){}
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateMutexIsNotPHB)(
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *mu){}
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateTraceMemory)(
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *arg){}
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateThreadName)(
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const char *name){}
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreReadsBegin)(
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line){}
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreReadsEnd)(
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line){}
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreWritesBegin)(
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line){}
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreWritesEnd)(
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line){}
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreSyncBegin)(
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line){}
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateIgnoreSyncEnd)(
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line){}
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateEnableRaceDetection)(
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, int enable){}
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateNoOp)(
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line, const volatile void *arg){}
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DYNAMIC_ANNOTATIONS_NAME(AnnotateFlushState)(
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char *file, int line){}
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  /* DYNAMIC_ANNOTATIONS_ENABLED == 1 */
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if DYNAMIC_ANNOTATIONS_PROVIDE_RUNNING_ON_VALGRIND == 1
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic int GetRunningOnValgrind(void) {
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef RUNNING_ON_VALGRIND
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (RUNNING_ON_VALGRIND) return 1;
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef _MSC_VER
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  char *running_on_valgrind_str = getenv("RUNNING_ON_VALGRIND");
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (running_on_valgrind_str) {
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return strcmp(running_on_valgrind_str, "0") != 0;
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* Visual Studio issues warnings if we use getenv,
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   * so we use GetEnvironmentVariableA instead.
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   */
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  char value[100] = "1";
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int res = GetEnvironmentVariableA("RUNNING_ON_VALGRIND",
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    value, sizeof(value));
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* value will remain "1" if res == 0 or res >= sizeof(value). The latter
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   * can happen only if the given value is long, in this case it can't be "0".
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   */
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (res > 0 && strcmp(value, "0") != 0)
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return 1;
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return 0;
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/* See the comments in dynamic_annotations.h */
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint RunningOnValgrind(void) {
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static volatile int running_on_valgrind = -1;
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /* C doesn't have thread-safe initialization of statics, and we
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     don't want to depend on pthread_once here, so hack it. */
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int local_running_on_valgrind = running_on_valgrind;
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (local_running_on_valgrind == -1)
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    running_on_valgrind = local_running_on_valgrind = GetRunningOnValgrind();
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return local_running_on_valgrind;
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif /* DYNAMIC_ANNOTATIONS_PROVIDE_RUNNING_ON_VALGRIND == 1 */
171