/* 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