Debugger - Stage 2 (artf511247)
[deliverable/titan.core.git] / core / Profiler.hh
CommitLineData
d44e3c4f 1/******************************************************************************
2 * Copyright (c) 2000-2016 Ericsson Telecom AB
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * Balasko, Jeno
10 * Baranyi, Botond
11 *
12 ******************************************************************************/
af710487 13
14#ifndef PROFILER_HH
15#define PROFILER_HH
16
d44e3c4f 17#include <signal.h>
3abe9331 18#include "ProfilerTools.hh"
af710487 19
20/** This class performs profiling and code coverage on lines and functions in
21 * TTCN-3 code (requires the -z compiler option).
22 * Customizable through the configuration file's [PROFILER] section. */
23class TTCN3_Profiler {
24public:
25
af710487 26 /** Constructor */
27 TTCN3_Profiler();
a38c6d4c 28 /** Destructor
29 * In single mode and in the Host Controller's process in parallel mode:
30 * - imports data gathered on the previous run (if data aggregation is set)
31 * - imports data gathered by all other processes (only in parallel mode)
32 * - prints statistics (if necessary)
33 * Afterwards, in all cases:
34 * - exports data gathered in this process (including any imported data)
35 * - frees allocated memory */
af710487 36 ~TTCN3_Profiler();
37
a38c6d4c 38 /** Reactivates the profiler if it was stopped before, data gathering will resume */
39 void start();
40 /** Deactivates the profiler, no more data will be gathered until it is reactivated */
41 void stop();
42
af710487 43 /** Enables or disables profiling - called by the config file parser */
44 void set_disable_profiler(boolean p_disable_profiler);
45 /** Enables or disables code coverage - called by the config file parser */
46 void set_disable_coverage(boolean p_disable_coverage);
47 /** Sets the database file name (default is "profiler.db" - called by the config file parser */
48 void set_database_filename(const char* p_database_filename);
49 /** Enables or disables data aggregation - called by the config file parser */
50 void set_aggregate_data(boolean p_aggregate_data);
51 /** Sets the statistics file name (default is "profiler.stats" - called by the config file parser */
52 void set_stats_filename(const char* p_stats_filename);
53 /** Enables or disables the printing of statistics - called by the config file parser */
54 void set_disable_stats(boolean p_disable_stats);
a38c6d4c 55 /** Disables all statistics entry flags - called by the config file parser */
56 void reset_stats_flags();
57 /** Enables the specified statistics entry flags - called by the config file parser */
58 void add_stats_flags(unsigned int p_flags);
af710487 59
60 /** Returns true if profiling is disabled */
61 boolean is_profiler_disabled() const;
a38c6d4c 62 /** Returns true if the profiler is currently running (not stopped) */
63 boolean is_running() const;
af710487 64
d44e3c4f 65 /** Stores the PID of a newly created PTC or MTC (in parallel mode only) */
66 void add_child_process(pid_t p_pid);
a38c6d4c 67
af710487 68 /** Adds the data from the database file to the local database */
d44e3c4f 69 void import_data(pid_t p_pid = 0);
af710487 70 /** Writes the local database to the database file (overwrites the file) */
71 void export_data();
72
73 /** Calculates and prints statistics from the gathered data */
74 void print_stats();
75
76 /** Resets data related to the previous location and time (the local database is not changed) */
77 void reset();
78 /** Returns the current time (in seconds) */
a38c6d4c 79 static timeval get_time();
af710487 80 /** Called when a TTCN-3 function starts execution - stores data */
a38c6d4c 81 void enter_function(const char* filename, int lineno);
af710487 82 /** Called when a TTCN-3 code line starts execution - stores data */
83 void execute_line(const char* filename, int lineno);
84 /** Returns the index of a TTCN-3 file's entry in the local database */
85 int get_element(const char* filename);
86 /** Returns the index of a TTCN-3 function's entry in the database
87 * @param element index of the file (where the function is declared)
88 * @param lineno function start line */
89 int get_function(int element, int lineno);
90 /** Creates a new TTCN-3 function entry and inserts it in the database
91 * @param element file entry's index
92 * @param lineno function start line
93 * @param function_name name of the function */
94 void create_function(int element, int lineno, const char* function_name);
a38c6d4c 95 /** Returns the index of a TTCN-3 code line's entry in the database */
96 int get_line(int element, int lineno);
97 /** Creates a new TTCN-3 code line entry and inserts it into the database */
98 void create_line(int element, int lineno);
af710487 99 /** Adds elapsed time to the specified TTCN-3 code line's total time */
a38c6d4c 100 void add_line_time(timeval elapsed, int element, int lineno);
3abe9331 101 /** Adds elapsed time to the specified TTCN-3 function's total time */
a38c6d4c 102 void add_function_time(timeval elapsed, int element, int lineno);
af710487 103 /** Called when a TTCN-3 function's execution ends - stores data */
104 void update_last();
105 /** Stores data related to the previous location */
106 void set_prev(int stack_len, const char* filename, int lineno);
107
108private:
a38c6d4c 109 /** If true, the profiler ignores execute_line, enter_function and update_last calls */
110 boolean stopped;
af710487 111 /** Profiling is disabled if true */
112 boolean disable_profiler;
113 /** Code coverage is disabled if true */
114 boolean disable_coverage;
115 /** Contains the database file name */
116 char* database_filename;
117 /** If true, data gathered by previous runs will be added to the data gathered
118 * in this run */
119 boolean aggregate_data;
120 /** Contains the statistics file name */
121 char* stats_filename;
122 /** Statistics will not be calculated and printed if true */
123 boolean disable_stats;
a38c6d4c 124 /** Flags that determine which statistics entries are displayed */
125 unsigned int stats_flags;
af710487 126 /** The time measured at the previous TTCN-3 code line */
a38c6d4c 127 timeval prev_time;
af710487 128 /** Name of the TTCN-3 file, where the last executed line is (not owned) */
129 const char* prev_file;
130 /** The number of the previously executed line */
131 int prev_line;
132 /** The local database */
3abe9331 133 Profiler_Tools::profiler_db_t profiler_db;
af710487 134 /** The stack length at the previously executed line */
135 int prev_stack_len;
d44e3c4f 136 /** Contains the PIDs of the child processes (only relevant in the Host
a38c6d4c 137 * Controller's process, in parallel mode) */
d44e3c4f 138 Vector<pid_t> pid_list;
af710487 139};
140
141/** The global TTCN3_Profiler object
142 *
143 * One instance is created in each process (in parallel mode).
144 * After construction the configuration file parser may change the profiler's settings.
145 * The destructor merges its data with that of other processes (and possibly with previous runs)
146 * through the database file. The last destructor (the one in the Host Controller's process)
147 * prints the statistics (if enabled). */
148extern TTCN3_Profiler ttcn3_prof;
149
150/** Helper class for profiling
151 *
152 * Its instances depict the current call stack. One instance is created at the start
153 * of each TTCN-3 function execution, and it's destroyed at the function's end. */
154class TTCN3_Stack_Depth {
a38c6d4c 155public:
af710487 156 /** Entry for one function call in the call stack */
157 struct call_stack_timer_item_t {
158 /** Stack length before the function call */
159 int stack_len;
160 /** File name, where the calling function is declared (not owned) */
161 const char* caller_file;
a38c6d4c 162 /** File name, where the called function is declared (not owned) */
af710487 163 const char* func_file;
164 /** Calling function's start line */
165 int caller_line;
166 /** Called function's start line */
167 int start_line;
168 /** Time elapsed in this function call */
a38c6d4c 169 timeval elapsed;
170 /** If true, then this is the first entry of this function and caller pair
171 * (only used in case of gross line times) */
172 boolean first_call;
173 /** If true, then this function has appeared before in the call stack
174 * (only used in case of gross function times)*/
175 boolean recursive_call;
af710487 176 };
177
178 /** Constructor - increases the stack depth */
179 TTCN3_Stack_Depth();
180 /** Destructor - decreases the stack depth, updates call times in the profiler */
181 ~TTCN3_Stack_Depth();
182
a38c6d4c 183 /** Sets whether line times should include function call times - called by the config file parser */
184 static void set_net_line_times(boolean p_net_line_times);
185 /** Sets whether function times should include embedded function times - called by the config file parser */
186 static void set_net_func_times(boolean p_net_func_times);
187
af710487 188 /** Returns the current stack depth */
189 static int depth() { return current_depth; }
190 /** Inserts a new function call entry into the call stack database */
191 static void add_stack(int stack_len, const char* caller_file, const char* func_file,
192 int caller_line, int start_line);
193 /** Removes the last entry from the call stack database */
194 static void remove_stack();
195 /** Adds the elapsed time to all entries in the call stack database */
a38c6d4c 196 static void update_stack_elapsed(timeval elapsed);
af710487 197private:
198 /** The current stack depth (starts from 0)*/
199 static int current_depth;
200 /** The call stack database */
201 static Vector<call_stack_timer_item_t> call_stack_timer_db;
a38c6d4c 202 /** If true, line times will not include the execution times of functions called
203 * in that line */
204 static boolean net_line_times;
205 /** If true, function times will not include the execution times of functions
206 * called in that function */
207 static boolean net_func_times;
af710487 208};
209
210#endif /* PROFILER_HH */
211
This page took 0.051248 seconds and 5 git commands to generate.