+/* Prototypes */
+gboolean lttvwindowtraces_process_pending_requests(LttvTrace *trace);
+
/* Get a trace by its path name.
*
* @param path path of the trace on the virtual file system.
/* create new traceset and tracesetcontext */
LttvTraceset *ts;
- LttvTracesetContext *tsc;
+ LttvTracesetStats *tss;
attribute = lttv_trace_attribute(trace);
g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
LTTV_COMPUTATION_TRACESET_CONTEXT,
LTTV_POINTER,
&value));
- tsc = g_object_new(LTTV_TRACESET_CONTEXT_TYPE, NULL);
- *(value.v_pointer) = tsc;
+ tss = g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
+ *(value.v_pointer) = tss;
- lttv_context_init(tsc, ts);
+ lttv_context_init(LTTV_TRACESET_CONTEXT(tss), ts);
value = lttv_attribute_add(attribute,
LTTV_REQUESTS_QUEUE,
/* create new traceset and tracesetcontext */
LttvTraceset *ts;
- LttvTracesetContext *tsc;
+ LttvTracesetStats *tss;
l_attribute = lttv_trace_attribute(trace);
LTTV_COMPUTATION_TRACESET_CONTEXT,
LTTV_POINTER,
&value));
- tsc = (LttvTracesetContext*)*(value.v_pointer);
+ tss = (LttvTracesetStats*)*(value.v_pointer);
- lttv_context_fini(tsc);
- g_object_unref(tsc);
+ lttv_context_fini(LTTV_TRACESET_CONTEXT(tss));
+ g_object_unref(tss);
lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(l_attribute),
LTTV_COMPUTATION_TRACESET_CONTEXT);
lttv_traceset_destroy(ts);
bg_req->trace = trace;
*slist = g_slist_append(*slist, bg_req);
+
+ /* Priority lower than live servicing */
+ g_idle_remove_by_data(trace);
+ g_idle_add_full((G_PRIORITY_HIGH_IDLE + 23),
+ (GSourceFunc)lttvwindowtraces_process_pending_requests,
+ trace,
+ NULL);
}
/**
bg_notify->owner = owner;
bg_notify->trace = trace;
bg_notify->notify_time = notify_time;
- bg_notify->notify_position = ltt_traceset_context_position_new();
- lttv_traceset_context_position_copy(bg_notify->notify_position,
- notify_position);
+ if(notify_position != NULL) {
+ bg_notify->notify_position = ltt_traceset_context_position_new();
+ lttv_traceset_context_position_copy(bg_notify->notify_position,
+ notify_position);
+ } else {
+ bg_notify->notify_position = NULL;
+ }
+
bg_notify->notify = lttv_hooks_new();
lttv_hooks_add_list(bg_notify->notify, notify);
bg_notify->owner = owner;
bg_notify->trace = trace;
bg_notify->notify_time = notify_time;
- bg_notify->notify_position = ltt_traceset_context_position_new();
- lttv_traceset_context_position_copy(bg_notify->notify_position,
- notify_position);
+ if(notify_position!= NULL) {
+ bg_notify->notify_position = ltt_traceset_context_position_new();
+ lttv_traceset_context_position_copy(bg_notify->notify_position,
+ notify_position);
+ } else {
+ bg_notify->notify_position = NULL;
+ }
bg_notify->notify = lttv_hooks_new();
lttv_hooks_add_list(bg_notify->notify, notify);
if(bg_notify->owner == owner) {
GSList *rem_iter = iter;
iter=g_slist_next(iter);
- lttv_traceset_context_position_destroy(
- bg_notify->notify_position);
+ if(bg_notify->notify_position != NULL)
+ lttv_traceset_context_position_destroy(
+ bg_notify->notify_position);
lttv_hooks_destroy(bg_notify->notify);
g_free(bg_notify);
g_slist_remove_link(*slist, rem_iter);
if(bg_notify->owner == owner) {
GSList *rem_iter = iter;
iter=g_slist_next(iter);
- lttv_traceset_context_position_destroy(
- bg_notify->notify_position);
+ if(bg_notify->notify_position != NULL)
+ lttv_traceset_context_position_destroy(
+ bg_notify->notify_position);
lttv_hooks_destroy(bg_notify->notify);
g_free(bg_notify);
g_slist_remove_link(*slist, rem_iter);
LttvHooks *before_chunk_tracefile=NULL;
LttvHooks *event_hook=NULL;
LttvHooksById *event_hook_by_id=NULL;
+ LttvTracesetStats *tss = LTTV_TRACESET_STATS(tsc);
g_assert(module_attribute =
event_hook_by_id = (LttvHooksById*)*(value.v_pointer);
}
+ /* Call the module's hook adder */
+ type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
+ LTTV_HOOK_ADDER,
+ &value);
+ if(type == LTTV_POINTER) {
+ lttv_hooks_call((LttvHooks*)*(value.v_pointer), (gpointer)tss);
+ }
+
+
lttv_process_traceset_begin(tsc,
before_chunk_traceset,
LttvHooks *after_chunk_tracefile=NULL;
LttvHooks *event_hook=NULL;
LttvHooksById *event_hook_by_id=NULL;
-
+ LttvTracesetStats *tss = LTTV_TRACESET_STATS(tsc);
g_assert(module_attribute =
LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
if(type == LTTV_POINTER) {
event_hook_by_id = (LttvHooksById*)*(value.v_pointer);
}
-
-
+
lttv_process_traceset_end(tsc,
after_chunk_traceset,
after_chunk_trace,
after_chunk_tracefile,
event_hook,
event_hook_by_id);
+
+ /* Call the module's hook remover */
+ type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
+ LTTV_HOOK_REMOVER,
+ &value);
+ if(type == LTTV_POINTER) {
+ lttv_hooks_call((LttvHooks*)*(value.v_pointer), (gpointer)tss);
+ }
}
LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(attribute),
module_name)));
- lttv_iattribute_remove(LTTV_IATTRIBUTE(attribute),
+ lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
LTTV_IN_PROGRESS);
}
LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(attribute),
module_name)));
- lttv_iattribute_remove(LTTV_IATTRIBUTE(attribute),
+ lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
LTTV_READY);
}
gboolean lttvwindowtraces_process_pending_requests(LttvTrace *trace)
{
LttvTracesetContext *tsc;
+ LttvTracesetStats *tss;
LttvTraceset *ts;
LttvAttribute *attribute;
- GSList *list_out, *list_in, *notify_in, *notify_out;
+ GSList **list_out, **list_in, **notify_in, **notify_out;
LttvAttributeValue value;
LttvAttributeType type;
- if(trace == NULL)
+ if(trace == NULL)
return FALSE;
attribute = lttv_trace_attribute(trace);
LTTV_REQUESTS_QUEUE,
&value);
g_assert(type == LTTV_POINTER);
- list_out = (GSList*)*(value.v_pointer);
+ list_out = (GSList**)(value.v_pointer);
type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
LTTV_REQUESTS_CURRENT,
&value);
g_assert(type == LTTV_POINTER);
- list_in = (GSList*)*(value.v_pointer);
+ list_in = (GSList**)(value.v_pointer);
type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
LTTV_NOTIFY_QUEUE,
&value);
g_assert(type == LTTV_POINTER);
- notify_out = (GSList*)*(value.v_pointer);
+ notify_out = (GSList**)(value.v_pointer);
type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
LTTV_NOTIFY_CURRENT,
&value);
g_assert(type == LTTV_POINTER);
- notify_in = (GSList*)*(value.v_pointer);
+ notify_in = (GSList**)(value.v_pointer);
type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(attribute),
LTTV_COMPUTATION_TRACESET,
&value);
g_assert(type == LTTV_POINTER);
tsc = (LttvTracesetContext*)*(value.v_pointer);
+ tss = (LttvTracesetStats*)*(value.v_pointer);
g_assert(LTTV_IS_TRACESET_CONTEXT(tsc));
+ g_assert(LTTV_IS_TRACESET_STATS(tss));
/* There is no events requests pending : we should never have been called! */
- g_assert(g_slist_length(list_out) != 0 || g_slist_length(list_in) != 0);
+ g_assert(g_slist_length(*list_out) != 0 || g_slist_length(*list_in) != 0);
/* 1. Before processing */
{
/* if list_in is empty */
- if(g_slist_length(list_in) == 0) {
+ if(g_slist_length(*list_in) == 0) {
{
/* - Add all requests in list_out to list_in, empty list_out */
- GSList *iter = list_out;
+ GSList *iter = *list_out;
while(iter != NULL) {
gboolean remove = FALSE;
remove = TRUE;
free_data = FALSE;
- list_in = g_slist_append(list_in, bg_req);
+ *list_in = g_slist_append(*list_in, bg_req);
/* Go to next */
if(remove)
iter = g_slist_next(iter);
if(free_data) g_free(remove_iter->data);
- list_out = g_slist_remove_link(list_out, remove_iter);
+ *list_out = g_slist_remove_link(*list_out, remove_iter);
} else { // not remove
iter = g_slist_next(iter);
}
}
{
- GSList *iter = list_in;
+ GSList *iter = *list_in;
/* - for each request in list_in */
while(iter != NULL) {
/* - Move all notifications from notify_out to notify_in. */
{
- GSList *iter = notify_out;
- g_assert(g_slist_length(notify_in) == 0);
+ GSList *iter = *notify_out;
+ g_assert(g_slist_length(*notify_in) == 0);
while(iter != NULL) {
gboolean remove = FALSE;
remove = TRUE;
free_data = FALSE;
- notify_in = g_slist_append(notify_in, notify_req);
+ *notify_in = g_slist_append(*notify_in, notify_req);
/* Go to next */
if(remove)
iter = g_slist_next(iter);
if(free_data) g_free(remove_iter->data);
- notify_out = g_slist_remove_link(notify_out, remove_iter);
+ *notify_out = g_slist_remove_link(*notify_out, remove_iter);
} else { // not remove
iter = g_slist_next(iter);
}
}
{
- GSList *iter = list_in;
+ GSList *iter = *list_in;
/* - for each request in list_in */
while(iter != NULL) {
{
/*(assert list_in is not empty! : should not even be called in that case)*/
LttTime end = { G_MAXUINT, G_MAXUINT };
- g_assert(g_slist_length(list_in) != 0);
+ g_assert(g_slist_length(*list_in) != 0);
lttv_process_traceset_middle(tsc, end, CHUNK_NUM_EVENTS, NULL);
}
{
/* 3.1 call after_chunk hooks for list_in */
{
- GSList *iter = list_in;
+ GSList *iter = *list_in;
/* - for each request in list_in */
while(iter != NULL) {
/* 3.2 for each notify_in */
{
- GSList *iter = notify_in;
+ GSList *iter = *notify_in;
LttvTracefileContext *tfc = lttv_traceset_context_get_current_tfc(tsc);
while(iter != NULL) {
* from notify_in.
*/
if( (tfc != NULL &&
- ltt_time_compare(notify_req->notify_time, tfc->timestamp) >= 0)
+ ltt_time_compare(notify_req->notify_time, tfc->timestamp) <= 0)
||
- (lttv_traceset_context_ctx_pos_compare(tsc,
- notify_req->notify_position) >= 0)
+ (notify_req->notify_position != NULL &&
+ lttv_traceset_context_ctx_pos_compare(tsc,
+ notify_req->notify_position) >= 0)
) {
lttv_hooks_call(notify_req->notify, notify_req);
iter = g_slist_next(iter);
if(free_data) g_free(remove_iter->data);
- notify_in = g_slist_remove_link(notify_in, remove_iter);
+ *notify_in = g_slist_remove_link(*notify_in, remove_iter);
} else { // not remove
iter = g_slist_next(iter);
}
{
LttvTracefileContext *tfc = lttv_traceset_context_get_current_tfc(tsc);
/* 3.3 if end of trace reached */
+ if(tfc != NULL)
+ g_debug("Current time : %lu sec, %lu nsec",
+ tfc->timestamp.tv_sec, tfc->timestamp.tv_nsec);
if(tfc == NULL || ltt_time_compare(tfc->timestamp,
tsc->time_span.end_time) > 0) {
/* - for each request in list_in */
{
- GSList *iter = list_in;
+ GSList *iter = *list_in;
while(iter != NULL) {
gboolean remove = FALSE;
iter = g_slist_next(iter);
if(free_data) g_free(remove_iter->data);
- list_in = g_slist_remove_link(list_in, remove_iter);
+ *list_in = g_slist_remove_link(*list_in, remove_iter);
} else { // not remove
iter = g_slist_next(iter);
}
/* - for each notifications in notify_in */
{
- GSList *iter = notify_in;
+ GSList *iter = *notify_in;
while(iter != NULL) {
gboolean remove = FALSE;
iter = g_slist_next(iter);
if(free_data) g_free(remove_iter->data);
- notify_in = g_slist_remove_link(notify_in, remove_iter);
+ *notify_in = g_slist_remove_link(*notify_in, remove_iter);
} else { // not remove
iter = g_slist_next(iter);
}
}
/* - return FALSE (scheduler stopped) */
+ g_debug("Background computation scheduler stopped");
return FALSE;
} else {
/* 3.4 else, end of trace not reached */
/* - return TRUE (scheduler still registered) */
+ g_debug("Background computation left");
return TRUE;
}
}
/**
* Register the background computation hooks for a specific module. It adds the
- * computation hooks to the global attrubutes, under "computation/module name"
+ * computation hooks to the global attrubutes, under "computation/module name".
*
* @param module_name A GQuark : the name of the module which computes the
* information.
LttvHooks *before_request,
LttvHooks *after_request,
LttvHooks *event_hook,
- LttvHooksById *event_hook_by_id)
+ LttvHooksById *event_hook_by_id,
+ LttvHooks *hook_adder,
+ LttvHooks *hook_remover)
{
LttvAttribute *g_attribute = lttv_global_attributes();
LttvAttribute *attribute;
&value));
*(value.v_pointer) = event_hook_by_id;
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_HOOK_ADDER,
+ LTTV_POINTER,
+ &value));
+ *(value.v_pointer) = hook_adder;
+
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_HOOK_REMOVER,
+ LTTV_POINTER,
+ &value));
+ *(value.v_pointer) = hook_remover;
+
}
LttTrace *trace;
LttvAttribute *attribute = lttv_trace_attribute(trace_v);
LttvAttributeValue value;
- GSList *queue, *current;
+ GSList **queue, **current;
GSList *iter;
g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
LTTV_REQUESTS_QUEUE,
LTTV_POINTER,
&value));
- queue = (GSList*)*(value.v_pointer);
+ queue = (GSList**)(value.v_pointer);
- iter = queue;
+ iter = *queue;
while(iter != NULL) {
gboolean remove = FALSE;
gboolean free_data = FALSE;
iter = g_slist_next(iter);
if(free_data) g_free(remove_iter->data);
- queue = g_slist_remove_link(queue, remove_iter);
+ *queue = g_slist_remove_link(*queue, remove_iter);
} else { // not remove
iter = g_slist_next(iter);
}
LTTV_REQUESTS_CURRENT,
LTTV_POINTER,
&value));
- current = (GSList*)*(value.v_pointer);
+ current = (GSList**)(value.v_pointer);
- iter = current;
+ iter = *current;
while(iter != NULL) {
gboolean remove = FALSE;
gboolean free_data = FALSE;
iter = g_slist_next(iter);
if(free_data) g_free(remove_iter->data);
- current = g_slist_remove_link(current, remove_iter);
+ *current = g_slist_remove_link(*current, remove_iter);
} else { // not remove
iter = g_slist_next(iter);
}
LTTV_BEFORE_CHUNK_TRACE);
lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
LTTV_BEFORE_CHUNK_TRACESET);
+ lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
+ LTTV_HOOK_ADDER);
+ lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
+ LTTV_HOOK_REMOVER);
+
/* finally, remove module name */
g_assert(attribute =
LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),