1bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov/* Copyright (c) 2008-2010, Google Inc. 2bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * All rights reserved. 3bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * 4bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * Redistribution and use in source and binary forms, with or without 5bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * modification, are permitted provided that the following conditions are 6bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * met: 7bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * 8bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * * Redistributions of source code must retain the above copyright 9bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * notice, this list of conditions and the following disclaimer. 10bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * * Neither the name of Google Inc. nor the names of its 11bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * contributors may be used to endorse or promote products derived from 12bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * this software without specific prior written permission. 13bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * 14bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 15bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 16bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 17bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 18bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 19bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 20bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov */ 26bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov 27bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// This file is part of ThreadSanitizer, a dynamic data race detector. 28bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// Author: Konstantin Serebryany. 29bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// Author: Timur Iskhodzhanov. 30bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov 31bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov#ifndef TS_EVENTS_H_ 32bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov#define TS_EVENTS_H_ 33bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov 34bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// Each event contains tid (the id of the current thread). 35bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// Most events contain pc (the program counter). 36bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// Some events contain: 37bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// * addr, a memory address, a lock address, etc 38bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// * size of a memory range 39bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// Few events contain a string (e.g. SET_THREAD_NAME). 40bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov 41bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanovenum EventType { 42bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov NOOP, // Should not appear. 43bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov READ, // {tid, pc, addr, size} 44bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov WRITE, // {tid, pc, addr, size} 45bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov READER_LOCK, // {tid, pc, lock, 0} 46bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov WRITER_LOCK, // {tid, pc, lock, 0} 47bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov UNLOCK, // {tid, pc, lock, 0} 48bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov UNLOCK_OR_INIT, // {tid, pc, lock, 0} 49bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov LOCK_CREATE, // {tid, pc, lock, 0} 50bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov LOCK_DESTROY, // {tid, pc, lock, 0} 51bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov THR_CREATE_BEFORE, // Parent thread's event. {tid, pc, 0, 0} 52bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov THR_CREATE_AFTER, // Parent thread's event. {tid, 0, 0, child_tid} 53bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov THR_START, // Child thread's event {tid, CallStack, 0, parent_tid} 54bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov THR_FIRST_INSN, // Used only by valgrind. 55bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov THR_END, // {tid, 0, 0, 0} 56bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov THR_JOIN_AFTER, // {tid, pc, joined_tid} 57bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov THR_STACK_TOP, // {tid, pc, stack_top, stack_size_if_known} 58bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov RTN_EXIT, // {tid, 0, 0, 0} 59bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov RTN_CALL, // {tid, pc, 0, 0} 60bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov SBLOCK_ENTER, // {tid, pc, 0, 0} 61bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov SIGNAL, // {tid, pc, obj, 0} 62bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov WAIT, // {tid, pc, obj, 0} 63bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov CYCLIC_BARRIER_INIT, // {tid, pc, obj, n} 64bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov CYCLIC_BARRIER_WAIT_BEFORE, // {tid, pc, obj, 0} 65bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov CYCLIC_BARRIER_WAIT_AFTER, // {tid, pc, obj, 0} 66bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov PCQ_CREATE, // {tid, pc, pcq_addr, 0} 67bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov PCQ_DESTROY, // {tid, pc, pcq_addr, 0} 68bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov PCQ_PUT, // {tid, pc, pcq_addr, 0} 69bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov PCQ_GET, // {tid, pc, pcq_addr, 0} 70bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov STACK_MEM_DIE, // deprecated. 71bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov MALLOC, // {tid, pc, addr, size} 72bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov FREE, // {tid, pc, addr, 0} 73bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov MMAP, // {tid, pc, addr, size} 74bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov MUNMAP, // {tid, pc, addr, size} 75bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov PUBLISH_RANGE, // may be deprecated later. 76bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov UNPUBLISH_RANGE, // deprecated. TODO(kcc): get rid of this. 77bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov HB_LOCK, // {tid, pc, addr, 0} 78bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov NON_HB_LOCK, // {tid, pc, addr, 0} 79bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov IGNORE_READS_BEG, // {tid, pc, 0, 0} 80bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov IGNORE_READS_END, // {tid, pc, 0, 0} 81bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov IGNORE_WRITES_BEG, // {tid, pc, 0, 0} 82bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov IGNORE_WRITES_END, // {tid, pc, 0, 0} 83bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov SET_THREAD_NAME, // {tid, pc, name_str, 0} 84bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov SET_LOCK_NAME, // {tid, pc, lock, lock_name_str} 85bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov TRACE_MEM, // {tid, pc, addr, 0} 86bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov EXPECT_RACE, // {tid, descr_str, ptr, size} 87bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov BENIGN_RACE, // {tid, descr_str, ptr, size} 88bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov EXPECT_RACE_BEGIN, // {tid, pc, 0, 0} 89bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov EXPECT_RACE_END, // {tid, pc, 0, 0} 90bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov VERBOSITY, // Used for debugging. 91bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov STACK_TRACE, // {tid, pc, 0, 0}, for debugging. 92bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov FLUSH_STATE, // {tid, pc, 0, 0} 93bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov PC_DESCRIPTION, // {0, pc, descr_str, 0}, for ts_offline. 94bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov PRINT_MESSAGE, // {tid, pc, message_str, 0}, for ts_offline. 95bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov FLUSH_EXPECTED_RACES, // {0, 0, 0, 0} 96bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov LAST_EVENT // Should not appear. 97bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov}; 98bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov 99bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov#include "ts_event_names.h" // generated from this file by sed. 100bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov 101bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanovclass Event { 102bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov public: 103bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov Event(EventType type, int32_t tid, uintptr_t pc, uintptr_t a, uintptr_t info) 104bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov : type_(type), 105bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov tid_(tid), 106bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov pc_(pc), 107bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov a_(a), 108bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov info_(info) { 109bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov } 110bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov Event() {} // Not initialized. 111bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov 112bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov void Init(EventType type, int32_t tid, uintptr_t pc, uintptr_t a, uintptr_t info) { 113bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov type_ = type; 114bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov tid_ = tid; 115bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov pc_ = pc; 116bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov a_ = a; 117bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov info_ = info; 118bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov } 119bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov 120bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov 121bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov EventType type() const { return type_; } 122bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov int32_t tid() const { return tid_; } 123bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov uintptr_t a() const { return a_; } 124bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov uintptr_t pc() const { return pc_; } 125bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov uintptr_t info() const { return info_; } 126bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov void Print() const { 127bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov Printf("T%d: %s [pc=%p; a=%p; i=%p]\n", 128bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov tid(), TypeString(type()), pc(), a(), info()); 129bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov 130bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov } 131bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov static const char *TypeString(EventType type) { 132bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov return kEventNames[type]; 133bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov } 134bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov private: 135bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov EventType type_; 136bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov int32_t tid_; 137bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov uintptr_t pc_; 138bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov uintptr_t a_; 139bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov uintptr_t info_; 140bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov}; 141bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov 142bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov 143bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// end. {{{1 144bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov#endif // TS_EVENTS_H_ 145bec2f0e0495e343f55908a6f0cc4bd8dd27b27d1Evgeniy Stepanov// vim:shiftwidth=2:softtabstop=2:expandtab:tw=80 146