* |->creation_time (LttTime)
* |->insertion_time (LttTime)
* |->process_name (String, converted to GQuark)
+ * |->thread_brand (String, converted to GQuark)
* |->execution_mode (LttvExecutionMode)
* |->execution_submode (LttvExecutionSubmode)
* |->process_status (LttvProcessStatus)
* state.creation_time
* state.insertion_time
* state.process_name
+ * state.thread_brand
* state.execution_mode
* state.execution_submode
* state.process_status
else if(!g_strcasecmp(f->str,"process_name") ) {
se->field = LTTV_FILTER_STATE_P_NAME;
}
+ else if(!g_strcasecmp(f->str,"thread_brand") ) {
+ se->field = LTTV_FILTER_STATE_T_BRAND;
+ }
else if(!g_strcasecmp(f->str,"execution_mode") ) {
se->field = LTTV_FILTER_STATE_EX_MODE;
}
case LTTV_FILTER_TRACE_NAME:
case LTTV_FILTER_TRACEFILE_NAME:
case LTTV_FILTER_STATE_P_NAME:
+ case LTTV_FILTER_STATE_T_BRAND:
case LTTV_FILTER_EVENT_NAME:
case LTTV_FILTER_EVENT_FACILITY:
case LTTV_FILTER_STATE_EX_MODE:
case LTTV_FILTER_TRACE_NAME:
case LTTV_FILTER_TRACEFILE_NAME:
case LTTV_FILTER_STATE_P_NAME:
+ case LTTV_FILTER_STATE_T_BRAND:
case LTTV_FILTER_EVENT_NAME:
case LTTV_FILTER_EVENT_FACILITY:
case LTTV_FILTER_STATE_EX_MODE:
case LTTV_FILTER_STATE_CT:
case LTTV_FILTER_STATE_IT:
case LTTV_FILTER_STATE_P_NAME:
+ case LTTV_FILTER_STATE_T_BRAND:
case LTTV_FILTER_STATE_EX_MODE:
case LTTV_FILTER_STATE_EX_SUBMODE:
case LTTV_FILTER_STATE_P_STATUS:
}
break;
case LTTV_FILTER_STATE_P_NAME:
- /*
- * All 'unnamed' for the moment
- */
if(state == NULL) return TRUE;
else {
GQuark quark = state->name;
return se->op((gpointer)&quark,v);
}
break;
+ case LTTV_FILTER_STATE_T_BRAND:
+ if(state == NULL) return TRUE;
+ else {
+ GQuark quark = state->brand;
+ return se->op((gpointer)&quark,v);
+ }
+ break;
case LTTV_FILTER_STATE_EX_MODE:
if(state == NULL) return TRUE;
else return se->op((gpointer)&state->state->t,v);
LTTV_FILTER_STATE_CT, /**< state.creation_time (double) */
LTTV_FILTER_STATE_IT, /**< state.insertion_time (double) */
LTTV_FILTER_STATE_P_NAME, /**< state.process_name (char*) */
+ LTTV_FILTER_STATE_T_BRAND, /**< state.thread_brand (char*) */
LTTV_FILTER_STATE_EX_MODE, /**< state.execution_mode (LttvExecutionMode) */
LTTV_FILTER_STATE_EX_SUBMODE, /**< state.execution_submode (LttvExecutionSubmode) */
LTTV_FILTER_STATE_P_STATUS, /**< state.process_status (LttvProcessStatus) */
g_quark_to_string(ltt_tracefile_name(tfs->parent.tf)),
cpu);
/* Print the process id and the state/interrupt type of the process */
- g_string_append_printf(s,", %u, %s, %u, 0x%llX, %s", process->pid,
+ g_string_append_printf(s,", %u, %s, %s, %u, 0x%llX, %s", process->pid,
g_quark_to_string(process->name),
+ g_quark_to_string(process->brand),
process->ppid, process->current_function,
g_quark_to_string(process->state->t));
}
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;
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;
}
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");
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 */
extern LttvProcessStatus
LTTV_STATE_UNNAMED,
+ LTTV_STATE_UNBRANDED,
LTTV_STATE_WAIT_FORK,
LTTV_STATE_WAIT_CPU,
LTTV_STATE_EXIT,
LttTime creation_time;
LttTime insertion_time;
GQuark name;
+ GQuark brand;
GQuark pid_time;
GArray *execution_stack; /* Array of LttvExecutionState */
LttvExecutionState *state; /* Top of interrupt stack */
associated by id hooks. */
hooks = g_array_new(FALSE, FALSE, sizeof(LttvTraceHook));
- hooks = g_array_set_size(hooks, 16);
+ hooks = g_array_set_size(hooks, 17);
before_hn = after_hn = 0;
/* before hooks */
&g_array_index(hooks, LttvTraceHook, after_hn++));
if(ret) after_hn--;
+ ret = lttv_trace_find_hook(ts->parent.t,
+ LTT_FACILITY_USER_GENERIC, LTT_EVENT_THREAD_BRAND,
+ LTT_FIELD_NAME, 0, 0,
+ after_user_generic_thread_brand_hook,
+ events_request,
+ &g_array_index(hooks, LttvTraceHook, after_hn++));
+ if(ret) after_hn--;
+
ret = lttv_trace_find_hook(ts->parent.t,
LTT_FACILITY_STATEDUMP, LTT_EVENT_ENUM_PROCESS_STATE,
LTT_FIELD_PID, LTT_FIELD_PARENT_PID, LTT_FIELD_NAME,
&birth,
tfc->t_context->index,
process->name,
+ process->brand,
&pl_height,
&process_info,
&hashed_process_data);
&birth,
tfc->t_context->index,
process->name,
+ process->brand,
&pl_height,
&process_info,
&hashed_process_data);
&birth,
tfc->t_context->index,
process_in->name,
+ process_in->brand,
&pl_height,
&process_info,
&hashed_process_data_in);
&birth,
tfc->t_context->index,
process->name,
+ process->brand,
&pl_height,
&process_info,
&hashed_process_data);
&birth,
tfc->t_context->index,
process->name,
+ process->brand,
&pl_height,
&process_info,
&hashed_process_data);
&birth,
tfc->t_context->index,
process->name,
+ process->brand,
&pl_height,
&process_info,
&hashed_process_data);
&birth,
tfc->t_context->index,
process_child->name,
+ process_child->brand,
&pl_height,
&process_info,
&hashed_process_data_child);
&birth,
tfc->t_context->index,
process->name,
+ process->brand,
&pl_height,
&process_info,
&hashed_process_data);
&birth,
tfc->t_context->index,
process->name,
+ process->brand,
&pl_height,
&process_info,
&hashed_process_data);
}
+/* Get the filename of the process to print */
+int after_user_generic_thread_brand_hook(void *hook_data, void *call_data)
+{
+ LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data;
+ EventsRequest *events_request = (EventsRequest*)thf->hook_data;
+ ControlFlowData *control_flow_data = events_request->viewer_data;
+
+ LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
+
+ LttvTracefileState *tfs = (LttvTracefileState *)call_data;
+
+ LttvTraceState *ts = (LttvTraceState *)tfc->t_context;
+
+ guint cpu = tfs->cpu;
+ LttvProcessState *process = ts->running_process[cpu];
+ g_assert(process != NULL);
+
+ guint pid = process->pid;
+
+ /* Well, the process_out existed : we must get it in the process hash
+ * or add it, and draw its items.
+ */
+ /* Add process to process list (if not present) */
+ guint pl_height = 0;
+ HashedProcessData *hashed_process_data = NULL;
+ ProcessList *process_list = control_flow_data->process_list;
+ LttTime birth = process->creation_time;
+
+ if(likely(process_list->current_hash_data[cpu] != NULL)) {
+ hashed_process_data = process_list->current_hash_data[cpu];
+ } else {
+ hashed_process_data = processlist_get_process_data(process_list,
+ pid,
+ process->cpu,
+ &birth,
+ tfc->t_context->index);
+ if(unlikely(hashed_process_data == NULL))
+ {
+ g_assert(pid == 0 || pid != process->ppid);
+ ProcessInfo *process_info;
+ /* Process not present */
+ Drawing_t *drawing = control_flow_data->drawing;
+ processlist_add(process_list,
+ drawing,
+ pid,
+ process->cpu,
+ process->ppid,
+ &birth,
+ tfc->t_context->index,
+ process->name,
+ process->brand,
+ &pl_height,
+ &process_info,
+ &hashed_process_data);
+ gtk_widget_set_size_request(drawing->drawing_area,
+ -1,
+ pl_height);
+ gtk_widget_queue_draw(drawing->drawing_area);
+ }
+ /* Set the current process */
+ process_list->current_hash_data[process->cpu] =
+ hashed_process_data;
+ }
+
+ processlist_set_brand(process_list, process->brand, hashed_process_data);
+
+ return 0;
+
+}
+
+
/* after_event_enum_process_hook
*
* Create the processlist entry for the child process. Put the last
&birth,
tfc->t_context->index,
process_in->name,
+ process_in->brand,
&pl_height,
&process_info,
&hashed_process_data_in);
int after_process_exit_hook(void *hook_data, void *call_data);
int after_process_fork_hook(void *hook_data, void *call_data);
int after_fs_exec_hook(void *hook_data, void *call_data);
+int after_user_generic_thread_brand_hook(void *hook_data, void *call_data);
int after_event_enum_process_hook(void *hook_data, void *call_data);
#if 0
/* Create the Process list */
process_list->list_store = gtk_list_store_new ( N_COLUMNS,
+ G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_UINT,
G_TYPE_UINT,
GTK_TREE_VIEW (process_list->process_list_widget), column);
process_list->button = column->button;
-
+
+ column = gtk_tree_view_column_new_with_attributes ( "Brand",
+ renderer,
+ "text",
+ BRAND_COLUMN,
+ NULL);
+ gtk_tree_view_column_set_alignment (column, 0.0);
+ gtk_tree_view_column_set_fixed_width (column, 45);
+ gtk_tree_view_append_column (
+ GTK_TREE_VIEW (process_list->process_list_widget), column);
+
column = gtk_tree_view_column_new_with_attributes ( "PID",
renderer,
"text",
-1);
}
+void processlist_set_brand(ProcessList *process_list,
+ GQuark brand,
+ HashedProcessData *hashed_process_data)
+{
+ gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter,
+ BRAND_COLUMN, g_quark_to_string(brand),
+ -1);
+}
void processlist_set_ppid(ProcessList *process_list,
guint ppid,
HashedProcessData *hashed_process_data)
LttTime *birth,
guint trace_num,
GQuark name,
+ GQuark brand,
guint *height,
ProcessInfo **pm_process_info,
HashedProcessData **pm_hashed_process_data)
gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter,
PROCESS_COLUMN, g_quark_to_string(name),
+ BRAND_COLUMN, g_quark_to_string(brand),
PID_COLUMN, pid,
PPID_COLUMN, ppid,
CPU_COLUMN, cpu,
enum
{
PROCESS_COLUMN,
+ BRAND_COLUMN,
PID_COLUMN,
PPID_COLUMN,
CPU_COLUMN,
/* CPU num is only used for PID 0 */
int processlist_add(ProcessList *process_list, Drawing_t * drawing,
guint pid, guint cpu, guint ppid,
- LttTime *birth, guint trace_num, GQuark name, guint *height,
+ LttTime *birth, guint trace_num, GQuark name, GQuark brand, guint *height,
ProcessInfo **process_info,
HashedProcessData **hashed_process_data);
// out : success (0) and height
GQuark name,
HashedProcessData *hashed_process_data);
+void processlist_set_brand(ProcessList *process_list,
+ GQuark brand,
+ HashedProcessData *hashed_process_data);
+
/* Set the ppid of a process */
void processlist_set_ppid(ProcessList *process_list,
guint ppid,
g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("tracefile.name"));
g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("trace.name"));
g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.process_name"));
+ g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.thread_brand"));
g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.pid"));
g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.ppid"));
g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.creation_time"));
g_print("state.pid (integer)\n");
g_print("state.ppid (integer)\n");
g_print("state.creation_time (double)\n");
- g_print("trace.insertion_time (double)\n");
- g_print("trace.process_name (string)\n");
- g_print("trace.execution_mode (string)\n");
- g_print("trace.execution_submode (string)\n");
- g_print("trace.process_status (string)\n");
- g_print("trace.cpu (string)\n\n");
+ g_print("state.insertion_time (double)\n");
+ g_print("state.process_name (string)\n");
+ g_print("state.thread_brand (string)\n");
+ g_print("state.execution_mode (string)\n");
+ g_print("state.execution_submode (string)\n");
+ g_print("state.process_status (string)\n");
+ g_print("state.cpu (string)\n\n");
g_print("*** Possible operators ***\n");
g_print("equal '='\n");