/*
 * Copyright (C) 2011 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef SKY_ENGINE_WTF_DYNAMICANNOTATIONS_H_
#define SKY_ENGINE_WTF_DYNAMICANNOTATIONS_H_

/* This file defines dynamic annotations for use with dynamic analysis
 * tool such as ThreadSanitizer, Valgrind, etc.
 *
 * Dynamic annotation is a source code annotation that affects
 * the generated code (that is, the annotation is not a comment).
 * Each such annotation is attached to a particular
 * instruction and/or to a particular object (address) in the program.
 *
 * By using dynamic annotations a developer can give more details to the dynamic
 * analysis tool to improve its precision.
 *
 * In C/C++ program the annotations are represented as C macros.
 * With the default build flags, these macros are empty, hence don't affect
 * performance of a compiled binary.
 * If dynamic annotations are enabled, they just call no-op functions.
 * The dynamic analysis tools can intercept these functions and replace them
 * with their own implementations.
 *
 * See http://code.google.com/p/data-race-test/wiki/DynamicAnnotations for more information.
 */

#include "sky/engine/wtf/OperatingSystem.h"
#include "sky/engine/wtf/WTFExport.h"

#if USE(DYNAMIC_ANNOTATIONS)
/* Tell data race detector that we're not interested in reports on the given address range. */
#define WTF_ANNOTATE_BENIGN_RACE_SIZED(address, size, description) WTFAnnotateBenignRaceSized(__FILE__, __LINE__, address, size, description)
#define WTF_ANNOTATE_BENIGN_RACE(pointer, description) WTFAnnotateBenignRaceSized(__FILE__, __LINE__, pointer, sizeof(*(pointer)), description)

/* Annotations for user-defined synchronization mechanisms.
 * These annotations can be used to define happens-before arcs in user-defined
 * synchronization mechanisms: the race detector will infer an arc from
 * the former to the latter when they share the same argument pointer.
 *
 * The most common case requiring annotations is atomic reference counting:
 * bool deref() {
 *     ANNOTATE_HAPPENS_BEFORE(&m_refCount);
 *     if (!atomicDecrement(&m_refCount)) {
 *         // m_refCount is now 0
 *         ANNOTATE_HAPPENS_AFTER(&m_refCount);
 *         // "return true; happens-after each atomicDecrement of m_refCount"
 *         return true;
 *     }
 *     return false;
 * }
 */
#define WTF_ANNOTATE_HAPPENS_BEFORE(address) WTFAnnotateHappensBefore(__FILE__, __LINE__, address)
#define WTF_ANNOTATE_HAPPENS_AFTER(address) WTFAnnotateHappensAfter(__FILE__, __LINE__, address)

#ifdef __cplusplus
extern "C" {
#endif
/* Don't use these directly, use the above macros instead. */
WTF_EXPORT void WTFAnnotateBenignRaceSized(const char* file, int line, const volatile void* memory, long size, const char* description);
WTF_EXPORT void WTFAnnotateHappensBefore(const char* file, int line, const volatile void* address);
WTF_EXPORT void WTFAnnotateHappensAfter(const char* file, int line, const volatile void* address);
#ifdef __cplusplus
} // extern "C"
#endif

#else // USE(DYNAMIC_ANNOTATIONS)
/* These macros are empty when dynamic annotations are not enabled so you can
 * use them without affecting the performance of release binaries. */
#define WTF_ANNOTATE_BENIGN_RACE_SIZED(address, size, description)
#define WTF_ANNOTATE_BENIGN_RACE(pointer, description)
#define WTF_ANNOTATE_HAPPENS_BEFORE(address)
#define WTF_ANNOTATE_HAPPENS_AFTER(address)
#endif // USE(DYNAMIC_ANNOTATIONS)

#endif  // SKY_ENGINE_WTF_DYNAMICANNOTATIONS_H_
