/* Copyright (c) 2008-2010, 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. */ // This file is part of ThreadSanitizer, a dynamic data race detector. // Author: Konstantin Serebryany. // Author: Timur Iskhodzhanov. #ifndef TS_EVENTS_H_ #define TS_EVENTS_H_ // Each event contains tid (the id of the current thread). // Most events contain pc (the program counter). // Some events contain: // * addr, a memory address, a lock address, etc // * size of a memory range // Few events contain a string (e.g. SET_THREAD_NAME). enum EventType { NOOP, // Should not appear. READ, // {tid, pc, addr, size} WRITE, // {tid, pc, addr, size} READER_LOCK, // {tid, pc, lock, 0} WRITER_LOCK, // {tid, pc, lock, 0} UNLOCK, // {tid, pc, lock, 0} UNLOCK_OR_INIT, // {tid, pc, lock, 0} LOCK_CREATE, // {tid, pc, lock, 0} LOCK_DESTROY, // {tid, pc, lock, 0} THR_CREATE_BEFORE, // Parent thread's event. {tid, pc, 0, 0} THR_CREATE_AFTER, // Parent thread's event. {tid, 0, 0, child_tid} THR_START, // Child thread's event {tid, CallStack, 0, parent_tid} THR_FIRST_INSN, // Used only by valgrind. THR_END, // {tid, 0, 0, 0} THR_JOIN_AFTER, // {tid, pc, joined_tid} THR_STACK_TOP, // {tid, pc, stack_top, stack_size_if_known} RTN_EXIT, // {tid, 0, 0, 0} RTN_CALL, // {tid, pc, 0, 0} SBLOCK_ENTER, // {tid, pc, 0, 0} SIGNAL, // {tid, pc, obj, 0} WAIT, // {tid, pc, obj, 0} CYCLIC_BARRIER_INIT, // {tid, pc, obj, n} CYCLIC_BARRIER_WAIT_BEFORE, // {tid, pc, obj, 0} CYCLIC_BARRIER_WAIT_AFTER, // {tid, pc, obj, 0} PCQ_CREATE, // {tid, pc, pcq_addr, 0} PCQ_DESTROY, // {tid, pc, pcq_addr, 0} PCQ_PUT, // {tid, pc, pcq_addr, 0} PCQ_GET, // {tid, pc, pcq_addr, 0} STACK_MEM_DIE, // deprecated. MALLOC, // {tid, pc, addr, size} FREE, // {tid, pc, addr, 0} MMAP, // {tid, pc, addr, size} MUNMAP, // {tid, pc, addr, size} PUBLISH_RANGE, // may be deprecated later. UNPUBLISH_RANGE, // deprecated. TODO(kcc): get rid of this. HB_LOCK, // {tid, pc, addr, 0} NON_HB_LOCK, // {tid, pc, addr, 0} IGNORE_READS_BEG, // {tid, pc, 0, 0} IGNORE_READS_END, // {tid, pc, 0, 0} IGNORE_WRITES_BEG, // {tid, pc, 0, 0} IGNORE_WRITES_END, // {tid, pc, 0, 0} SET_THREAD_NAME, // {tid, pc, name_str, 0} SET_LOCK_NAME, // {tid, pc, lock, lock_name_str} TRACE_MEM, // {tid, pc, addr, 0} EXPECT_RACE, // {tid, descr_str, ptr, size} BENIGN_RACE, // {tid, descr_str, ptr, size} EXPECT_RACE_BEGIN, // {tid, pc, 0, 0} EXPECT_RACE_END, // {tid, pc, 0, 0} VERBOSITY, // Used for debugging. STACK_TRACE, // {tid, pc, 0, 0}, for debugging. FLUSH_STATE, // {tid, pc, 0, 0} PC_DESCRIPTION, // {0, pc, descr_str, 0}, for ts_offline. PRINT_MESSAGE, // {tid, pc, message_str, 0}, for ts_offline. FLUSH_EXPECTED_RACES, // {0, 0, 0, 0} LAST_EVENT // Should not appear. }; #include "ts_event_names.h" // generated from this file by sed. class Event { public: Event(EventType type, int32_t tid, uintptr_t pc, uintptr_t a, uintptr_t info) : type_(type), tid_(tid), pc_(pc), a_(a), info_(info) { } Event() {} // Not initialized. void Init(EventType type, int32_t tid, uintptr_t pc, uintptr_t a, uintptr_t info) { type_ = type; tid_ = tid; pc_ = pc; a_ = a; info_ = info; } EventType type() const { return type_; } int32_t tid() const { return tid_; } uintptr_t a() const { return a_; } uintptr_t pc() const { return pc_; } uintptr_t info() const { return info_; } void Print() const { Printf("T%d: %s [pc=%p; a=%p; i=%p]\n", tid(), TypeString(type()), pc(), a(), info()); } static const char *TypeString(EventType type) { return kEventNames[type]; } private: EventType type_; int32_t tid_; uintptr_t pc_; uintptr_t a_; uintptr_t info_; }; // end. {{{1 #endif // TS_EVENTS_H_ // vim:shiftwidth=2:softtabstop=2:expandtab:tw=80