1 // Copyright 2006 The Android Open Source Project
3 #ifndef PARSE_OPTIONS_INL_H
4 #define PARSE_OPTIONS_INL_H
6 // Define a typedef for TraceReaderType and include "parse_options.h"
7 // before including this header file in a C++ source file.
15 // typedef TraceReader<symbol> TraceReaderType;
18 typedef TraceReaderType::symbol_type symbol_type;
19 typedef TraceReaderType::region_type region_type;
20 typedef TraceReaderType::ProcessState ProcessState;
22 symbol_type *kernel_sym;
23 symbol_type *library_sym;
25 // Returns true if the given event is included (or not excluded)
26 // from the list of valid events specified by the user on the
28 inline bool IsValidEvent(BBEvent *event, symbol_type *sym)
30 if (include_some_pids && pid_include_vector.GetBit(event->pid) == 0)
32 if (exclude_some_pids && pid_exclude_vector.GetBit(event->pid))
34 if (include_some_procedures) {
35 if (sym == NULL || included_procedures.Find(sym->name) == 0)
38 if (exclude_some_procedures) {
39 if (sym == NULL || excluded_procedures.Find(sym->name))
45 inline bool IsValidPid(int pid) {
46 if (include_some_pids && pid_include_vector.GetBit(pid) == 0)
48 if (exclude_some_pids && pid_exclude_vector.GetBit(pid))
53 inline symbol_type *GetSymbol(TraceReaderType *trace, int pid, uint32_t addr,
56 symbol_type *sym = trace->LookupFunction(pid, addr, time);
58 if (lump_kernel && (sym->region->flags & region_type::kIsKernelRegion)) {
59 if (kernel_sym == NULL) {
61 sym->name = ":kernel";
67 if (lump_libraries && (sym->region->flags & region_type::kIsLibraryRegion)) {
68 if (library_sym == NULL) {
79 inline bool IsIncludedProcedure(symbol_type *sym)
81 if (include_kernel_syms && (sym->region->flags & region_type::kIsKernelRegion))
83 if (include_library_syms && (sym->region->flags & region_type::kIsLibraryRegion))
85 return included_procedures.Find(sym->name);
88 inline bool IsExcludedProcedure(symbol_type *sym)
90 if (exclude_kernel_syms && (sym->region->flags & region_type::kIsKernelRegion))
92 if (exclude_library_syms && (sym->region->flags & region_type::kIsLibraryRegion))
94 return excluded_procedures.Find(sym->name);
97 // Returns true on end-of-file.
98 inline bool GetNextValidEvent(TraceReaderType *trace,
100 BBEvent *first_ignored_event,
101 symbol_type **sym_ptr)
103 symbol_type *sym = NULL;
104 first_ignored_event->time = 0;
105 if (trace->ReadBB(event))
110 if (include_some_pids) {
111 while (pid_include_vector.GetBit(event->pid) == 0) {
112 if (first_ignored_event->time == 0)
113 *first_ignored_event = *event;
114 if (trace->ReadBB(event))
117 } else if (exclude_some_pids) {
118 while (pid_exclude_vector.GetBit(event->pid)) {
119 if (first_ignored_event->time == 0)
120 *first_ignored_event = *event;
121 if (trace->ReadBB(event))
126 if (include_some_procedures) {
127 sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
128 while (!IsIncludedProcedure(sym)) {
129 if (first_ignored_event->time == 0)
130 *first_ignored_event = *event;
131 if (trace->ReadBB(event))
134 sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
136 } else if (exclude_some_procedures) {
137 sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
138 while (IsExcludedProcedure(sym)) {
139 if (first_ignored_event->time == 0)
140 *first_ignored_event = *event;
141 if (trace->ReadBB(event))
144 sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
149 sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
155 #endif // PARSE_OPTIONS_INL_H