From mboxrd@z Thu Jan 1 00:00:00 1970 From: compudj@krystal.dyndns.org (Mathieu Desnoyers) Date: Thu, 25 Nov 2010 20:08:49 -0500 Subject: [ltt-dev] [PATCH] Fix match between state dump and quark In-Reply-To: <1290716404-7219-1-git-send-email-francis.giraldeau@usherbrooke.ca> References: <1290716404-7219-1-git-send-email-francis.giraldeau@usherbrooke.ca> Message-ID: <20101126010849.GC21131@Krystal> * francis.giraldeau at usherbrooke.ca (francis.giraldeau at usherbrooke.ca) wrote: > From: Francis Giraldeau > > This patch fixes the association between lttng state dump enum values and the > right lttv state quark. > > The patch adds string tables that matches the enums sequence in lttng-modules, > to convert enum value in the state dump to quark. > > Update : > * static inline replaces macro > * more specific function name ltt_enum_quark > * move static string tables to state.c > * copy corresponding state dump enum from lttng-modules > * remove strings duplication in module_init > * revert double state change > --- > lttv/lttv/state.c | 83 +++++++++++++++++++++++++++++++++++++--------------- > lttv/lttv/state.h | 31 ++++++++++++++++++++ > 2 files changed, 90 insertions(+), 24 deletions(-) > > diff --git a/lttv/lttv/state.c b/lttv/lttv/state.c > index bd3f64d..720a34c 100644 > --- a/lttv/lttv/state.c > +++ b/lttv/lttv/state.c > @@ -46,6 +46,43 @@ > > #define PREALLOCATED_EXECUTION_STACK 10 > > +/* get a given quark from lttng module enum value */ > +#define ltt_enum_quark(e, f, names) (g_quark_from_string(names[ltt_event_get_unsigned(e, f)])) Almost there! Please change this #define for a static inline function. Thanks, Mathieu > + > +/* > + * Quark strings that matches lttng module enums found in statedump > + * Matching enums are from lttng-modules/ltt-statedump.c > + */ > +static const char *const lttng_thread_type_names[] = { > + "USER_THREAD", // LTTNG_USER_THREAD > + "KERNEL_THREAD" // LTTNG_KERNEL_THREAD > +}; > + > +static const char *const lttng_execution_mode_names[] = { > + "USER_MODE", // LTTNG_USER_MODE > + "SYSCALL", // LTTNG_SYSCALL > + "TRAP", // LTTNG_TRAP > + "IRQ", // LTTNG_IRQ > + "SOFTIRQ", // LTTNG_SOFTIRQ > + "UNKNOWN" // LTTNG_MODE_UNKNOWN > +}; > + > +static const char *const lttng_execution_submode_names[] = { > + "UNKNOWN", // LTTNG_NONE > + "NONE" // LTTNG_UNKNOWN > +}; > + > +static const char *const lttng_process_status_names[] = { > + "", // LTTNG_UNNAMED > + "WAIT_FORK", // LTTNG_WAIT_FORK > + "WAIT_CPU", // LTTNG_WAIT_CPU > + "EXIT", // LTTNG_EXIT > + "ZOMBIE", // LTTNG_ZOMBIE > + "WAIT", // LTTNG_WAIT > + "RUN", // LTTNG_RUN > + "DEAD" // LTTNG_DEAD > +}; > + > /* Channel Quarks */ > > GQuark > @@ -3440,21 +3477,19 @@ static gboolean enum_process_state(void *hook_data, void *call_data) > > /* type */ > f = lttv_trace_get_hook_field(th, 3); > - type = ltt_enum_string_get(f, ltt_event_get_unsigned(e, f)); > - > - //FIXME: type is rarely used, enum must match possible types. > + type = ltt_enum_quark(e, f, lttng_thread_type_names); > > /* mode */ > f = lttv_trace_get_hook_field(th, 4); > - mode = ltt_enum_string_get(f,ltt_event_get_unsigned(e, f)); > + mode = ltt_enum_quark(e, f, lttng_execution_mode_names); > > /* submode */ > f = lttv_trace_get_hook_field(th, 5); > - submode = ltt_enum_string_get(f, ltt_event_get_unsigned(e, f)); > + submode = ltt_enum_quark(e, f, lttng_execution_submode_names); > > /* status */ > f = lttv_trace_get_hook_field(th, 6); > - status = ltt_enum_string_get(f, ltt_event_get_unsigned(e, f)); > + status = ltt_enum_quark(e, f, lttng_process_status_names); > > /* TGID */ > f = lttv_trace_get_hook_field(th, 7); > @@ -4412,25 +4447,25 @@ GType lttv_tracefile_state_get_type(void) > > static void module_init() > { > - LTTV_STATE_UNNAMED = g_quark_from_string(""); > LTTV_STATE_UNBRANDED = g_quark_from_string(""); > - 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"); > - LTTV_STATE_TRAP = g_quark_from_string("TRAP"); > - LTTV_STATE_IRQ = g_quark_from_string("IRQ"); > - LTTV_STATE_SOFT_IRQ = g_quark_from_string("SOFTIRQ"); > - LTTV_STATE_SUBMODE_UNKNOWN = g_quark_from_string("UNKNOWN"); > - LTTV_STATE_SUBMODE_NONE = g_quark_from_string("NONE"); > - LTTV_STATE_WAIT_FORK = g_quark_from_string("WAIT_FORK"); > - LTTV_STATE_WAIT_CPU = g_quark_from_string("WAIT_CPU"); > - LTTV_STATE_EXIT = g_quark_from_string("EXIT"); > - LTTV_STATE_ZOMBIE = g_quark_from_string("ZOMBIE"); > - LTTV_STATE_WAIT = g_quark_from_string("WAIT"); > - LTTV_STATE_RUN = g_quark_from_string("RUN"); > - LTTV_STATE_DEAD = g_quark_from_string("DEAD"); > - LTTV_STATE_USER_THREAD = g_quark_from_string("USER_THREAD"); > - LTTV_STATE_KERNEL_THREAD = g_quark_from_string("KERNEL_THREAD"); > + LTTV_STATE_MODE_UNKNOWN = g_quark_from_string(lttng_execution_mode_names[LTTNG_MODE_UNKNOWN]); > + LTTV_STATE_USER_MODE = g_quark_from_string(lttng_execution_mode_names[LTTNG_USER_MODE]); > + LTTV_STATE_SYSCALL = g_quark_from_string(lttng_execution_mode_names[LTTNG_SYSCALL]); > + LTTV_STATE_TRAP = g_quark_from_string(lttng_execution_mode_names[LTTNG_TRAP]); > + LTTV_STATE_IRQ = g_quark_from_string(lttng_execution_mode_names[LTTNG_IRQ]); > + LTTV_STATE_SOFT_IRQ = g_quark_from_string(lttng_execution_mode_names[LTTNG_SOFTIRQ]); > + LTTV_STATE_SUBMODE_UNKNOWN = g_quark_from_string(lttng_execution_submode_names[LTTNG_NONE]); > + LTTV_STATE_SUBMODE_NONE = g_quark_from_string(lttng_execution_submode_names[LTTNG_NONE]); > + LTTV_STATE_UNNAMED = g_quark_from_string(lttng_process_status_names[LTTNG_UNNAMED]); > + LTTV_STATE_WAIT_FORK = g_quark_from_string(lttng_process_status_names[LTTNG_WAIT_FORK]); > + LTTV_STATE_WAIT_CPU = g_quark_from_string(lttng_process_status_names[LTTNG_WAIT_CPU]); > + LTTV_STATE_EXIT = g_quark_from_string(lttng_process_status_names[LTTNG_EXIT]); > + LTTV_STATE_ZOMBIE = g_quark_from_string(lttng_process_status_names[LTTNG_ZOMBIE]); > + LTTV_STATE_WAIT = g_quark_from_string(lttng_process_status_names[LTTNG_WAIT]); > + LTTV_STATE_RUN = g_quark_from_string(lttng_process_status_names[LTTNG_RUN]); > + LTTV_STATE_DEAD = g_quark_from_string(lttng_process_status_names[LTTNG_DEAD]); > + LTTV_STATE_USER_THREAD = g_quark_from_string(lttng_thread_type_names[LTTNG_USER_THREAD]); > + LTTV_STATE_KERNEL_THREAD = g_quark_from_string(lttng_thread_type_names[LTTNG_KERNEL_THREAD]); > LTTV_STATE_TRACEFILES = g_quark_from_string("tracefiles"); > LTTV_STATE_PROCESSES = g_quark_from_string("processes"); > LTTV_STATE_PROCESS = g_quark_from_string("process"); > diff --git a/lttv/lttv/state.h b/lttv/lttv/state.h > index 0ae7e5c..9450c7c 100644 > --- a/lttv/lttv/state.h > +++ b/lttv/lttv/state.h > @@ -53,6 +53,37 @@ > > #define LTTV_STATE_SAVE_INTERVAL 50000 > > +/* lttng module enums from ltt-statedump.c */ > +enum lttng_thread_type { > + LTTNG_USER_THREAD = 0, > + LTTNG_KERNEL_THREAD = 1, > +}; > + > +enum lttng_execution_mode { > + LTTNG_USER_MODE = 0, > + LTTNG_SYSCALL = 1, > + LTTNG_TRAP = 2, > + LTTNG_IRQ = 3, > + LTTNG_SOFTIRQ = 4, > + LTTNG_MODE_UNKNOWN = 5, > +}; > + > +enum lttng_execution_submode { > + LTTNG_NONE = 0, > + LTTNG_UNKNOWN = 1, > +}; > + > +enum lttng_process_status { > + LTTNG_UNNAMED = 0, > + LTTNG_WAIT_FORK = 1, > + LTTNG_WAIT_CPU = 2, > + LTTNG_EXIT = 3, > + LTTNG_ZOMBIE = 4, > + LTTNG_WAIT = 5, > + LTTNG_RUN = 6, > + LTTNG_DEAD = 7, > +}; > + > /* Channel Quarks */ > > extern GQuark > -- > 1.7.1 > > > _______________________________________________ > ltt-dev mailing list > ltt-dev at lists.casi.polymtl.ca > http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev > -- Mathieu Desnoyers Operating System Efficiency R&D Consultant EfficiOS Inc. http://www.efficios.com