1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 Michel Dagenais
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20 #include <lttv/hook.h>
21 #include <lttv/module.h>
22 #include <lttv/lttv.h>
23 #include <lttv/iattribute.h>
24 #include <lttv/attribute.h>
25 #include <lttv/option.h>
26 #include <lttv/traceset.h>
27 #include <ltt/trace.h>
32 void lttv_option_init(int argc
, char **argv
);
33 void lttv_option_destroy();
35 void lttv_module_init(int argc
, char **argv
);
36 void lttv_module_destroy();
38 void lttv_state_init(int argc
, char **argv
);
39 void lttv_state_destroy();
41 void lttv_stats_init(int argc
, char **argv
);
42 void lttv_stats_destroy();
44 /* The main program maintains a few central data structures and relies
45 on modules for the rest. These data structures may be accessed by modules
46 through an exported API */
48 static LttvIAttribute
*attributes
;
64 gboolean lttv_profile_memory
;
70 static void lttv_module_option(void *hook_data
);
72 static void lttv_module_path_option(void *hook_data
);
74 static void lttv_verbose(void *hook_data
);
76 static void lttv_debug(void *hook_data
);
78 static void lttv_help(void *hook_data
);
80 /* This is the handler to specify when we dont need all the debugging
81 messages. It receives the message and does nothing. */
83 void ignore_and_drop_message(const gchar
*log_domain
, GLogLevelFlags log_level
,
84 const gchar
*message
, gpointer user_data
) {
88 /* Since everything is done in modules, the main program only takes care
89 of the infrastructure. */
91 int main(int argc
, char **argv
) {
96 *profile_memory_short_option
= "-M",
97 *profile_memory_long_option
= "--memory";
99 gboolean profile_memory
= FALSE
;
101 LttvAttributeValue value
;
104 /* Before anything else, check if memory profiling is requested */
106 for(i
= 1 ; i
< argc
; i
++) {
107 if(*(argv
[i
]) != '-') break;
108 if(strcmp(argv
[i
], profile_memory_short_option
) == 0 ||
109 strcmp(argv
[i
], profile_memory_long_option
) == 0) {
111 g_mem_set_vtable(glib_mem_profiler_table
);
112 g_message("Memory summary before main");
114 profile_memory
= TRUE
;
120 /* Initialize glib and by default ignore info and debug messages */
123 //g_type_init_with_debug_flags (G_TYPE_DEBUG_OBJECTS | G_TYPE_DEBUG_SIGNALS);
124 g_log_set_handler(NULL
, G_LOG_LEVEL_INFO
, ignore_and_drop_message
, NULL
);
125 g_log_set_handler(NULL
, G_LOG_LEVEL_DEBUG
, ignore_and_drop_message
, NULL
);
128 /* Have an attributes subtree to store hooks to be registered by modules. */
130 attributes
= LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE
, NULL
));
132 before_options
= lttv_hooks_new();
133 after_options
= lttv_hooks_new();
134 before_main
= lttv_hooks_new();
135 after_main
= lttv_hooks_new();
138 /* Create a number of hooks lists */
140 g_assert(lttv_iattribute_find_by_path(attributes
, "hooks/options/before",
141 LTTV_POINTER
, &value
));
142 *(value
.v_pointer
) = before_options
;
143 g_assert(lttv_iattribute_find_by_path(attributes
, "hooks/options/after",
144 LTTV_POINTER
, &value
));
145 *(value
.v_pointer
) = after_options
;
146 g_assert(lttv_iattribute_find_by_path(attributes
, "hooks/main/before",
147 LTTV_POINTER
, &value
));
148 *(value
.v_pointer
) = before_main
;
149 g_assert(lttv_iattribute_find_by_path(attributes
, "hooks/main/after",
150 LTTV_POINTER
, &value
));
151 *(value
.v_pointer
) = after_main
;
154 /* Initialize the command line options processing */
158 lttv_option_init(argc
,argv
);
159 lttv_module_init(argc
,argv
);
160 lttv_state_init(argc
,argv
);
161 lttv_stats_init(argc
,argv
);
164 /* Initialize the module loading */
166 lttv_module_path_add(PACKAGE_PLUGIN_DIR
);
169 /* Add some built-in options */
171 lttv_option_add("module",'m', "load a module", "name of module to load",
172 LTTV_OPT_STRING
, &a_module
, lttv_module_option
, NULL
);
174 lttv_option_add("modules-path", 'L',
175 "add a directory to the module search path",
176 "directory to add to the path", LTTV_OPT_STRING
, &a_module_path
,
177 lttv_module_path_option
, NULL
);
179 lttv_option_add("help",'h', "basic help", "none",
180 LTTV_OPT_NONE
, NULL
, lttv_help
, NULL
);
183 lttv_option_add("verbose",'v', "print information messages", "none",
184 LTTV_OPT_NONE
, NULL
, lttv_verbose
, NULL
);
187 lttv_option_add("debug",'d', "print debugging messages", "none",
188 LTTV_OPT_NONE
, NULL
, lttv_debug
, NULL
);
190 lttv_profile_memory
= FALSE
;
191 lttv_option_add(profile_memory_long_option
+ 2,
192 profile_memory_short_option
[1], "print memory information", "none",
193 LTTV_OPT_NONE
, <tv_profile_memory
, NULL
, NULL
);
196 /* Process the options */
198 lttv_hooks_call(before_options
, NULL
);
199 lttv_option_parse(argc
, argv
);
200 lttv_hooks_call(after_options
, NULL
);
203 /* Memory profiling to be useful must be activated as early as possible */
205 if(profile_memory
!= lttv_profile_memory
)
206 g_error("Memory profiling options must appear before other options");
209 /* Do the main work */
211 lttv_hooks_call(before_main
, NULL
);
212 lttv_hooks_call(after_main
, NULL
);
215 /* Clean up everything */
217 lttv_stats_destroy();
218 lttv_state_destroy();
219 lttv_module_destroy();
220 lttv_option_destroy();
222 lttv_hooks_destroy(before_options
);
223 lttv_hooks_destroy(after_options
);
224 lttv_hooks_destroy(before_main
);
225 lttv_hooks_destroy(after_main
);
226 g_object_unref(attributes
);
229 g_message("Memory summary after main");
235 LttvAttribute
*lttv_global_attributes()
237 return (LttvAttribute
*)attributes
;
241 void lttv_module_option(void *hook_data
)
243 lttv_module_load(a_module
,a_argc
,a_argv
);
247 void lttv_module_path_option(void *hook_data
)
249 lttv_module_path_add(a_module_path
);
253 void lttv_verbose(void *hook_data
)
255 g_log_set_handler(NULL
, G_LOG_LEVEL_INFO
, g_log_default_handler
, NULL
);
256 g_info("Logging set to include INFO level messages");
259 void lttv_debug(void *hook_data
)
261 g_log_set_handler(NULL
, G_LOG_LEVEL_DEBUG
, g_log_default_handler
, NULL
);
262 g_info("Logging set to include DEBUG level messages");
265 void lttv_help(void *hook_data
)
267 printf("Linux Trace Toolkit Visualizer\n");
269 lttv_option_show_help();
275 - Make it easier to change modules from builtin to externally loaded.
277 have: MODULE_INFO(name, init, destroy, { require} ) in each module.
278 Maintain the list of builtin modules and search these first (or
279 optionally last). Add the lib prefix if needed to avoid having to
280 specify libbatchAnalysis instead of batchAnalysis.
282 - Define formally traceset/trace in the GUI for the user and decide how
283 trace/traceset sharing goes in the application.
285 - Use appropriately the new functions in time.h
287 - remove the separate tracefiles (control/per cpu) arrays/loops in context.
289 - split processTrace into context.c and processTrace.c
291 - check spelling conventions.
293 - get all the copyright notices.
295 - remove all the warnings.
297 - get all the .h files properly doxygen commented to produce useful documents.
299 - have an intro/architecture document.
301 - write a tutorial */