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