/* Here is the implementation of the API */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <string.h>
#include <ltt/time.h>
#include <ltt/trace.h>
LttvTrace *lttvwindowtraces_get_trace_by_name(gchar *path)
{
- LttvAttribute *attribute = lttv_global_attributes();
guint i;
for(i=0;i<lttvwindowtraces_get_number();i++) {
trace = lttv_trace(trace_v);
g_assert(trace != NULL);
- name = ltt_trace_name(trace);
+ name = g_quark_to_string(ltt_trace_name(trace));
if(strcmp(name, path) == 0) {
/* Found */
struct stat buf;
gchar attribute_path[PATH_MAX];
- if(stat(ltt_trace_name(lttv_trace(trace)), &buf)) {
+ if(stat(g_quark_to_string(ltt_trace_name(lttv_trace(trace))), &buf)) {
g_warning("lttvwindowtraces_add_trace: Trace %s not found",
- ltt_trace_name(lttv_trace(trace)));
+ g_quark_to_string(ltt_trace_name(lttv_trace(trace))));
return;
}
g_assert(
- snprintf(attribute_path, PATH_MAX, "%lu:%lu", buf.st_dev, buf.st_ino) >= 0);
+ snprintf(attribute_path, PATH_MAX, "%llu:%llu", buf.st_dev, buf.st_ino) >= 0);
g_assert(attribute =
LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
/* Found */
LttvAttribute *l_attribute;
- /* create new traceset and tracesetcontext */
+ /* destroy traceset and tracesetcontext */
LttvTraceset *ts;
LttvTracesetStats *tss;
g_object_unref(tss);
lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(l_attribute),
LTTV_COMPUTATION_TRACESET_CONTEXT);
- lttv_traceset_destroy(ts);
lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(l_attribute),
LTTV_COMPUTATION_TRACESET);
+ /* Destroy the traceset and the trace also */
+ lttv_traceset_destroy(ts);
/* finally, remove the global attribute */
lttv_attribute_remove(attribute, i);
{
BackgroundRequest *bg_req;
LttvAttribute *attribute = lttv_trace_attribute(trace);
+ LttvAttribute *g_attribute = lttv_global_attributes();
+ LttvAttribute *module_attribute;
LttvAttributeValue value;
+ LttvAttributeType type;
GSList **slist;
guint num;
LTTV_POINTER,
&value));
slist = (GSList**)(value.v_pointer);
-
+
+ /* Verify that the calculator is loaded */
+ g_assert(module_attribute =
+ LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
+ LTTV_COMPUTATION)));
+
+
+ type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
+ g_quark_from_string(module_name),
+ &value);
+ if(type == LTTV_NONE) {
+ g_critical("Missing background calculator %s", module_name);
+ return;
+ }
+
bg_req = g_new(BackgroundRequest,1);
bg_req->module_name = g_quark_from_string(module_name);
bg_req->trace = trace;
/* Background processing helper functions */
void lttvwindowtraces_add_computation_hooks(LttvAttributeName module_name,
- LttvTracesetContext *tsc)
+ LttvTracesetContext *tsc,
+ LttvHooks *hook_adder)
{
LttvAttribute *g_attribute = lttv_global_attributes();
LttvAttribute *module_attribute;
LTTV_HOOK_ADDER,
&value);
if(type == LTTV_POINTER) {
- lttv_hooks_call((LttvHooks*)*(value.v_pointer), (gpointer)tss);
+ //lttv_hooks_call((LttvHooks*)*(value.v_pointer), (gpointer)tss);
+ if(hook_adder != NULL)
+ lttv_hooks_add_list(hook_adder, (LttvHooks*)*(value.v_pointer));
}
}
void lttvwindowtraces_remove_computation_hooks(LttvAttributeName module_name,
- LttvTracesetContext *tsc)
+ LttvTracesetContext *tsc,
+ LttvHooks *hook_remover)
{
LttvAttribute *g_attribute = lttv_global_attributes();
LttvAttribute *module_attribute;
LTTV_HOOK_REMOVER,
&value);
if(type == LTTV_POINTER) {
- lttv_hooks_call((LttvHooks*)*(value.v_pointer), (gpointer)tss);
+ //lttv_hooks_call((LttvHooks*)*(value.v_pointer), (gpointer)tss);
+ if(hook_remover != NULL)
+ lttv_hooks_add_list(hook_remover, (LttvHooks*)*(value.v_pointer));
}
}
LttvTracesetStats *tss;
LttvTraceset *ts;
LttvAttribute *attribute;
+ LttvAttribute *g_attribute = lttv_global_attributes();
GSList **list_out, **list_in, **notify_in, **notify_out;
LttvAttributeValue value;
LttvAttributeType type;
/* 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);
-
/* 0.1 Lock traces */
{
guint iter_trace=0;
}
/* 0.2 Sync tracefiles */
lttv_process_traceset_synchronize_tracefiles(tsc);
-
/* 1. Before processing */
{
/* if list_in is empty */
while(iter != NULL) {
BackgroundRequest *bg_req = (BackgroundRequest*)iter->data;
- /*- add hooks to context*/
+ /* - set hooks'in_progress flag to TRUE */
lttvwindowtraces_set_in_progress(bg_req->module_name,
bg_req->trace);
+
+ /* - call before request hook */
+ /* Get before request hook */
+ LttvAttribute *module_attribute;
+
+ g_assert(module_attribute =
+ LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
+ LTTV_IATTRIBUTE(g_attribute),
+ LTTV_COMPUTATION)));
+
+ g_assert(module_attribute =
+ LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
+ LTTV_IATTRIBUTE(module_attribute),
+ bg_req->module_name)));
+
+ type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
+ LTTV_BEFORE_REQUEST,
+ &value);
+ g_assert(type == LTTV_POINTER);
+ LttvHooks *before_request = (LttvHooks*)*(value.v_pointer);
+
+ if(before_request != NULL) lttv_hooks_call(before_request, tsc);
iter = g_slist_next(iter);
}
{
GSList *iter = *list_in;
+ LttvHooks *hook_adder = lttv_hooks_new();
/* - for each request in list_in */
while(iter != NULL) {
/*- Call before chunk hooks for list_in*/
/*- add hooks to context*/
lttvwindowtraces_add_computation_hooks(bg_req->module_name,
- tsc);
+ tsc,
+ hook_adder);
iter = g_slist_next(iter);
}
+ lttv_hooks_call(hook_adder,tsc);
+ lttv_hooks_destroy(hook_adder);
}
}
/* 2. call process traceset middle for a chunk */
{
/*(assert list_in is not empty! : should not even be called in that case)*/
- LttTime end = { G_MAXUINT, G_MAXUINT };
+ LttTime end = ltt_time_infinite;
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;
+ LttvHooks *hook_remover = lttv_hooks_new();
/* - for each request in list_in */
while(iter != NULL) {
/* - Call after chunk hooks for list_in */
/* - remove hooks from context */
lttvwindowtraces_remove_computation_hooks(bg_req->module_name,
- tsc);
+ tsc,
+ hook_remover);
iter = g_slist_next(iter);
}
+ lttv_hooks_call(hook_remover,tsc);
+ lttv_hooks_destroy(hook_remover);
}
/* 3.2 for each notify_in */
/* - set hooks'ready flag to TRUE */
lttvwindowtraces_set_ready(bg_req->module_name,
bg_req->trace);
+ /* - call after request hook */
+ /* Get after request hook */
+ LttvAttribute *module_attribute;
+
+ g_assert(module_attribute =
+ LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
+ LTTV_IATTRIBUTE(g_attribute),
+ LTTV_COMPUTATION)));
+
+ g_assert(module_attribute =
+ LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(
+ LTTV_IATTRIBUTE(module_attribute),
+ bg_req->module_name)));
+
+ type = lttv_iattribute_get_by_name(LTTV_IATTRIBUTE(module_attribute),
+ LTTV_AFTER_REQUEST,
+ &value);
+ g_assert(type == LTTV_POINTER);
+ LttvHooks *after_request = (LttvHooks*)*(value.v_pointer);
+
+ if(after_request != NULL) lttv_hooks_call(after_request, tsc);
/* - remove request */
remove = TRUE;
free_data = TRUE;
}
}
}
-
- /* - return FALSE (scheduler stopped) */
- g_debug("Background computation scheduler stopped");
- g_info("Background computation finished for trace %p", trace);
- /* FIXME : remove status bar info, need context id and message id */
- ret_val = FALSE;
+ {
+ /* - reset the context */
+ LTTV_TRACESET_CONTEXT_GET_CLASS(tsc)->fini(tsc);
+ LTTV_TRACESET_CONTEXT_GET_CLASS(tsc)->init(tsc,ts);
+ }
+ /* - if list_out is empty */
+ if(g_slist_length(*list_out) == 0) {
+ /* - return FALSE (scheduler stopped) */
+ g_debug("Background computation scheduler stopped");
+ g_info("Background computation finished for trace %p", trace);
+ /* FIXME : remove status bar info, need context id and message id */
+ ret_val = FALSE;
+ } else {
+ ret_val = TRUE;
+ }
} else {
/* 3.4 else, end of trace not reached */
/* - return TRUE (scheduler still registered) */
}
/* 4. Unlock traces */
{
- //lttv_process_traceset_get_sync_data(tsc);
+ lttv_process_traceset_get_sync_data(tsc);
guint iter_trace;
for(iter_trace=0;
{
LttvAttribute *g_attribute = lttv_global_attributes();
LttvAttribute *attribute;
+ LttvAttributeValue value;
g_assert(attribute =
LTTV_ATTRIBUTE(lttv_iattribute_find_subdir(LTTV_IATTRIBUTE(g_attribute),
module_name)));
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_BEFORE_CHUNK_TRACESET,
+ LTTV_POINTER,
+ &value));
+ LttvHooks *before_chunk_traceset = (LttvHooks*)*(value.v_pointer);
+ if(before_chunk_traceset != NULL)
+ lttv_hooks_destroy(before_chunk_traceset);
+
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_BEFORE_CHUNK_TRACE,
+ LTTV_POINTER,
+ &value));
+ LttvHooks *before_chunk_trace = (LttvHooks*)*(value.v_pointer);
+ if(before_chunk_trace != NULL)
+ lttv_hooks_destroy(before_chunk_trace);
+
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_BEFORE_CHUNK_TRACEFILE,
+ LTTV_POINTER,
+ &value));
+ LttvHooks *before_chunk_tracefile = (LttvHooks*)*(value.v_pointer);
+ if(before_chunk_tracefile != NULL)
+ lttv_hooks_destroy(before_chunk_tracefile);
+
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_AFTER_CHUNK_TRACESET,
+ LTTV_POINTER,
+ &value));
+ LttvHooks *after_chunk_traceset = (LttvHooks*)*(value.v_pointer);
+ if(after_chunk_traceset != NULL)
+ lttv_hooks_destroy(after_chunk_traceset);
+
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_AFTER_CHUNK_TRACE,
+ LTTV_POINTER,
+ &value));
+ LttvHooks *after_chunk_trace = (LttvHooks*)*(value.v_pointer);
+ if(after_chunk_trace != NULL)
+ lttv_hooks_destroy(after_chunk_trace);
+
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_AFTER_CHUNK_TRACEFILE,
+ LTTV_POINTER,
+ &value));
+ LttvHooks *after_chunk_tracefile = (LttvHooks*)*(value.v_pointer);
+ if(after_chunk_tracefile != NULL)
+ lttv_hooks_destroy(after_chunk_tracefile);
+
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_BEFORE_REQUEST,
+ LTTV_POINTER,
+ &value));
+ LttvHooks *before_request = (LttvHooks*)*(value.v_pointer);
+ if(before_request != NULL)
+ lttv_hooks_destroy(before_request);
+
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_AFTER_REQUEST,
+ LTTV_POINTER,
+ &value));
+ LttvHooks *after_request = (LttvHooks*)*(value.v_pointer);
+ if(after_request != NULL)
+ lttv_hooks_destroy(after_request);
+
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_EVENT_HOOK,
+ LTTV_POINTER,
+ &value));
+ LttvHooks *event_hook = (LttvHooks*)*(value.v_pointer);
+ if(event_hook != NULL)
+ lttv_hooks_destroy(event_hook);
+
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_EVENT_HOOK_BY_ID,
+ LTTV_POINTER,
+ &value));
+ LttvHooksById *event_hook_by_id = (LttvHooksById*)*(value.v_pointer);
+ if(event_hook_by_id != NULL)
+ lttv_hooks_by_id_destroy(event_hook_by_id);
+
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_HOOK_ADDER,
+ LTTV_POINTER,
+ &value));
+ LttvHooks *hook_adder = (LttvHooks*)*(value.v_pointer);
+ if(hook_adder != NULL)
+ lttv_hooks_destroy(hook_adder);
+
+ g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute),
+ LTTV_HOOK_REMOVER,
+ LTTV_POINTER,
+ &value));
+ LttvHooks *hook_remover = (LttvHooks*)*(value.v_pointer);
+ if(hook_remover != NULL)
+ lttv_hooks_destroy(hook_remover);
+
+
lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),
LTTV_EVENT_HOOK_BY_ID);
lttv_iattribute_remove_by_name(LTTV_IATTRIBUTE(attribute),