blob: 182d1182eece7f2768ebaf15df8de70f249e14d6 [file] [log] [blame]
José Fonseca589082d2011-03-30 09:10:40 +01001/**************************************************************************
2 *
3 * Copyright 2011 Jose Fonseca
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 *
24 **************************************************************************/
25
José Fonseca589082d2011-03-30 09:10:40 +010026
José Fonseca8d538122011-06-09 00:29:19 +010027#include <string.h>
José Fonseca45b28c42011-05-05 01:08:00 +010028#include <iostream>
29
Ryan C. Gordon2dad4b42012-01-08 01:32:41 -050030#include "os_time.hpp"
José Fonseca946da142011-12-11 14:32:50 +000031#include "trace_dump.hpp"
José Fonseca32871ed2011-04-10 13:40:52 +010032#include "retrace.hpp"
José Fonseca589082d2011-03-30 09:10:40 +010033
José Fonseca589082d2011-03-30 09:10:40 +010034
José Fonseca32871ed2011-04-10 13:40:52 +010035namespace retrace {
36
37
José Fonsecab1bb3c22011-10-08 20:23:18 +010038static bool call_dumped = false;
39
40
José Fonsecab4a3d142011-10-27 07:43:19 +010041static void dumpCall(trace::Call &call) {
José Fonsecab1bb3c22011-10-08 20:23:18 +010042 if (verbosity >= 0 && !call_dumped) {
43 std::cout << call;
44 std::cout.flush();
45 call_dumped = true;
46 }
47}
48
49
José Fonsecab4a3d142011-10-27 07:43:19 +010050std::ostream &warning(trace::Call &call) {
José Fonsecab1bb3c22011-10-08 20:23:18 +010051 dumpCall(call);
52
53 std::cerr << call.no << ": ";
54 std::cerr << "warning: ";
55
56 return std::cerr;
57}
58
59
José Fonsecab4a3d142011-10-27 07:43:19 +010060void ignore(trace::Call &call) {
José Fonseca8d538122011-06-09 00:29:19 +010061 (void)call;
62}
63
José Fonsecab4a3d142011-10-27 07:43:19 +010064void unsupported(trace::Call &call) {
José Fonsecaf5cda412011-10-09 17:27:23 +010065 warning(call) << "unsupported " << call.name() << " call\n";
José Fonseca45b28c42011-05-05 01:08:00 +010066}
67
José Fonseca2741ed82011-10-07 23:36:39 +010068inline void Retracer::addCallback(const Entry *entry) {
69 assert(entry->name);
70 assert(entry->callback);
71 map[entry->name] = entry->callback;
72}
José Fonseca8d538122011-06-09 00:29:19 +010073
José Fonseca2741ed82011-10-07 23:36:39 +010074
75void Retracer::addCallbacks(const Entry *entries) {
76 while (entries->name && entries->callback) {
77 addCallback(entries++);
78 }
79}
80
81
José Fonsecab4a3d142011-10-27 07:43:19 +010082void Retracer::retrace(trace::Call &call) {
José Fonsecab1bb3c22011-10-08 20:23:18 +010083 call_dumped = false;
84
José Fonsecaa94f2b62011-10-08 17:16:18 +010085 if (verbosity >= 1) {
José Fonsecac7751f62011-12-10 10:36:53 +000086 if (verbosity >= 2 ||
87 !(call.flags & trace::CALL_FLAG_VERBOSE)) {
88 dumpCall(call);
89 }
José Fonsecaa94f2b62011-10-08 17:16:18 +010090 }
91
José Fonseca2741ed82011-10-07 23:36:39 +010092 Callback callback = 0;
93
José Fonsecab4a3d142011-10-27 07:43:19 +010094 trace::Id id = call.sig->id;
José Fonseca2741ed82011-10-07 23:36:39 +010095 if (id >= callbacks.size()) {
96 callbacks.resize(id + 1);
97 callback = 0;
98 } else {
99 callback = callbacks[id];
José Fonseca8d538122011-06-09 00:29:19 +0100100 }
101
José Fonseca2741ed82011-10-07 23:36:39 +0100102 if (!callback) {
103 Map::const_iterator it = map.find(call.name());
104 if (it == map.end()) {
José Fonsecaf5cda412011-10-09 17:27:23 +0100105 callback = &unsupported;
José Fonseca2741ed82011-10-07 23:36:39 +0100106 } else {
107 callback = it->second;
108 }
109 callbacks[id] = callback;
110 }
111
112 assert(callback);
113 assert(callbacks[id] == callback);
114
James Benton6d923272012-07-25 13:48:20 +0100115 callback(call);
José Fonseca8d538122011-06-09 00:29:19 +0100116}
117
José Fonseca45b28c42011-05-05 01:08:00 +0100118
José Fonseca32871ed2011-04-10 13:40:52 +0100119} /* namespace retrace */