git-svn-id: http://ltt.polymtl.ca/svn@489 04897980-b3bd-0310-b5e0-8ef037075253
[lttv.git] / ltt / branches / poly / lttv / main / main.c
CommitLineData
9c312311 1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 Michel Dagenais
3 *
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;
7 *
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.
12 *
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,
16 * MA 02111-1307, USA.
17 */
18
eccb5352 19
3d218f2a 20#include <lttv/hook.h>
21#include <lttv/module.h>
fcdf0ec2 22#include <lttv/lttv.h>
ffd54a90 23#include <lttv/iattribute.h>
fcdf0ec2 24#include <lttv/attribute.h>
25#include <lttv/option.h>
dc877563 26#include <lttv/traceset.h>
27#include <ltt/trace.h>
d888c9c8 28#include <stdio.h>
29
eccb5352 30
dc877563 31void lttv_option_init(int argc, char **argv);
32void lttv_option_destroy();
33
34void lttv_module_init(int argc, char **argv);
35void lttv_module_destroy();
fcdf0ec2 36
ffd54a90 37void lttv_state_init(int argc, char **argv);
38void lttv_state_destroy();
39
b445142a 40void lttv_stats_init(int argc, char **argv);
41void lttv_stats_destroy();
42
eccb5352 43/* The main program maintains a few central data structures and relies
44 on modules for the rest. These data structures may be accessed by modules
45 through an exported API */
46
ffd54a90 47static LttvIAttribute *attributes;
eccb5352 48
dc877563 49static LttvHooks
50 *before_options,
51 *after_options,
52 *before_main,
53 *after_main;
eccb5352 54
dc877563 55static char
56 *a_module,
57 *a_module_path;
eccb5352 58
b445142a 59static gboolean
60 a_verbose,
61 a_debug;
62
dc877563 63static int a_argc;
eccb5352 64
dc877563 65static char **a_argv;
eccb5352 66
67static void lttv_module_option(void *hook_data);
68
69static void lttv_module_path_option(void *hook_data);
70
b445142a 71static void lttv_verbose(void *hook_data);
72
73static void lttv_debug(void *hook_data);
74
308711e5 75static void lttv_help(void *hook_data);
dc877563 76
eccb5352 77/* Since everything is done in modules, the main program only takes care
78 of the infrastructure. */
79
80int main(int argc, char **argv) {
81
ffd54a90 82 LttvAttributeValue value;
eccb5352 83
84#ifdef MEMDEBUG
85 g_mem_set_vtable(glib_mem_profiler_table);
86 g_message("Memory summary before main");
87 g_mem_profile();
88#endif
89
41f18f3e 90 g_type_init();
91 //g_type_init_with_debug_flags (G_TYPE_DEBUG_OBJECTS | G_TYPE_DEBUG_SIGNALS);
d83f6739 92
ffd54a90 93 attributes = LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
eccb5352 94
dc877563 95 before_options = lttv_hooks_new();
96 after_options = lttv_hooks_new();
97 before_main = lttv_hooks_new();
98 after_main = lttv_hooks_new();
eccb5352 99
dc877563 100 g_assert(lttv_iattribute_find_by_path(attributes, "hooks/options/before",
101 LTTV_POINTER, &value));
ffd54a90 102 *(value.v_pointer) = before_options;
dc877563 103 g_assert(lttv_iattribute_find_by_path(attributes, "hooks/options/after",
104 LTTV_POINTER, &value));
ffd54a90 105 *(value.v_pointer) = after_options;
dc877563 106 g_assert(lttv_iattribute_find_by_path(attributes, "hooks/main/before",
107 LTTV_POINTER, &value));
ffd54a90 108 *(value.v_pointer) = before_main;
dc877563 109 g_assert(lttv_iattribute_find_by_path(attributes, "hooks/main/after",
110 LTTV_POINTER, &value));
ffd54a90 111 *(value.v_pointer) = after_main;
eccb5352 112
eccb5352 113
114 /* Initialize the command line options processing */
115
b445142a 116 a_argc = argc;
117 a_argv = argv;
eccb5352 118 lttv_option_init(argc,argv);
119 lttv_module_init(argc,argv);
ffd54a90 120 lttv_state_init(argc,argv);
b445142a 121 lttv_stats_init(argc,argv);
eccb5352 122
123 /* Initialize the module loading */
124
125 lttv_module_path_add("/usr/lib/lttv/plugins");
126
127 /* Add some built-in options */
128
129 lttv_option_add("module",'m', "load a module", "name of module to load",
ffd54a90 130 LTTV_OPT_STRING, &a_module, lttv_module_option, NULL);
eccb5352 131
132 lttv_option_add("modules-path", 'L',
133 "add a directory to the module search path",
ffd54a90 134 "directory to add to the path", LTTV_OPT_STRING, &a_module_path,
eccb5352 135 lttv_module_path_option, NULL);
d888c9c8 136
137 lttv_option_add("help",'h', "basic help", "none",
138 LTTV_OPT_NONE, NULL, lttv_help, NULL);
b445142a 139
140 a_verbose = FALSE;
141 lttv_option_add("verbose",'v', "print information messages", "none",
142 LTTV_OPT_NONE, NULL, lttv_verbose, NULL);
143
144 a_debug = FALSE;
145 lttv_option_add("debug",'d', "print debugging messages", "none",
146 LTTV_OPT_NONE, NULL, lttv_debug, NULL);
d888c9c8 147
148
dc877563 149 lttv_hooks_call(before_options, NULL);
c432246e 150 lttv_option_parse(argc, argv);
dc877563 151 lttv_hooks_call(after_options, NULL);
c432246e 152
dc877563 153 lttv_hooks_call(before_main, NULL);
154 lttv_hooks_call(after_main, NULL);
eccb5352 155
b445142a 156 lttv_stats_destroy();
ffd54a90 157 lttv_state_destroy();
eccb5352 158 lttv_module_destroy();
159 lttv_option_destroy();
dc877563 160
161 lttv_hooks_destroy(before_options);
162 lttv_hooks_destroy(after_options);
163 lttv_hooks_destroy(before_main);
164 lttv_hooks_destroy(after_main);
165 g_object_unref(attributes);
eccb5352 166
167#ifdef MEMDEBUG
168 g_message("Memory summary after main");
169 g_mem_profile();
170#endif
eccb5352 171}
172
dc877563 173
ffd54a90 174LttvAttribute *lttv_global_attributes()
1cab0928 175{
cbe7c836 176 return (LttvAttribute*)attributes;
1cab0928 177}
178
179
eccb5352 180void lttv_module_option(void *hook_data)
181{
dc877563 182 lttv_module_load(a_module,a_argc,a_argv);
eccb5352 183}
184
185
186void lttv_module_path_option(void *hook_data)
187{
ffd54a90 188 lttv_module_path_add(a_module_path);
eccb5352 189}
d888c9c8 190
b445142a 191void lttv_verbose(void *hook_data)
192{
193 g_log_set_handler(NULL, G_LOG_LEVEL_INFO, g_log_default_handler, NULL);
194 g_info("Logging set to include INFO level messages");
195}
196
197void lttv_debug(void *hook_data)
198{
199 g_log_set_handler(NULL, G_LOG_LEVEL_DEBUG, g_log_default_handler, NULL);
200 g_info("Logging set to include DEBUG level messages");
201}
202
308711e5 203void lttv_help(void *hook_data)
d888c9c8 204{
205 printf("Linux Trace Toolkit Visualizer\n");
206 printf("\n");
207 lttv_option_show_help();
208 printf("\n");
209}
b445142a 210
308711e5 211/*
212
213- Make it easier to change modules from builtin to externally loaded.
214
215 have: MODULE_INFO(name, init, destroy, { require} ) in each module.
216 Maintain the list of builtin modules and search these first (or
217 optionally last). Add the lib prefix if needed to avoid having to
218 specify libbatchAnalysis instead of batchAnalysis.
219
220- Define formally traceset/trace in the GUI for the user and decide how
221 trace/traceset sharing goes in the application.
222
223- Use appropriately the new functions in time.h
224
225- remove the separate tracefiles (control/per cpu) arrays/loops in context.
226
227- split processTrace into context.c and processTrace.c
228
229- check spelling conventions.
230
231- get all the copyright notices.
232
233- remove all the warnings.
234
235- get all the .h files properly doxygen commented to produce useful documents.
236
237- have an intro/architecture document.
238
239- write a tutorial */
This page took 0.036777 seconds and 4 git commands to generate.