Remove more warnings in the GUI modules
[lttv.git] / lttv / modules / gui / lttvwindow / lttvwindow / lttvwindowtraces.c
CommitLineData
a1a2b649 1/* This file is part of the Linux Trace Toolkit Graphic User Interface
2 * Copyright (C) 2003-2004 Mathieu Desnoyers
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
19/* This file is the API used to launch any background computation on a trace */
20
21/* Here is the implementation of the API */
22
4e4d11b3 23#ifdef HAVE_CONFIG_H
24#include <config.h>
25#endif
26
0fdb8bb0 27#include <sys/types.h>
28#include <sys/stat.h>
29#include <unistd.h>
2eef04b5 30#include <string.h>
43ed82b5 31#include <inttypes.h>
0fdb8bb0 32
a1a2b649 33#include <glib.h>
34#include <lttv/lttv.h>
35#include <lttv/traceset.h>
36#include <lttv/attribute.h>
a1a2b649 37#include <lttvwindow/lttvwindowtraces.h>
8bc02ec8 38#include <lttvwindow/lttvwindow.h> // for CHUNK_NUM_EVENTS
b5e17af5 39#include <lttvwindow/mainwindow-private.h> /* for main window structure */
a1a2b649 40
b5e17af5 41extern GSList * g_main_window_list;
a1a2b649 42
43typedef struct _BackgroundRequest {
44 LttvAttributeName module_name; /* Hook path in global attributes,
45 where all standard hooks under computation/.
46 i.e. modulename */
47 LttvTrace *trace; /* trace concerned */
93ac601b 48 GtkWidget *dialog; /* Dialog linked with the request, may be NULL */
b5e17af5 49 GtkWidget *parent_window; /* Parent window the dialog must be transient for */
a1a2b649 50} BackgroundRequest;
51
52typedef struct _BackgroundNotify {
53 gpointer owner;
54 LttvTrace *trace; /* trace */
55 LttTime notify_time;
451aaf27 56 LttvTracesetPosition *notify_position;
a1a2b649 57 LttvHooks *notify; /* Hook to call when the notify is
58 passed, or at the end of trace */
59} BackgroundNotify;
60
61
62
313bd6fc 63/* Prototypes */
64gboolean lttvwindowtraces_process_pending_requests(LttvTrace *trace);
65
a1a2b649 66/* Get a trace by its path name.
67 *
68 * @param path path of the trace on the virtual file system.
69 * @return Pointer to trace if found
70 * NULL is returned if the trace is not present
71 */
72
f9240312 73__EXPORT LttvTrace *lttvwindowtraces_get_trace_by_name(gchar *path)
a1a2b649 74{
451aaf27 75#ifdef BABEL_CLEANUP
a1a2b649 76 guint i;
77
78 for(i=0;i<lttvwindowtraces_get_number();i++) {
79 LttvTrace *trace_v = lttvwindowtraces_get_trace(i);
80 LttTrace *trace;
43ed82b5 81 const gchar *name;
a1a2b649 82 g_assert(trace_v != NULL);
83
84 trace = lttv_trace(trace_v);
85 g_assert(trace != NULL);
d27948a3 86 name = g_quark_to_string(ltt_trace_name(trace));
a1a2b649 87
88 if(strcmp(name, path) == 0) {
89 /* Found */
90 return trace_v;
91 }
92 }
451aaf27 93#endif
a1a2b649 94 return NULL;
95}
96
97/* Get a trace by its number identifier */
98
f9240312 99__EXPORT LttvTrace *lttvwindowtraces_get_trace(guint num)
a1a2b649 100{
101 LttvAttribute *g_attribute = lttv_global_attributes();
102 LttvAttribute *attribute;
103 LttvAttributeType type;
104 LttvAttributeName name;
105 LttvAttributeValue value;
c0cb4d12 106 gboolean is_named;
a1a2b649 107
96c9eb79 108 attribute =
a1a2b649 109 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
96c9eb79 110 LTTV_TRACES));
111 g_assert(attribute);
a1a2b649 112
c0cb4d12 113 type = lttv_iattribute_get(LTTV_IATTRIBUTE(attribute), num, &name, &value,
114 &is_named);
a1a2b649 115
116 if(type == LTTV_POINTER) {
117 return (LttvTrace *)*(value.v_pointer);
118 }
119
120 return NULL;
121}
122
123/* Total number of traces */
124
f9240312 125__EXPORT guint lttvwindowtraces_get_number()
a1a2b649 126{
127 LttvAttribute *g_attribute = lttv_global_attributes();
128 LttvAttribute *attribute;
a1a2b649 129
96c9eb79 130 attribute =
a1a2b649 131 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
96c9eb79 132 LTTV_TRACES));
133 g_assert(attribute);
a1a2b649 134
135 return ( lttv_iattribute_get_number(LTTV_IATTRIBUTE(attribute)) );
136}
137
138/* Add a trace to the global attributes */
139
140void lttvwindowtraces_add_trace(LttvTrace *trace)
141{
451aaf27 142
a1a2b649 143 LttvAttribute *attribute;
26ea84eb
YB
144#ifdef BABEL_CLEANUP
145
146 LttvAttribute *g_attribute = lttv_global_attributes();
0fdb8bb0 147 struct stat buf;
148 gchar attribute_path[PATH_MAX];
96c9eb79 149 int result;
150 gboolean result_b;
23bb9b6b 151 if(stat(g_quark_to_string(ltt_trace_name(lttv_trace(trace))), &buf)) {
0fdb8bb0 152 g_warning("lttvwindowtraces_add_trace: Trace %s not found",
23bb9b6b 153 g_quark_to_string(ltt_trace_name(lttv_trace(trace))));
0fdb8bb0 154 return;
155 }
43ed82b5 156 result = snprintf(attribute_path, PATH_MAX, "%" PRIu64 ":%" PRIu64,
157 buf.st_dev, buf.st_ino);
96c9eb79 158 g_assert(result >= 0);
0fdb8bb0 159
96c9eb79 160 attribute =
a1a2b649 161 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
96c9eb79 162 LTTV_TRACES));
163 g_assert(attribute);
0fdb8bb0 164
a1a2b649 165 value = lttv_attribute_add(attribute,
0fdb8bb0 166 g_quark_from_string(attribute_path),
a1a2b649 167 LTTV_POINTER);
168
169 *(value.v_pointer) = (gpointer)trace;
8bc02ec8 170
171 /* create new traceset and tracesetcontext */
172 LttvTraceset *ts;
313bd6fc 173 LttvTracesetStats *tss;
088f6772 174 //LttvTracesetContextPosition *sync_position;
8bc02ec8 175
176 attribute = lttv_trace_attribute(trace);
96c9eb79 177 result_b = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
8bc02ec8 178 LTTV_COMPUTATION_TRACESET,
179 LTTV_POINTER,
96c9eb79 180 &value);
181 g_assert(result_b);
182
8bc02ec8 183 ts = lttv_traceset_new();
184 *(value.v_pointer) = ts;
185
186 lttv_traceset_add(ts,trace);
187
96c9eb79 188 result_b = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
8bc02ec8 189 LTTV_COMPUTATION_TRACESET_CONTEXT,
190 LTTV_POINTER,
96c9eb79 191 &value);
192 g_assert(result_b);
193
313bd6fc 194 tss = g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
195 *(value.v_pointer) = tss;
8bc02ec8 196
313bd6fc 197 lttv_context_init(LTTV_TRACESET_CONTEXT(tss), ts);
451aaf27 198#endif
088f6772 199#if 0
96c9eb79 200 result_b = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
79257ba5 201 LTTV_COMPUTATION_SYNC_POSITION,
202 LTTV_POINTER,
96c9eb79 203 &value);
204 g_assert(result_b);
79257ba5 205
206 sync_position = lttv_traceset_context_position_new();
207 *(value.v_pointer) = sync_position;
088f6772 208#endif //0
26ea84eb 209 lttv_attribute_add(attribute,
8bc02ec8 210 LTTV_REQUESTS_QUEUE,
211 LTTV_POINTER);
212
26ea84eb 213 lttv_attribute_add(attribute,
8bc02ec8 214 LTTV_REQUESTS_CURRENT,
215 LTTV_POINTER);
216
26ea84eb 217 lttv_attribute_add(attribute,
8bc02ec8 218 LTTV_NOTIFY_QUEUE,
219 LTTV_POINTER);
220
26ea84eb 221 lttv_attribute_add(attribute,
8bc02ec8 222 LTTV_NOTIFY_CURRENT,
223 LTTV_POINTER);
a1a2b649 224}
225
226/* Remove a trace from the global attributes */
227
228void lttvwindowtraces_remove_trace(LttvTrace *trace)
229{
230 LttvAttribute *g_attribute = lttv_global_attributes();
231 LttvAttribute *attribute;
232 LttvAttributeValue value;
233 guint i;
96c9eb79 234 gboolean result;
a1a2b649 235
96c9eb79 236 attribute =
a1a2b649 237 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
96c9eb79 238 LTTV_TRACES));
239 g_assert(attribute);
a1a2b649 240
241 for(i=0;i<lttvwindowtraces_get_number();i++) {
242 LttvTrace *trace_v = lttvwindowtraces_get_trace(i);
243
244 g_assert(trace_v != NULL);
245
b052368a 246 /* Remove and background computation that could be in progress */
247 g_idle_remove_by_data(trace_v);
248
a1a2b649 249 if(trace_v == trace) {
250 /* Found */
8bc02ec8 251 LttvAttribute *l_attribute;
252
23bb9b6b 253 /* destroy traceset and tracesetcontext */
8bc02ec8 254 LttvTraceset *ts;
088f6772 255 //LttvTracesetContextPosition *sync_position;
8bc02ec8 256
257 l_attribute = lttv_trace_attribute(trace);
258
259
260 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(l_attribute),
261 LTTV_REQUESTS_QUEUE);
262
263 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(l_attribute),
264 LTTV_REQUESTS_CURRENT);
265
266 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(l_attribute),
267 LTTV_NOTIFY_QUEUE);
268
269 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(l_attribute),
270 LTTV_NOTIFY_CURRENT);
271
96c9eb79 272 result = lttv_iattribute_find(LTTV_IATTRIBUTE(l_attribute),
8bc02ec8 273 LTTV_COMPUTATION_TRACESET,
274 LTTV_POINTER,
96c9eb79 275 &value);
276 g_assert(result);
277
8bc02ec8 278 ts = (LttvTraceset*)*(value.v_pointer);
088f6772 279#if 0
96c9eb79 280 result = lttv_iattribute_find(LTTV_IATTRIBUTE(l_attribute),
79257ba5 281 LTTV_COMPUTATION_SYNC_POSITION,
282 LTTV_POINTER,
96c9eb79 283 &value);
284 g_assert(result);
285
79257ba5 286 sync_position = (LttvTracesetContextPosition*)*(value.v_pointer);
79257ba5 287 lttv_traceset_context_position_destroy(sync_position);
288
289 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(l_attribute),
290 LTTV_COMPUTATION_SYNC_POSITION);
291
088f6772 292#endif //0
96c9eb79 293 result = lttv_iattribute_find(LTTV_IATTRIBUTE(l_attribute),
8bc02ec8 294 LTTV_COMPUTATION_TRACESET_CONTEXT,
295 LTTV_POINTER,
96c9eb79 296 &value);
297 g_assert(result);
451aaf27 298#ifdef BABEL_CLEANUP
313bd6fc 299 tss = (LttvTracesetStats*)*(value.v_pointer);
8bc02ec8 300
313bd6fc 301 lttv_context_fini(LTTV_TRACESET_CONTEXT(tss));
302 g_object_unref(tss);
451aaf27 303#endif /* BABEL_CLEANUP */
8bc02ec8 304 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(l_attribute),
305 LTTV_COMPUTATION_TRACESET_CONTEXT);
8bc02ec8 306 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(l_attribute),
307 LTTV_COMPUTATION_TRACESET);
1ba187d3 308 /* Destroy the traceset and the trace also */
309 lttv_traceset_destroy(ts);
8bc02ec8 310
311 /* finally, remove the global attribute */
a1a2b649 312 lttv_attribute_remove(attribute, i);
8bc02ec8 313
a1a2b649 314 return;
315 }
316 }
317}
318
93ac601b 319static void destroy_dialog(BackgroundRequest *bg_req)
320{
321 gtk_widget_destroy(bg_req->dialog);
322 bg_req->dialog = NULL;
323}
324
a1a2b649 325
326/**
327 * Function to request data from a specific trace
328 *
329 * The memory allocated for the request will be managed by the API.
330 *
b5e17af5 331 * @param widget the current Window
a1a2b649 332 * @param trace the trace to compute
333 * @param module_name the name of the module which registered global computation
334 * hooks.
335 */
336
f9240312 337__EXPORT void lttvwindowtraces_background_request_queue
b5e17af5 338 (GtkWidget *widget, LttvTrace *trace, gchar *module_name)
a1a2b649 339{
340 BackgroundRequest *bg_req;
341 LttvAttribute *attribute = lttv_trace_attribute(trace);
91fd6881 342 LttvAttribute *g_attribute = lttv_global_attributes();
343 LttvAttribute *module_attribute;
a1a2b649 344 LttvAttributeValue value;
91fd6881 345 LttvAttributeType type;
a1a2b649 346 GSList **slist;
96c9eb79 347 gboolean result;
a1a2b649 348
eaac6798 349 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
a1a2b649 350 LTTV_REQUESTS_QUEUE,
351 LTTV_POINTER,
96c9eb79 352 &value);
353 g_assert(result);
354
a1a2b649 355 slist = (GSList**)(value.v_pointer);
91fd6881 356
357 /* Verify that the calculator is loaded */
96c9eb79 358 module_attribute =
91fd6881 359 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
96c9eb79 360 LTTV_COMPUTATION));
361 g_assert(module_attribute);
91fd6881 362
363 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
364 g_quark_from_string(module_name),
365 &value);
366 if(type == LTTV_NONE) {
367 g_critical("Missing background calculator %s", module_name);
368 return;
369 }
370
a1a2b649 371 bg_req = g_new(BackgroundRequest,1);
372 bg_req->module_name = g_quark_from_string(module_name);
373 bg_req->trace = trace;
374
375 *slist = g_slist_append(*slist, bg_req);
313bd6fc 376
377 /* Priority lower than live servicing */
378 g_idle_remove_by_data(trace);
379 g_idle_add_full((G_PRIORITY_HIGH_IDLE + 23),
380 (GSourceFunc)lttvwindowtraces_process_pending_requests,
381 trace,
382 NULL);
b052368a 383 /* FIXME : show message in status bar, need context and message id */
93ac601b 384 g_info("Background computation for %s started for trace %p", module_name,
385 trace);
386 GtkWidget *dialog =
b5e17af5 387 gtk_message_dialog_new(
388 GTK_WINDOW(widget),
389 GTK_DIALOG_DESTROY_WITH_PARENT,
390 GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
93ac601b 391 "Background computation for %s started for trace %s",
392 module_name,
451aaf27 393 trace->traceset->filename);
b5e17af5 394 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(widget));
93ac601b 395 g_signal_connect_swapped (dialog, "response",
396 G_CALLBACK (destroy_dialog),
397 bg_req);
398 bg_req->dialog = dialog;
b5e17af5 399 /* the parent window might vanish : only use this pointer for a
400 * comparison with existing windows */
401 bg_req->parent_window = gtk_widget_get_toplevel(widget);
93ac601b 402 gtk_widget_show(dialog);
a1a2b649 403}
404
405/**
406 * Remove a background request from a trace.
407 *
408 * This should ONLY be used by the modules which registered the global hooks
409 * (module_name). If this is called by the viewers, it may lead to incomplete
410 * and incoherent background processing information.
411 *
412 * Even if the module which deals with the hooks removes the background
413 * requests, it may cause a problem if the module gets loaded again in the
414 * session : the data will be partially calculated. The calculation function
415 * must deal with this case correctly.
416 *
417 * @param trace the trace to compute
418 * @param module_name the name of the module which registered global computation
419 * hooks.
420 */
421
422void lttvwindowtraces_background_request_remove
423 (LttvTrace *trace, gchar *module_name)
424{
425 LttvAttribute *attribute = lttv_trace_attribute(trace);
426 LttvAttributeValue value;
427 GSList *iter = NULL;
428 GSList **slist;
96c9eb79 429 gboolean result;
a1a2b649 430
eaac6798 431 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
a1a2b649 432 LTTV_REQUESTS_QUEUE,
433 LTTV_POINTER,
96c9eb79 434 &value);
435 g_assert(result);
436
a1a2b649 437 slist = (GSList**)(value.v_pointer);
438
439 for(iter=*slist;iter!=NULL;) {
440 BackgroundRequest *bg_req =
441 (BackgroundRequest *)iter->data;
442
443 if(bg_req->module_name == g_quark_from_string(module_name)) {
444 GSList *rem_iter = iter;
445 iter=g_slist_next(iter);
446 g_free(bg_req);
447 *slist = g_slist_delete_link(*slist, rem_iter);
448 } else {
449 iter=g_slist_next(iter);
450 }
451 }
452}
453
93ac601b 454/**
455 * Find a background request in a trace
456 *
457 */
458
f9240312 459__EXPORT gboolean lttvwindowtraces_background_request_find
93ac601b 460 (LttvTrace *trace, gchar *module_name)
461{
462 LttvAttribute *attribute = lttv_trace_attribute(trace);
463 LttvAttributeValue value;
464 GSList *iter = NULL;
465 GSList **slist;
96c9eb79 466 gboolean result;
93ac601b 467
96c9eb79 468 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
93ac601b 469 LTTV_REQUESTS_QUEUE,
470 LTTV_POINTER,
96c9eb79 471 &value);
472 g_assert(result);
473
93ac601b 474 slist = (GSList**)(value.v_pointer);
475
476 for(iter=*slist;iter!=NULL;) {
477 BackgroundRequest *bg_req =
478 (BackgroundRequest *)iter->data;
479
480 if(bg_req->module_name == g_quark_from_string(module_name)) {
481 return TRUE;
482 } else {
483 iter=g_slist_next(iter);
484 }
485 }
486 return FALSE;
487}
a1a2b649 488
489/**
490 * Register a callback to be called when requested data is passed in the next
491 * queued background processing.
492 *
493 * @param owner owner of the background notification
494 * @param trace the trace computed
495 * @param notify_time time when notification hooks must be called
496 * @param notify_position position when notification hooks must be called
497 * @param notify Hook to call when the notify position is passed
498 */
499
f9240312 500__EXPORT void lttvwindowtraces_background_notify_queue
a1a2b649 501 (gpointer owner,
502 LttvTrace *trace,
503 LttTime notify_time,
451aaf27 504 const LttvTracesetPosition *notify_position,
a1a2b649 505 const LttvHooks *notify)
506{
451aaf27 507 #ifdef BABEL_CLEANUP
a1a2b649 508 BackgroundNotify *bg_notify;
509 LttvAttribute *attribute = lttv_trace_attribute(trace);
510 LttvAttributeValue value;
511 GSList **slist;
96c9eb79 512 gboolean result;
a1a2b649 513
96c9eb79 514 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
a1a2b649 515 LTTV_NOTIFY_QUEUE,
516 LTTV_POINTER,
96c9eb79 517 &value);
518 g_assert(result);
519
a1a2b649 520 slist = (GSList**)(value.v_pointer);
521
96c9eb79 522 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
8e680509 523 LTTV_COMPUTATION_TRACESET_CONTEXT,
524 LTTV_POINTER,
96c9eb79 525 &value);
526 g_assert(result);
527
451aaf27 528 LttvTraceset *ts = (LttvTraceset)(value.v_pointer);
a1a2b649 529
530 bg_notify = g_new(BackgroundNotify,1);
531
532 bg_notify->owner = owner;
533 bg_notify->trace = trace;
534 bg_notify->notify_time = notify_time;
313bd6fc 535 if(notify_position != NULL) {
8e680509 536 bg_notify->notify_position = lttv_traceset_context_position_new(tsc);
313bd6fc 537 lttv_traceset_context_position_copy(bg_notify->notify_position,
538 notify_position);
539 } else {
540 bg_notify->notify_position = NULL;
541 }
542
a1a2b649 543 bg_notify->notify = lttv_hooks_new();
544 lttv_hooks_add_list(bg_notify->notify, notify);
545
546 *slist = g_slist_append(*slist, bg_notify);
451aaf27 547#endif /* BABEL_CLEANUP*/
a1a2b649 548}
549
550/**
551 * Register a callback to be called when requested data is passed in the current
552 * background processing.
553 *
554 * @param owner owner of the background notification
555 * @param trace the trace computed
556 * @param notify_time time when notification hooks must be called
557 * @param notify_position position when notification hooks must be called
558 * @param notify Hook to call when the notify position is passed
559 */
560
f9240312 561__EXPORT void lttvwindowtraces_background_notify_current
a1a2b649 562 (gpointer owner,
563 LttvTrace *trace,
564 LttTime notify_time,
451aaf27 565 const LttvTracesetPosition *notify_position,
a1a2b649 566 const LttvHooks *notify)
567{
451aaf27 568 #ifdef BABEL_CLEANUP
a1a2b649 569 BackgroundNotify *bg_notify;
570 LttvAttribute *attribute = lttv_trace_attribute(trace);
571 LttvAttributeValue value;
572 GSList **slist;
96c9eb79 573 gboolean result;
a1a2b649 574
96c9eb79 575 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
a1a2b649 576 LTTV_NOTIFY_CURRENT,
577 LTTV_POINTER,
96c9eb79 578 &value);
579 g_assert(result);
580
a1a2b649 581 slist = (GSList**)(value.v_pointer);
582
96c9eb79 583 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
8e680509 584 LTTV_COMPUTATION_TRACESET_CONTEXT,
585 LTTV_POINTER,
96c9eb79 586 &value);
587 g_assert(result);
588
8e680509 589 LttvTracesetContext *tsc = (LttvTracesetContext*)(value.v_pointer);
590
591
a1a2b649 592 bg_notify = g_new(BackgroundNotify,1);
593
594 bg_notify->owner = owner;
595 bg_notify->trace = trace;
596 bg_notify->notify_time = notify_time;
313bd6fc 597 if(notify_position!= NULL) {
8e680509 598 bg_notify->notify_position = lttv_traceset_context_position_new(tsc);
313bd6fc 599 lttv_traceset_context_position_copy(bg_notify->notify_position,
600 notify_position);
601 } else {
602 bg_notify->notify_position = NULL;
603 }
a1a2b649 604 bg_notify->notify = lttv_hooks_new();
605 lttv_hooks_add_list(bg_notify->notify, notify);
606
607 *slist = g_slist_append(*slist, bg_notify);
451aaf27 608 #endif /* BABEL_CLEANUP */
a1a2b649 609}
610
b052368a 611
612static void notify_request_free(BackgroundNotify *notify_req)
613{
451aaf27 614 #ifdef BABEL_CLEANUP
b052368a 615 if(notify_req == NULL) return;
616
617 if(notify_req->notify_position != NULL)
618 lttv_traceset_context_position_destroy(notify_req->notify_position);
619 if(notify_req->notify != NULL)
620 lttv_hooks_destroy(notify_req->notify);
621 g_free(notify_req);
451aaf27 622 #endif /* BABEL_CLEANUP */
b052368a 623}
624
a1a2b649 625/**
626 * Removes all the notifications requests from a specific viewer.
627 *
628 * @param owner owner of the background notification
629 */
630
f9240312 631__EXPORT void lttvwindowtraces_background_notify_remove(gpointer owner)
a1a2b649 632{
633 guint i;
634
635 for(i=0;i<lttvwindowtraces_get_number();i++) {
636 LttvAttribute *attribute;
637 LttvAttributeValue value;
638 LttvTrace *trace_v = lttvwindowtraces_get_trace(i);
639 GSList **slist;
640 GSList *iter = NULL;
96c9eb79 641 gboolean result;
a1a2b649 642
643 g_assert(trace_v != NULL);
644
b052368a 645 attribute = lttv_trace_attribute(trace_v);
a1a2b649 646
96c9eb79 647 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
a1a2b649 648 LTTV_NOTIFY_QUEUE,
649 LTTV_POINTER,
96c9eb79 650 &value);
651 g_assert(result);
652
a1a2b649 653 slist = (GSList**)(value.v_pointer);
654
655 for(iter=*slist;iter!=NULL;) {
656
657 BackgroundNotify *bg_notify = (BackgroundNotify*)iter->data;
658
659 if(bg_notify->owner == owner) {
660 GSList *rem_iter = iter;
661 iter=g_slist_next(iter);
b052368a 662 notify_request_free(bg_notify);
663 *slist = g_slist_remove_link(*slist, rem_iter);
a1a2b649 664 } else {
665 iter=g_slist_next(iter);
666 }
667 }
668
96c9eb79 669 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
a1a2b649 670 LTTV_NOTIFY_CURRENT,
671 LTTV_POINTER,
96c9eb79 672 &value);
673 g_assert(result);
674
a1a2b649 675 slist = (GSList**)(value.v_pointer);
676
677 for(iter=*slist;iter!=NULL;) {
678
679 BackgroundNotify *bg_notify = (BackgroundNotify*)iter->data;
680
681 if(bg_notify->owner == owner) {
682 GSList *rem_iter = iter;
683 iter=g_slist_next(iter);
b052368a 684 notify_request_free(bg_notify);
685 *slist = g_slist_remove_link(*slist, rem_iter);
a1a2b649 686 } else {
687 iter=g_slist_next(iter);
688 }
689 }
690 }
691}
692
8bc02ec8 693
694/* Background processing helper functions */
695
696void lttvwindowtraces_add_computation_hooks(LttvAttributeName module_name,
451aaf27 697 LttvTraceset *ts,
1ce324c6 698 LttvHooks *hook_adder)
8bc02ec8 699{
451aaf27 700 #ifdef BABEL_CLEANUP
8bc02ec8 701 LttvAttribute *g_attribute = lttv_global_attributes();
702 LttvAttribute *module_attribute;
703 LttvAttributeType type;
704 LttvAttributeValue value;
088f6772 705
706
96c9eb79 707 module_attribute =
088f6772 708 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
96c9eb79 709 LTTV_COMPUTATION));
710 g_assert(module_attribute);
088f6772 711
96c9eb79 712 module_attribute =
088f6772 713 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
714 LTTV_IATTRIBUTE(module_attribute),
96c9eb79 715 module_name));
716 g_assert(module_attribute);
088f6772 717
718 /* Call the module's hook adder */
719 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
720 LTTV_HOOK_ADDER,
721 &value);
722 if(type == LTTV_POINTER) {
723 //lttv_hooks_call((LttvHooks*)*(value.v_pointer), (gpointer)tss);
724 if(hook_adder != NULL)
725 lttv_hooks_add_list(hook_adder, (LttvHooks*)*(value.v_pointer));
726 }
451aaf27 727#endif /* BABEL_CLEANUP */
088f6772 728}
729
730void lttvwindowtraces_remove_computation_hooks(LttvAttributeName module_name,
451aaf27 731 LttvTraceset *ts,
088f6772 732 LttvHooks *hook_remover)
733{
451aaf27 734 #ifdef BABEL_CLEANUP
088f6772 735 LttvAttribute *g_attribute = lttv_global_attributes();
736 LttvAttribute *module_attribute;
737 LttvAttributeType type;
738 LttvAttributeValue value;
739
96c9eb79 740 module_attribute =
088f6772 741 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
96c9eb79 742 LTTV_COMPUTATION));
743 g_assert(module_attribute);
088f6772 744
96c9eb79 745 module_attribute =
088f6772 746 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
747 LTTV_IATTRIBUTE(module_attribute),
96c9eb79 748 module_name));
749 g_assert(module_attribute);
088f6772 750
751 /* Call the module's hook remover */
752 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
753 LTTV_HOOK_REMOVER,
754 &value);
755 if(type == LTTV_POINTER) {
756 //lttv_hooks_call((LttvHooks*)*(value.v_pointer), (gpointer)tss);
757 if(hook_remover != NULL)
758 lttv_hooks_add_list(hook_remover, (LttvHooks*)*(value.v_pointer));
759 }
451aaf27 760 #endif /* BABEL_CLEANUP */
088f6772 761}
762
763void lttvwindowtraces_call_before_chunk(LttvAttributeName module_name,
451aaf27 764 LttvTraceset *ts)
088f6772 765{
451aaf27 766 #ifdef BABEL_CLEANUP
088f6772 767 LttvAttribute *g_attribute = lttv_global_attributes();
768 LttvAttribute *module_attribute;
769 LttvAttributeType type;
770 LttvAttributeValue value;
8bc02ec8 771 LttvHooks *before_chunk_traceset=NULL;
772 LttvHooks *before_chunk_trace=NULL;
773 LttvHooks *before_chunk_tracefile=NULL;
774 LttvHooks *event_hook=NULL;
750eb11a 775 LttvHooksByIdChannelArray *event_hook_by_id_channel=NULL;
8bc02ec8 776
777
96c9eb79 778 module_attribute =
8bc02ec8 779 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
96c9eb79 780 LTTV_COMPUTATION));
781 g_assert(module_attribute);
8bc02ec8 782
96c9eb79 783 module_attribute =
8bc02ec8 784 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
785 LTTV_IATTRIBUTE(module_attribute),
96c9eb79 786 module_name));
787 g_assert(module_attribute);
8bc02ec8 788
789 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
790 LTTV_BEFORE_CHUNK_TRACESET,
791 &value);
792 if(type == LTTV_POINTER) {
793 before_chunk_traceset = (LttvHooks*)*(value.v_pointer);
794 }
795
796 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
797 LTTV_BEFORE_CHUNK_TRACE,
798 &value);
799 if(type == LTTV_POINTER) {
800 before_chunk_trace = (LttvHooks*)*(value.v_pointer);
801 }
802
803 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
804 LTTV_BEFORE_CHUNK_TRACEFILE,
805 &value);
806 if(type == LTTV_POINTER) {
807 before_chunk_tracefile = (LttvHooks*)*(value.v_pointer);
808 }
809
810 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
811 LTTV_EVENT_HOOK,
812 &value);
813 if(type == LTTV_POINTER) {
814 event_hook = (LttvHooks*)*(value.v_pointer);
815 }
816
817 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
750eb11a 818 LTTV_EVENT_HOOK_BY_ID_CHANNEL,
8bc02ec8 819 &value);
820 if(type == LTTV_POINTER) {
43ed82b5 821 event_hook_by_id_channel = (LttvHooksByIdChannelArray*)*(value.v_pointer);
8bc02ec8 822 }
823
8bc02ec8 824 lttv_process_traceset_begin(tsc,
825 before_chunk_traceset,
826 before_chunk_trace,
827 before_chunk_tracefile,
828 event_hook,
750eb11a 829 event_hook_by_id_channel);
451aaf27 830#endif /* BABEL_CLEANUP */
8bc02ec8 831}
088f6772 832
833
834
835void lttvwindowtraces_call_after_chunk(LttvAttributeName module_name,
451aaf27 836 LttvTraceset *ts)
8bc02ec8 837{
838 LttvAttribute *g_attribute = lttv_global_attributes();
839 LttvAttribute *module_attribute;
840 LttvAttributeType type;
841 LttvAttributeValue value;
842 LttvHooks *after_chunk_traceset=NULL;
843 LttvHooks *after_chunk_trace=NULL;
844 LttvHooks *after_chunk_tracefile=NULL;
845 LttvHooks *event_hook=NULL;
8bc02ec8 846
96c9eb79 847 module_attribute =
8bc02ec8 848 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
96c9eb79 849 LTTV_COMPUTATION));
850 g_assert(module_attribute);
8bc02ec8 851
96c9eb79 852 module_attribute =
8bc02ec8 853 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
854 LTTV_IATTRIBUTE(module_attribute),
96c9eb79 855 module_name));
856 g_assert(module_attribute);
8bc02ec8 857
858 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
859 LTTV_AFTER_CHUNK_TRACESET,
860 &value);
861 if(type == LTTV_POINTER) {
862 after_chunk_traceset = (LttvHooks*)*(value.v_pointer);
863 }
864
865 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
866 LTTV_AFTER_CHUNK_TRACE,
867 &value);
868 if(type == LTTV_POINTER) {
869 after_chunk_trace = (LttvHooks*)*(value.v_pointer);
870 }
871
872 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
873 LTTV_AFTER_CHUNK_TRACEFILE,
874 &value);
875 if(type == LTTV_POINTER) {
876 after_chunk_tracefile = (LttvHooks*)*(value.v_pointer);
877 }
878
879 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
880 LTTV_EVENT_HOOK,
881 &value);
882 if(type == LTTV_POINTER) {
883 event_hook = (LttvHooks*)*(value.v_pointer);
884 }
885
886 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
750eb11a 887 LTTV_EVENT_HOOK_BY_ID_CHANNEL,
8bc02ec8 888 &value);
26ea84eb 889#ifdef BABEL_CLEANUP
8bc02ec8 890 lttv_process_traceset_end(tsc,
891 after_chunk_traceset,
892 after_chunk_trace,
893 after_chunk_tracefile,
451aaf27
FD
894 event_hook);
895#endif /* BABEL_CLEANUP*/
313bd6fc 896
8bc02ec8 897}
898
899
900void lttvwindowtraces_set_in_progress(LttvAttributeName module_name,
901 LttvTrace *trace)
902{
903 LttvAttribute *attribute = lttv_trace_attribute(trace);
8bc02ec8 904
96c9eb79 905 attribute =
8bc02ec8 906 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(attribute),
96c9eb79 907 module_name));
908 g_assert(attribute);
8bc02ec8 909
e865422c
YB
910 lttv_iattribute_add(LTTV_IATTRIBUTE(attribute),
911 LTTV_IN_PROGRESS,
912 LTTV_INT);
8bc02ec8 913 /* the value is left unset. The only presence of the attribute is necessary.
914 */
915}
916
917void lttvwindowtraces_unset_in_progress(LttvAttributeName module_name,
918 LttvTrace *trace)
919{
920 LttvAttribute *attribute = lttv_trace_attribute(trace);
921
96c9eb79 922 attribute =
8bc02ec8 923 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(attribute),
96c9eb79 924 module_name));
925 g_assert(attribute);
8bc02ec8 926
313bd6fc 927 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
8bc02ec8 928 LTTV_IN_PROGRESS);
929}
930
f9240312 931__EXPORT gboolean lttvwindowtraces_get_in_progress(LttvAttributeName module_name,
8bc02ec8 932 LttvTrace *trace)
933{
934 LttvAttribute *attribute = lttv_trace_attribute(trace);
935 LttvAttributeType type;
936 LttvAttributeValue value;
937
96c9eb79 938 attribute =
8bc02ec8 939 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(attribute),
96c9eb79 940 module_name));
941 g_assert(attribute);
8bc02ec8 942
943 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
944 LTTV_IN_PROGRESS,
945 &value);
946 /* The only presence of the attribute is necessary. */
947 if(type == LTTV_NONE)
948 return FALSE;
949 else
950 return TRUE;
951}
952
953void lttvwindowtraces_set_ready(LttvAttributeName module_name,
954 LttvTrace *trace)
955{
956 LttvAttribute *attribute = lttv_trace_attribute(trace);
8bc02ec8 957
96c9eb79 958 attribute =
8bc02ec8 959 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(attribute),
96c9eb79 960 module_name));
961 g_assert(attribute);
8bc02ec8 962
e865422c
YB
963 lttv_iattribute_add(LTTV_IATTRIBUTE(attribute),
964 LTTV_READY,
965 LTTV_INT);
8bc02ec8 966 /* the value is left unset. The only presence of the attribute is necessary.
967 */
968}
969
970void lttvwindowtraces_unset_ready(LttvAttributeName module_name,
971 LttvTrace *trace)
972{
973 LttvAttribute *attribute = lttv_trace_attribute(trace);
974
96c9eb79 975 attribute =
8bc02ec8 976 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(attribute),
96c9eb79 977 module_name));
978 g_assert(attribute);
8bc02ec8 979
313bd6fc 980 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
8bc02ec8 981 LTTV_READY);
982}
983
f9240312 984__EXPORT gboolean lttvwindowtraces_get_ready(LttvAttributeName module_name,
8bc02ec8 985 LttvTrace *trace)
986{
987 LttvAttribute *attribute = lttv_trace_attribute(trace);
988 LttvAttributeType type;
989 LttvAttributeValue value;
990
96c9eb79 991 attribute =
8bc02ec8 992 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(attribute),
96c9eb79 993 module_name));
994 g_assert(attribute);
8bc02ec8 995
996 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
997 LTTV_READY,
998 &value);
999 /* The only presence of the attribute is necessary. */
1000 if(type == LTTV_NONE)
1001 return FALSE;
1002 else
1003 return TRUE;
1004}
26ea84eb 1005#ifdef BABEL_CLEANUP
b5e17af5 1006static gint find_window_widget(MainWindow *a, GtkWidget *b)
1007{
1008 if(a->mwindow == b) return 0;
1009 else return -1;
1010}
26ea84eb 1011#endif
8bc02ec8 1012
8bc02ec8 1013/* lttvwindowtraces_process_pending_requests
d389bc8d 1014 *
1015 * Process the pending background computation requests
8bc02ec8 1016 *
1017 * This internal function gets called by g_idle, taking care of the pending
1018 * requests.
1019 *
1020 */
1021
1022
1023gboolean lttvwindowtraces_process_pending_requests(LttvTrace *trace)
1024{
8bc02ec8 1025 LttvAttribute *attribute;
91fd6881 1026 LttvAttribute *g_attribute = lttv_global_attributes();
313bd6fc 1027 GSList **list_out, **list_in, **notify_in, **notify_out;
8bc02ec8 1028 LttvAttributeValue value;
1029 LttvAttributeType type;
b052368a 1030 gboolean ret_val;
8bc02ec8 1031
313bd6fc 1032 if(trace == NULL)
8bc02ec8 1033 return FALSE;
3c456a8a 1034
1035 if(lttvwindow_preempt_count > 0) return TRUE;
8bc02ec8 1036
1037 attribute = lttv_trace_attribute(trace);
1038
1039 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
1040 LTTV_REQUESTS_QUEUE,
1041 &value);
1042 g_assert(type == LTTV_POINTER);
313bd6fc 1043 list_out = (GSList**)(value.v_pointer);
8bc02ec8 1044
1045 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
1046 LTTV_REQUESTS_CURRENT,
1047 &value);
1048 g_assert(type == LTTV_POINTER);
313bd6fc 1049 list_in = (GSList**)(value.v_pointer);
8bc02ec8 1050
1051 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
1052 LTTV_NOTIFY_QUEUE,
1053 &value);
1054 g_assert(type == LTTV_POINTER);
313bd6fc 1055 notify_out = (GSList**)(value.v_pointer);
8bc02ec8 1056
1057 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
1058 LTTV_NOTIFY_CURRENT,
1059 &value);
1060 g_assert(type == LTTV_POINTER);
313bd6fc 1061 notify_in = (GSList**)(value.v_pointer);
8bc02ec8 1062
1063 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
1064 LTTV_COMPUTATION_TRACESET,
1065 &value);
1066 g_assert(type == LTTV_POINTER);
26ea84eb 1067#ifdef BABEL_CLEANUP
8bc02ec8 1068 ts = (LttvTraceset*)*(value.v_pointer);
26ea84eb 1069#endif
088f6772 1070#if 0
79257ba5 1071 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
1072 LTTV_COMPUTATION_SYNC_POSITION,
1073 &value);
1074 g_assert(type == LTTV_POINTER);
1075 sync_position = (LttvTracesetContextPosition*)*(value.v_pointer);
088f6772 1076#endif //0
451aaf27 1077#ifdef BABEL_CLEANUP
8bc02ec8 1078 /* There is no events requests pending : we should never have been called! */
313bd6fc 1079 g_assert(g_slist_length(*list_out) != 0 || g_slist_length(*list_in) != 0);
b052368a 1080 /* 0.1 Lock traces */
1081 {
1082 guint iter_trace=0;
1083
1084 for(iter_trace=0;
451aaf27 1085 iter_trace<lttv_traceset_number(ts->ts);
b052368a 1086 iter_trace++) {
451aaf27 1087 LttvTrace *trace_v = lttv_traceset_get(ts->ts,iter_trace);
b052368a 1088
1089 if(lttvwindowtraces_lock(trace_v) != 0)
1090 return TRUE; /* Cannot get trace lock, try later */
8bc02ec8 1091
b052368a 1092 }
1093 }
1094 /* 0.2 Sync tracefiles */
088f6772 1095 //g_assert(lttv_process_traceset_seek_position(tsc, sync_position) == 0);
1096 lttv_process_traceset_synchronize_tracefiles(tsc);
8bc02ec8 1097 /* 1. Before processing */
1098 {
1099 /* if list_in is empty */
313bd6fc 1100 if(g_slist_length(*list_in) == 0) {
8bc02ec8 1101
1102 {
1103 /* - Add all requests in list_out to list_in, empty list_out */
313bd6fc 1104 GSList *iter = *list_out;
8bc02ec8 1105
1106 while(iter != NULL) {
1107 gboolean remove = FALSE;
1108 gboolean free_data = FALSE;
1109
1110 BackgroundRequest *bg_req = (BackgroundRequest*)iter->data;
1111
1112 remove = TRUE;
1113 free_data = FALSE;
313bd6fc 1114 *list_in = g_slist_append(*list_in, bg_req);
8bc02ec8 1115
1116 /* Go to next */
1117 if(remove)
1118 {
1119 GSList *remove_iter = iter;
1120
1121 iter = g_slist_next(iter);
1122 if(free_data) g_free(remove_iter->data);
313bd6fc 1123 *list_out = g_slist_remove_link(*list_out, remove_iter);
8bc02ec8 1124 } else { // not remove
1125 iter = g_slist_next(iter);
1126 }
1127 }
1128 }
1129
1130 {
313bd6fc 1131 GSList *iter = *list_in;
8bc02ec8 1132 /* - for each request in list_in */
1133 while(iter != NULL) {
1134
1135 BackgroundRequest *bg_req = (BackgroundRequest*)iter->data;
91fd6881 1136 /* - set hooks'in_progress flag to TRUE */
8bc02ec8 1137 lttvwindowtraces_set_in_progress(bg_req->module_name,
1138 bg_req->trace);
91fd6881 1139
1140 /* - call before request hook */
1141 /* Get before request hook */
1142 LttvAttribute *module_attribute;
1143
96c9eb79 1144 module_attribute =
91fd6881 1145 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
1146 LTTV_IATTRIBUTE(g_attribute),
96c9eb79 1147 LTTV_COMPUTATION));
1148 g_assert(module_attribute);
91fd6881 1149
96c9eb79 1150 module_attribute =
91fd6881 1151 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
1152 LTTV_IATTRIBUTE(module_attribute),
96c9eb79 1153 bg_req->module_name));
1154 g_assert(module_attribute);
91fd6881 1155
1156 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
1157 LTTV_BEFORE_REQUEST,
1158 &value);
1159 g_assert(type == LTTV_POINTER);
1160 LttvHooks *before_request = (LttvHooks*)*(value.v_pointer);
91fd6881 1161
1162 if(before_request != NULL) lttv_hooks_call(before_request, tsc);
8bc02ec8 1163
1164 iter = g_slist_next(iter);
1165 }
1166 }
1167
1168 /* - seek trace to start */
1169 {
1170 LttTime start = { 0, 0};
1171 lttv_process_traceset_seek_time(tsc, start);
1172 }
1173
1174 /* - Move all notifications from notify_out to notify_in. */
1175 {
313bd6fc 1176 GSList *iter = *notify_out;
1177 g_assert(g_slist_length(*notify_in) == 0);
8bc02ec8 1178
1179 while(iter != NULL) {
1180 gboolean remove = FALSE;
1181 gboolean free_data = FALSE;
1182
1183 BackgroundNotify *notify_req = (BackgroundNotify*)iter->data;
1184
1185 remove = TRUE;
1186 free_data = FALSE;
313bd6fc 1187 *notify_in = g_slist_append(*notify_in, notify_req);
8bc02ec8 1188
1189 /* Go to next */
1190 if(remove)
1191 {
1192 GSList *remove_iter = iter;
1193
1194 iter = g_slist_next(iter);
b052368a 1195 if(free_data)
1196 notify_request_free((BackgroundNotify*)remove_iter->data);
313bd6fc 1197 *notify_out = g_slist_remove_link(*notify_out, remove_iter);
8bc02ec8 1198 } else { // not remove
1199 iter = g_slist_next(iter);
1200 }
1201 }
1202 }
088f6772 1203 {
1204 GSList *iter = *list_in;
1205 LttvHooks *hook_adder = lttv_hooks_new();
1206 /* - for each request in list_in */
1207 while(iter != NULL) {
1208
1209 BackgroundRequest *bg_req = (BackgroundRequest*)iter->data;
1210 /*- add hooks to context*/
1211 lttvwindowtraces_add_computation_hooks(bg_req->module_name,
1212 tsc,
1213 hook_adder);
1214 iter = g_slist_next(iter);
1215 }
1216 lttv_hooks_call(hook_adder,tsc);
1217 lttv_hooks_destroy(hook_adder);
1218 }
1219
1220
8bc02ec8 1221 }
1222
1223 {
313bd6fc 1224 GSList *iter = *list_in;
8bc02ec8 1225 /* - for each request in list_in */
1226 while(iter != NULL) {
1227
1228 BackgroundRequest *bg_req = (BackgroundRequest*)iter->data;
1229 /*- Call before chunk hooks for list_in*/
088f6772 1230 lttvwindowtraces_call_before_chunk(bg_req->module_name,
1231 tsc);
8bc02ec8 1232 iter = g_slist_next(iter);
1233 }
1234 }
8bc02ec8 1235
088f6772 1236 }
8bc02ec8 1237 /* 2. call process traceset middle for a chunk */
1238 {
1239 /*(assert list_in is not empty! : should not even be called in that case)*/
0aa6c3a1 1240 LttTime end = ltt_time_infinite;
313bd6fc 1241 g_assert(g_slist_length(*list_in) != 0);
8bc02ec8 1242
1243 lttv_process_traceset_middle(tsc, end, CHUNK_NUM_EVENTS, NULL);
1244 }
1245
1246 /* 3. After the chunk */
1247 {
1248 /* 3.1 call after_chunk hooks for list_in */
1249 {
313bd6fc 1250 GSList *iter = *list_in;
8bc02ec8 1251 /* - for each request in list_in */
1252 while(iter != NULL) {
1253
1254 BackgroundRequest *bg_req = (BackgroundRequest*)iter->data;
1255 /* - Call after chunk hooks for list_in */
088f6772 1256 lttvwindowtraces_call_after_chunk(bg_req->module_name,
1257 tsc);
8bc02ec8 1258 iter = g_slist_next(iter);
1259 }
1260 }
1261
1262 /* 3.2 for each notify_in */
1263 {
313bd6fc 1264 GSList *iter = *notify_in;
8bc02ec8 1265 LttvTracefileContext *tfc = lttv_traceset_context_get_current_tfc(tsc);
1266
1267 while(iter != NULL) {
1268 gboolean remove = FALSE;
1269 gboolean free_data = FALSE;
1270
1271 BackgroundNotify *notify_req = (BackgroundNotify*)iter->data;
1272
1273 /* - if current time >= notify time, call notify and remove from
1274 * notify_in.
1275 * - if current position >= notify position, call notify and remove
1276 * from notify_in.
1277 */
1278 if( (tfc != NULL &&
313bd6fc 1279 ltt_time_compare(notify_req->notify_time, tfc->timestamp) <= 0)
8bc02ec8 1280 ||
313bd6fc 1281 (notify_req->notify_position != NULL &&
1282 lttv_traceset_context_ctx_pos_compare(tsc,
1283 notify_req->notify_position) >= 0)
8bc02ec8 1284 ) {
1285
1286 lttv_hooks_call(notify_req->notify, notify_req);
1287
1288 remove = TRUE;
1289 free_data = TRUE;
1290 }
1291
1292 /* Go to next */
1293 if(remove)
1294 {
1295 GSList *remove_iter = iter;
1296
1297 iter = g_slist_next(iter);
b052368a 1298 if(free_data)
1299 notify_request_free((BackgroundNotify*)remove_iter->data);
313bd6fc 1300 *notify_in = g_slist_remove_link(*notify_in, remove_iter);
8bc02ec8 1301 } else { // not remove
1302 iter = g_slist_next(iter);
1303 }
1304 }
1305 }
1306
1307 {
1308 LttvTracefileContext *tfc = lttv_traceset_context_get_current_tfc(tsc);
1309 /* 3.3 if end of trace reached */
313bd6fc 1310 if(tfc != NULL)
1311 g_debug("Current time : %lu sec, %lu nsec",
1312 tfc->timestamp.tv_sec, tfc->timestamp.tv_nsec);
8bc02ec8 1313 if(tfc == NULL || ltt_time_compare(tfc->timestamp,
1314 tsc->time_span.end_time) > 0) {
088f6772 1315
1316 {
1317 GSList *iter = *list_in;
1318 LttvHooks *hook_remover = lttv_hooks_new();
1319 /* - for each request in list_in */
1320 while(iter != NULL) {
1321
1322 BackgroundRequest *bg_req = (BackgroundRequest*)iter->data;
1323 /* - remove hooks from context */
1324 lttvwindowtraces_remove_computation_hooks(bg_req->module_name,
1325 tsc,
1326 hook_remover);
1327 iter = g_slist_next(iter);
1328 }
1329 lttv_hooks_call(hook_remover,tsc);
1330 lttv_hooks_destroy(hook_remover);
1331 }
1332
8bc02ec8 1333 /* - for each request in list_in */
1334 {
313bd6fc 1335 GSList *iter = *list_in;
8bc02ec8 1336
1337 while(iter != NULL) {
1338 gboolean remove = FALSE;
1339 gboolean free_data = FALSE;
1340
1341 BackgroundRequest *bg_req = (BackgroundRequest*)iter->data;
1342
1343 /* - set hooks'in_progress flag to FALSE */
1344 lttvwindowtraces_unset_in_progress(bg_req->module_name,
1345 bg_req->trace);
1346 /* - set hooks'ready flag to TRUE */
1347 lttvwindowtraces_set_ready(bg_req->module_name,
1348 bg_req->trace);
91fd6881 1349 /* - call after request hook */
1350 /* Get after request hook */
1351 LttvAttribute *module_attribute;
1352
96c9eb79 1353 module_attribute =
91fd6881 1354 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
1355 LTTV_IATTRIBUTE(g_attribute),
96c9eb79 1356 LTTV_COMPUTATION));
1357 g_assert(module_attribute);
91fd6881 1358
96c9eb79 1359 module_attribute =
91fd6881 1360 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
1361 LTTV_IATTRIBUTE(module_attribute),
96c9eb79 1362 bg_req->module_name));
1363 g_assert(module_attribute);
91fd6881 1364
1365 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
1366 LTTV_AFTER_REQUEST,
1367 &value);
1368 g_assert(type == LTTV_POINTER);
1369 LttvHooks *after_request = (LttvHooks*)*(value.v_pointer);
b91e751b 1370 {
1371 struct sum_traceset_closure t_closure;
1372 t_closure.tss = (LttvTracesetStats*)tsc;
1373 t_closure.current_time = ltt_time_infinite;
1374 if(after_request != NULL) lttv_hooks_call(after_request,
1375 &t_closure);
1376 }
93ac601b 1377
1378 if(bg_req->dialog != NULL)
1379 gtk_widget_destroy(bg_req->dialog);
b5e17af5 1380 GtkWidget *parent_window;
1381 if(g_slist_find_custom(g_main_window_list,
1382 bg_req->parent_window,
1383 (GCompareFunc)find_window_widget))
1384 parent_window = GTK_WIDGET(bg_req->parent_window);
1385 else
1386 parent_window = NULL;
1387
93ac601b 1388 GtkWidget *dialog =
b5e17af5 1389 gtk_message_dialog_new(GTK_WINDOW(parent_window),
1390 GTK_DIALOG_DESTROY_WITH_PARENT,
1391 GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
93ac601b 1392 "Background computation %s finished for trace %s",
1393 g_quark_to_string(bg_req->module_name),
1394 g_quark_to_string(ltt_trace_name(lttv_trace(bg_req->trace))));
b5e17af5 1395 if(parent_window != NULL)
1396 gtk_window_set_transient_for(GTK_WINDOW(dialog),
1397 GTK_WINDOW(parent_window));
93ac601b 1398 g_signal_connect_swapped (dialog, "response",
1399 G_CALLBACK (gtk_widget_destroy),
1400 dialog);
1401 gtk_widget_show(dialog);
1402
8bc02ec8 1403 /* - remove request */
1404 remove = TRUE;
1405 free_data = TRUE;
1406
1407 /* Go to next */
1408 if(remove)
1409 {
1410 GSList *remove_iter = iter;
1411
1412 iter = g_slist_next(iter);
1413 if(free_data) g_free(remove_iter->data);
313bd6fc 1414 *list_in = g_slist_remove_link(*list_in, remove_iter);
8bc02ec8 1415 } else { // not remove
1416 iter = g_slist_next(iter);
1417 }
1418 }
1419 }
1420
1421 /* - for each notifications in notify_in */
1422 {
313bd6fc 1423 GSList *iter = *notify_in;
8bc02ec8 1424
1425 while(iter != NULL) {
1426 gboolean remove = FALSE;
1427 gboolean free_data = FALSE;
1428
1429 BackgroundNotify *notify_req = (BackgroundNotify*)iter->data;
1430
1431 /* - call notify and remove from notify_in */
1432 lttv_hooks_call(notify_req->notify, notify_req);
1433 remove = TRUE;
1434 free_data = TRUE;
1435
1436 /* Go to next */
1437 if(remove)
1438 {
1439 GSList *remove_iter = iter;
1440
1441 iter = g_slist_next(iter);
b052368a 1442 if(free_data)
1443 notify_request_free((BackgroundNotify*)remove_iter->data);
313bd6fc 1444 *notify_in = g_slist_remove_link(*notify_in, remove_iter);
8bc02ec8 1445 } else { // not remove
1446 iter = g_slist_next(iter);
1447 }
1448 }
1449 }
1ce324c6 1450 {
1451 /* - reset the context */
1452 LTTV_TRACESET_CONTEXT_GET_CLASS(tsc)->fini(tsc);
1453 LTTV_TRACESET_CONTEXT_GET_CLASS(tsc)->init(tsc,ts);
1454 }
3710295e 1455 /* - if list_out is empty */
1456 if(g_slist_length(*list_out) == 0) {
1457 /* - return FALSE (scheduler stopped) */
1458 g_debug("Background computation scheduler stopped");
1459 g_info("Background computation finished for trace %p", trace);
1460 /* FIXME : remove status bar info, need context id and message id */
93ac601b 1461
3710295e 1462 ret_val = FALSE;
1463 } else {
1464 ret_val = TRUE;
1465 }
8bc02ec8 1466 } else {
1467 /* 3.4 else, end of trace not reached */
1468 /* - return TRUE (scheduler still registered) */
313bd6fc 1469 g_debug("Background computation left");
b052368a 1470 ret_val = TRUE;
8bc02ec8 1471 }
1472 }
1473 }
b052368a 1474 /* 4. Unlock traces */
1475 {
088f6772 1476 lttv_process_traceset_get_sync_data(tsc);
1477 //lttv_traceset_context_position_save(tsc, sync_position);
b052368a 1478 guint iter_trace;
1479
1480 for(iter_trace=0;
1481 iter_trace<lttv_traceset_number(tsc->ts);
1482 iter_trace++) {
1483 LttvTrace *trace_v = lttv_traceset_get(tsc->ts, iter_trace);
1484
1485 lttvwindowtraces_unlock(trace_v);
1486 }
1487 }
451aaf27 1488 #endif /* BABEL_CLEANUP */
b052368a 1489 return ret_val;
8bc02ec8 1490}
e62a7964 1491
1492
1493
1494/**
1495 * Register the background computation hooks for a specific module. It adds the
313bd6fc 1496 * computation hooks to the global attrubutes, under "computation/module name".
e62a7964 1497 *
1498 * @param module_name A GQuark : the name of the module which computes the
1499 * information.
1500 */
1501void lttvwindowtraces_register_computation_hooks(LttvAttributeName module_name,
750eb11a 1502 LttvHooks *before_chunk_traceset,
1503 LttvHooks *before_chunk_trace,
1504 LttvHooks *before_chunk_tracefile,
1505 LttvHooks *after_chunk_traceset,
1506 LttvHooks *after_chunk_trace,
1507 LttvHooks *after_chunk_tracefile,
1508 LttvHooks *before_request,
1509 LttvHooks *after_request,
1510 LttvHooks *event_hook,
750eb11a 1511 LttvHooks *hook_adder,
1512 LttvHooks *hook_remover)
e62a7964 1513{
1514 LttvAttribute *g_attribute = lttv_global_attributes();
1515 LttvAttribute *attribute;
1516 LttvAttributeValue value;
96c9eb79 1517 gboolean result;
e62a7964 1518
96c9eb79 1519 attribute =
e62a7964 1520 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
96c9eb79 1521 LTTV_COMPUTATION));
1522 g_assert(attribute);
e62a7964 1523
96c9eb79 1524 attribute =
e62a7964 1525 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(attribute),
96c9eb79 1526 module_name));
1527 g_assert(attribute);
e62a7964 1528
96c9eb79 1529 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
e62a7964 1530 LTTV_BEFORE_CHUNK_TRACESET,
1531 LTTV_POINTER,
96c9eb79 1532 &value);
1533 g_assert(result);
1534
e62a7964 1535 *(value.v_pointer) = before_chunk_traceset;
1536
96c9eb79 1537 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
e62a7964 1538 LTTV_BEFORE_CHUNK_TRACE,
1539 LTTV_POINTER,
96c9eb79 1540 &value);
1541 g_assert(result);
e62a7964 1542 *(value.v_pointer) = before_chunk_trace;
1543
96c9eb79 1544 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
e62a7964 1545 LTTV_BEFORE_CHUNK_TRACEFILE,
1546 LTTV_POINTER,
96c9eb79 1547 &value);
1548 g_assert(result);
e62a7964 1549 *(value.v_pointer) = before_chunk_tracefile;
1550
96c9eb79 1551 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
e62a7964 1552 LTTV_AFTER_CHUNK_TRACESET,
1553 LTTV_POINTER,
96c9eb79 1554 &value);
1555 g_assert(result);
e62a7964 1556 *(value.v_pointer) = after_chunk_traceset;
1557
96c9eb79 1558 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
e62a7964 1559 LTTV_AFTER_CHUNK_TRACE,
1560 LTTV_POINTER,
96c9eb79 1561 &value);
1562 g_assert(result);
e62a7964 1563 *(value.v_pointer) = after_chunk_trace;
1564
96c9eb79 1565 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
e62a7964 1566 LTTV_AFTER_CHUNK_TRACEFILE,
1567 LTTV_POINTER,
96c9eb79 1568 &value);
1569 g_assert(result);
e62a7964 1570 *(value.v_pointer) = after_chunk_tracefile;
1571
96c9eb79 1572 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
e62a7964 1573 LTTV_BEFORE_REQUEST,
1574 LTTV_POINTER,
96c9eb79 1575 &value);
1576 g_assert(result);
e62a7964 1577 *(value.v_pointer) = before_request;
1578
96c9eb79 1579 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
e62a7964 1580 LTTV_AFTER_REQUEST,
1581 LTTV_POINTER,
96c9eb79 1582 &value);
1583 g_assert(result);
e62a7964 1584 *(value.v_pointer) = after_request;
1585
96c9eb79 1586 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
e62a7964 1587 LTTV_EVENT_HOOK,
1588 LTTV_POINTER,
96c9eb79 1589 &value);
1590 g_assert(result);
e62a7964 1591 *(value.v_pointer) = event_hook;
1592
96c9eb79 1593 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
313bd6fc 1594 LTTV_HOOK_ADDER,
1595 LTTV_POINTER,
96c9eb79 1596 &value);
1597 g_assert(result);
313bd6fc 1598 *(value.v_pointer) = hook_adder;
1599
96c9eb79 1600 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
313bd6fc 1601 LTTV_HOOK_REMOVER,
1602 LTTV_POINTER,
96c9eb79 1603 &value);
1604 g_assert(result);
313bd6fc 1605 *(value.v_pointer) = hook_remover;
1606
e62a7964 1607}
1608
1609
1610/**
d389bc8d 1611 * It removes all the requests that can be currently processed by the
e62a7964 1612 * background computation algorithm for all the traces (list_in and list_out).
1613 *
1614 * Leaves the flag to in_progress or none.. depending if current or queue
1615 *
1616 * @param module_name A GQuark : the name of the module which computes the
1617 * information.
1618 */
1619void lttvwindowtraces_unregister_requests(LttvAttributeName module_name)
1620{
1621 guint i;
96c9eb79 1622 gboolean result;
e62a7964 1623
1624 for(i=0;i<lttvwindowtraces_get_number();i++) {
1625 LttvTrace *trace_v = lttvwindowtraces_get_trace(i);
1626 g_assert(trace_v != NULL);
e62a7964 1627 LttvAttribute *attribute = lttv_trace_attribute(trace_v);
1628 LttvAttributeValue value;
313bd6fc 1629 GSList **queue, **current;
e62a7964 1630 GSList *iter;
1631
96c9eb79 1632 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
e62a7964 1633 LTTV_REQUESTS_QUEUE,
1634 LTTV_POINTER,
96c9eb79 1635 &value);
1636 g_assert(result);
1637
313bd6fc 1638 queue = (GSList**)(value.v_pointer);
e62a7964 1639
313bd6fc 1640 iter = *queue;
e62a7964 1641 while(iter != NULL) {
1642 gboolean remove = FALSE;
1643 gboolean free_data = FALSE;
1644
1645 BackgroundRequest *bg_req = (BackgroundRequest*)iter->data;
1646
1647 if(bg_req->module_name == module_name) {
1648 remove = TRUE;
1649 free_data = TRUE;
1650 }
1651
1652 /* Go to next */
1653 if(remove)
1654 {
1655 GSList *remove_iter = iter;
1656
1657 iter = g_slist_next(iter);
1658 if(free_data) g_free(remove_iter->data);
313bd6fc 1659 *queue = g_slist_remove_link(*queue, remove_iter);
e62a7964 1660 } else { // not remove
1661 iter = g_slist_next(iter);
1662 }
1663 }
1664
1665
96c9eb79 1666 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
e62a7964 1667 LTTV_REQUESTS_CURRENT,
1668 LTTV_POINTER,
96c9eb79 1669 &value);
1670 g_assert(result);
1671
313bd6fc 1672 current = (GSList**)(value.v_pointer);
e62a7964 1673
313bd6fc 1674 iter = *current;
e62a7964 1675 while(iter != NULL) {
1676 gboolean remove = FALSE;
1677 gboolean free_data = FALSE;
1678
1679 BackgroundRequest *bg_req = (BackgroundRequest*)iter->data;
1680
1681 if(bg_req->module_name == module_name) {
1682 remove = TRUE;
1683 free_data = TRUE;
1684 }
1685
1686 /* Go to next */
1687 if(remove)
1688 {
1689 GSList *remove_iter = iter;
1690
1691 iter = g_slist_next(iter);
1692 if(free_data) g_free(remove_iter->data);
313bd6fc 1693 *current = g_slist_remove_link(*current, remove_iter);
e62a7964 1694 } else { // not remove
1695 iter = g_slist_next(iter);
1696 }
1697 }
1698 }
1699}
1700
1701
1702/**
1703 * Unregister the background computation hooks for a specific module.
1704 *
d389bc8d 1705 * It also removes all the requests that can be currently processed by the
e62a7964 1706 * background computation algorithm for all the traces (list_in and list_out).
1707 *
1708 * @param module_name A GQuark : the name of the module which computes the
1709 * information.
1710 */
1711
1712void lttvwindowtraces_unregister_computation_hooks
1713 (LttvAttributeName module_name)
1714{
1715 LttvAttribute *g_attribute = lttv_global_attributes();
1716 LttvAttribute *attribute;
91fd6881 1717 LttvAttributeValue value;
96c9eb79 1718 gboolean result;
e62a7964 1719
96c9eb79 1720 attribute =
e62a7964 1721 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
96c9eb79 1722 LTTV_COMPUTATION));
1723 g_assert(attribute);
e62a7964 1724
96c9eb79 1725 attribute =
1726 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(attribute),
1727 module_name));
1728 g_assert(attribute);
e62a7964 1729
96c9eb79 1730 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
91fd6881 1731 LTTV_BEFORE_CHUNK_TRACESET,
1732 LTTV_POINTER,
96c9eb79 1733 &value);
1734 g_assert(result);
1735
91fd6881 1736 LttvHooks *before_chunk_traceset = (LttvHooks*)*(value.v_pointer);
1737 if(before_chunk_traceset != NULL)
1738 lttv_hooks_destroy(before_chunk_traceset);
1739
96c9eb79 1740 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
91fd6881 1741 LTTV_BEFORE_CHUNK_TRACE,
1742 LTTV_POINTER,
96c9eb79 1743 &value);
1744 g_assert(result);
1745
91fd6881 1746 LttvHooks *before_chunk_trace = (LttvHooks*)*(value.v_pointer);
1747 if(before_chunk_trace != NULL)
1748 lttv_hooks_destroy(before_chunk_trace);
1749
96c9eb79 1750 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
91fd6881 1751 LTTV_BEFORE_CHUNK_TRACEFILE,
1752 LTTV_POINTER,
96c9eb79 1753 &value);
1754 g_assert(result);
1755
91fd6881 1756 LttvHooks *before_chunk_tracefile = (LttvHooks*)*(value.v_pointer);
1757 if(before_chunk_tracefile != NULL)
1758 lttv_hooks_destroy(before_chunk_tracefile);
1759
96c9eb79 1760 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
91fd6881 1761 LTTV_AFTER_CHUNK_TRACESET,
1762 LTTV_POINTER,
96c9eb79 1763 &value);
1764 g_assert(result);
1765
91fd6881 1766 LttvHooks *after_chunk_traceset = (LttvHooks*)*(value.v_pointer);
1767 if(after_chunk_traceset != NULL)
1768 lttv_hooks_destroy(after_chunk_traceset);
1769
96c9eb79 1770 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
91fd6881 1771 LTTV_AFTER_CHUNK_TRACE,
1772 LTTV_POINTER,
96c9eb79 1773 &value);
1774 g_assert(result);
1775
91fd6881 1776 LttvHooks *after_chunk_trace = (LttvHooks*)*(value.v_pointer);
1777 if(after_chunk_trace != NULL)
1778 lttv_hooks_destroy(after_chunk_trace);
1779
96c9eb79 1780 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
91fd6881 1781 LTTV_AFTER_CHUNK_TRACEFILE,
1782 LTTV_POINTER,
96c9eb79 1783 &value);
1784 g_assert(result);
1785
91fd6881 1786 LttvHooks *after_chunk_tracefile = (LttvHooks*)*(value.v_pointer);
1787 if(after_chunk_tracefile != NULL)
1788 lttv_hooks_destroy(after_chunk_tracefile);
1789
96c9eb79 1790 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
91fd6881 1791 LTTV_BEFORE_REQUEST,
1792 LTTV_POINTER,
96c9eb79 1793 &value);
1794 g_assert(result);
1795
91fd6881 1796 LttvHooks *before_request = (LttvHooks*)*(value.v_pointer);
1797 if(before_request != NULL)
1798 lttv_hooks_destroy(before_request);
1799
96c9eb79 1800 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
91fd6881 1801 LTTV_AFTER_REQUEST,
1802 LTTV_POINTER,
96c9eb79 1803 &value);
1804 g_assert(result);
1805
91fd6881 1806 LttvHooks *after_request = (LttvHooks*)*(value.v_pointer);
1807 if(after_request != NULL)
1808 lttv_hooks_destroy(after_request);
1809
96c9eb79 1810 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
91fd6881 1811 LTTV_EVENT_HOOK,
1812 LTTV_POINTER,
96c9eb79 1813 &value);
1814 g_assert(result);
1815
91fd6881 1816 LttvHooks *event_hook = (LttvHooks*)*(value.v_pointer);
1817 if(event_hook != NULL)
1818 lttv_hooks_destroy(event_hook);
1819
96c9eb79 1820 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
750eb11a 1821 LTTV_EVENT_HOOK_BY_ID_CHANNEL,
91fd6881 1822 LTTV_POINTER,
96c9eb79 1823 &value);
1824 g_assert(result);
1825
96c9eb79 1826 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
91fd6881 1827 LTTV_HOOK_ADDER,
1828 LTTV_POINTER,
96c9eb79 1829 &value);
1830 g_assert(result);
1831
91fd6881 1832 LttvHooks *hook_adder = (LttvHooks*)*(value.v_pointer);
1833 if(hook_adder != NULL)
1834 lttv_hooks_destroy(hook_adder);
1835
96c9eb79 1836 result = lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
91fd6881 1837 LTTV_HOOK_REMOVER,
1838 LTTV_POINTER,
96c9eb79 1839 &value);
1840 g_assert(result);
1841
91fd6881 1842 LttvHooks *hook_remover = (LttvHooks*)*(value.v_pointer);
1843 if(hook_remover != NULL)
1844 lttv_hooks_destroy(hook_remover);
1845
1846
e62a7964 1847 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
750eb11a 1848 LTTV_EVENT_HOOK_BY_ID_CHANNEL);
e62a7964 1849 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
1850 LTTV_EVENT_HOOK);
1851
1852 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
1853 LTTV_AFTER_REQUEST);
1854 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
1855 LTTV_BEFORE_REQUEST);
1856
1857 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
1858 LTTV_AFTER_CHUNK_TRACEFILE);
1859 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
1860 LTTV_AFTER_CHUNK_TRACE);
1861 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
1862 LTTV_AFTER_CHUNK_TRACESET);
1863
1864 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
1865 LTTV_BEFORE_CHUNK_TRACEFILE);
1866 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
1867 LTTV_BEFORE_CHUNK_TRACE);
1868 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
1869 LTTV_BEFORE_CHUNK_TRACESET);
313bd6fc 1870 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
1871 LTTV_HOOK_ADDER);
1872 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
1873 LTTV_HOOK_REMOVER);
1874
e62a7964 1875 /* finally, remove module name */
96c9eb79 1876 attribute =
e62a7964 1877 LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
96c9eb79 1878 LTTV_COMPUTATION));
1879 g_assert(attribute);
e62a7964 1880 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
1881 module_name);
1882
1883}
1884
b052368a 1885/**
1886 * Lock a trace so no other instance can use it.
1887 *
1888 * @param trace The trace to lock.
1889 * @return 0 on success, -1 if cannot get lock.
1890 */
1891gint lttvwindowtraces_lock(LttvTrace *trace)
1892{
1893 LttvAttribute *attribute = lttv_trace_attribute(trace);
1894 LttvAttributeValue value;
1895 LttvAttributeType type;
1896
1897 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
1898 LTTV_LOCK,
1899 &value);
1900 /* Verify the absence of the lock. */
1901 if(type != LTTV_NONE) {
1902 g_critical("Cannot take trace lock");
1903 return -1;
1904 }
1905
1906 value = lttv_iattribute_add(LTTV_IATTRIBUTE(attribute),
1907 LTTV_LOCK,
1908 LTTV_INT);
1909 /* the value is left unset. The only presence of the attribute is necessary.
1910 */
1911
1912 return 0;
1913}
1914
1915/**
1916 * Unlock a trace.
1917 *
1918 * @param trace The trace to unlock.
1919 * @return 0 on success, -1 if cannot unlock (not locked ?).
1920 */
1921gint lttvwindowtraces_unlock(LttvTrace *trace)
1922{
1923 LttvAttribute *attribute = lttv_trace_attribute(trace);
1924 LttvAttributeType type;
1925 LttvAttributeValue value;
1926
1927 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
1928 LTTV_LOCK,
1929 &value);
1930 /* Verify the presence of the lock. */
1931 if(type == LTTV_NONE) {
1932 g_critical("Cannot release trace lock");
1933 return -1;
1934 }
1935
1936 lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
1937 LTTV_LOCK);
1938
1939 return 0;
1940}
1941
1942/**
1943 * Verify if a trace is locked.
1944 *
1945 * @param trace The trace to verify.
1946 * @return TRUE if locked, FALSE is unlocked.
1947 */
1948gint lttvwindowtraces_get_lock_state(LttvTrace *trace)
1949{
1950 LttvAttribute *attribute = lttv_trace_attribute(trace);
1951 LttvAttributeType type;
1952 LttvAttributeValue value;
1953
1954 type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
1955 LTTV_LOCK,
1956 &value);
1957 /* The only presence of the attribute is necessary. */
1958 if(type == LTTV_NONE)
1959 return FALSE;
1960 else
1961 return TRUE;
1962}
e62a7964 1963
This page took 0.171991 seconds and 4 git commands to generate.