LTT_EVENT_EXEC,
LTT_EVENT_ENUM_PROCESS_STATE,
LTT_EVENT_FUNCTION_ENTRY,
- LTT_EVENT_FUNCTION_EXIT;
+ LTT_EVENT_FUNCTION_EXIT,
+ LTT_EVENT_THREAD_BRAND;
/* Fields Quarks */
LttvProcessStatus
LTTV_STATE_UNNAMED,
+ LTTV_STATE_UNBRANDED,
LTTV_STATE_WAIT_FORK,
LTTV_STATE_WAIT_CPU,
LTTV_STATE_EXIT,
process = (LttvProcessState *)value;
fprintf(fp,
-" <PROCESS CORE=%p PID=%u PPID=%u TYPE=\"%s\"CTIME_S=%lu CTIME_NS=%lu NAME=\"%s\" CPU=\"%u\">\n",
+" <PROCESS CORE=%p PID=%u PPID=%u TYPE=\"%s\"CTIME_S=%lu CTIME_NS=%lu NAME=\"%s\" BRAND=\"%s\" CPU=\"%u\">\n",
process, process->pid, process->ppid, g_quark_to_string(process->type),
process->creation_time.tv_sec,
process->creation_time.tv_nsec, g_quark_to_string(process->name),
+ g_quark_to_string(process->brand),
process->cpu);
for(i = 0 ; i < process->execution_stack->len; i++) {
g_info("process state has %s when pop_int is %s\n",
g_quark_to_string(process->state->t),
g_quark_to_string(t));
- g_info("{ %u, %u, %s, %s }\n",
+ g_info("{ %u, %u, %s, %s, %s }\n",
process->pid,
process->ppid,
g_quark_to_string(process->name),
+ g_quark_to_string(process->brand),
g_quark_to_string(process->state->s));
return;
}
process->pid = pid;
process->cpu = cpu;
process->name = name;
+ process->brand = LTTV_STATE_UNBRANDED;
//process->last_cpu = tfs->cpu_name;
//process->last_cpu_index = ltt_tracefile_num(((LttvTracefileContext*)tfs)->tf);
process->type = LTTV_STATE_USER_THREAD;
LttvExecutionSubmode submode;
- guint nb_traps = ((LttvTraceState *)(s->parent.t_context))->nb_traps;
- guint trap = ltt_event_get_unsigned(e, f);
+ guint64 nb_traps = ((LttvTraceState *)(s->parent.t_context))->nb_traps;
+ guint64 trap = ltt_event_get_long_unsigned(e, f);
if(trap < nb_traps) {
submode = ((LttvTraceState *)(s->parent.t_context))->trap_names[trap];
LttvExecutionSubmode submode;
submode = ((LttvTraceState *)(s->parent.t_context))->soft_irq_names[
- ltt_event_get_unsigned(e, f)];
+ ltt_event_get_long_unsigned(e, f)];
/* Do something with the info about being in user or system mode when int? */
push_state(s, LTTV_STATE_SOFT_IRQ, submode);
tfs->parent.timestamp.tv_sec, tfs->parent.timestamp.tv_nsec);
g_info("process state has %llu when pop_function is %llu\n",
process->current_function, funcptr);
- g_info("{ %u, %u, %s, %s }\n",
+ g_info("{ %u, %u, %s, %s, %s }\n",
process->pid,
process->ppid,
g_quark_to_string(process->name),
+ g_quark_to_string(process->brand),
g_quark_to_string(process->state->s));
return;
}
guint pid;
guint cpu = s->cpu;
LttvTraceState *ts = (LttvTraceState*)s->parent.t_context;
- LttvProcessState *process = ts->running_process[cpu];
+ LttvProcessState *process; // = ts->running_process[cpu];
pid = ltt_event_get_unsigned(e, thf->f1);
// FIXME : Add this test in the "known state" section
// g_assert(process->pid == pid);
+ process = lttv_state_find_process(ts, ANY_CPU, pid);
if(likely(process != NULL)) {
process->state->s = LTTV_STATE_EXIT;
}
break;
}
}
- //if(i == num_cpus) /* process is not scheduled */
- //exit_process(s, process); // do nothing : wait for the schedchange to
- //delete the process.
+ if(i == num_cpus) /* process is not scheduled */
+ exit_process(s, process);
}
return FALSE;
return FALSE;
}
+static gboolean thread_brand(void *hook_data, void *call_data)
+{
+ LttvTracefileState *s = (LttvTracefileState *)call_data;
+ LttvTraceState *ts = (LttvTraceState*)s->parent.t_context;
+ LttEvent *e = ltt_tracefile_get_event(s->parent.tf);
+ LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data;
+ gchar *name;
+ guint cpu = s->cpu;
+ LttvProcessState *process = ts->running_process[cpu];
+
+ name = ltt_event_get_string(e, thf->f1);
+ process->brand = g_quark_from_string(name);
+
+ return FALSE;
+}
+
static gboolean enum_process_state(void *hook_data, void *call_data)
{
LttvTracefileState *s = (LttvTracefileState *)call_data;
/* Find the eventtype id for the following events and register the
associated by id hooks. */
- hooks = g_array_sized_new(FALSE, FALSE, sizeof(LttvTraceHook), 17);
- hooks = g_array_set_size(hooks, 17); // Max possible number of hooks.
+ hooks = g_array_sized_new(FALSE, FALSE, sizeof(LttvTraceHook), 18);
+ hooks = g_array_set_size(hooks, 18); // Max possible number of hooks.
hn = 0;
ret = lttv_trace_find_hook(ts->parent.t,
process_exec, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
+ ret = lttv_trace_find_hook(ts->parent.t,
+ LTT_FACILITY_USER_GENERIC, LTT_EVENT_THREAD_BRAND,
+ LTT_FIELD_NAME, 0, 0,
+ thread_brand, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
+ if(ret) hn--;
+
/* statedump-related hooks */
ret = lttv_trace_find_hook(ts->parent.t,
LTT_FACILITY_STATEDUMP, LTT_EVENT_ENUM_PROCESS_STATE,
static void module_init()
{
LTTV_STATE_UNNAMED = g_quark_from_string("UNNAMED");
+ LTTV_STATE_UNBRANDED = g_quark_from_string("UNBRANDED");
LTTV_STATE_MODE_UNKNOWN = g_quark_from_string("MODE_UNKNOWN");
LTTV_STATE_USER_MODE = g_quark_from_string("USER_MODE");
LTTV_STATE_SYSCALL = g_quark_from_string("SYSCALL");
LTT_EVENT_ENUM_PROCESS_STATE = g_quark_from_string("enumerate_process_state");
LTT_EVENT_FUNCTION_ENTRY = g_quark_from_string("function_entry");
LTT_EVENT_FUNCTION_EXIT = g_quark_from_string("function_exit");
+ LTT_EVENT_THREAD_BRAND = g_quark_from_string("thread_brand");
LTT_FIELD_SYSCALL_ID = g_quark_from_string("syscall_id");