X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;ds=sidebyside;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Ffilter.c;h=4158cc54fcd3521aca4e8fbdc612180e41ae93d9;hb=da2e1bfb1ac32abd5ec8495afd40236bb681ebdd;hp=b68d84e44bc611fa4a105fc4d5c1cce67803cc52;hpb=c6832b57f110e6e79501847998821d684ac3ea8b;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/filter.c b/ltt/branches/poly/lttv/lttv/filter.c index b68d84e4..4158cc54 100644 --- a/ltt/branches/poly/lttv/lttv/filter.c +++ b/ltt/branches/poly/lttv/lttv/filter.c @@ -1,5 +1,5 @@ /* This file is part of the Linux Trace Toolkit viewer - * Copyright (C) 2003-2005 Michel Dagenais + * Copyright (C) 2003-2005 Michel Dagenais and Simon Bouvier-Zappa * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License Version 2 as @@ -16,72 +16,54 @@ * MA 02111-1307, USA. */ -/* - read_token - - read_expression - ( read expr ) - simple expr [ op expr ] - - read_simple_expression - read_field_path [ rel value ] - - read_field_path - read_field_component [. field path] - - read_field_component - name [ \[ value \] ] - - data struct: - and/or(left/right) - not(child) - op(left/right) - path(component...) -> field - - consist in AND, OR and NOT nested expressions, forming a tree with - simple relations as leaves. The simple relations test is a field - in an event is equal, not equal, smaller, smaller or equal, larger, or - larger or equal to a specified value. -*/ - -/* - * YET TO BE ANSWERED - * - none yet +/*! \file lttv/lttv/filter.c + * \brief Defines the core filter of application + * + * consist in AND, OR and NOT nested expressions, forming a tree with + * simple relations as leaves. The simple relations test if a field + * in an event is equal, not equal, smaller, smaller or equal, larger, or + * larger or equal to a specified value. + * + * Fields specified in a simple expression can take following + * values + * + * \verbatim + * LttvTracefileContext{} + * |->event\ + * | |->name (String, converted to GQuark) + * | |->category (String, not yet implemented) + * | |->time (LttTime) + * | |->tsc (LttCycleCount) + * | |->fields + * | |->"event name" + * | |->"field name" + * | |->"sub-field name" + * | |->... + * | |->"leaf-field name" (field type) + * |->tracefile + * | |->name (String, converted to GQuark) + * |->trace + * | |->name (String, converted to GQuark) + * |->state + * |->pid (uint64) + * |->ppid (uint64) + * |->creation_time (LttTime) + * |->insertion_time (LttTime) + * |->process_name (String, converted to GQuark) + * |->execution_mode (LttvExecutionMode) + * |->execution_submode (LttvExecutionSubmode) + * |->process_status (LttvProcessStatus) + * |->cpu (GQuark) + * \endverbatim */ /* * TODO * - refine switch of expression in multiple uses functions * - remove the idle expressions in the tree **** - * - add the current simple expression to the tree - * * clear the field_path array after use */ #include -#include - -/* -GQuark - LTTV_FILTER_TRACE, - LTTV_FILTER_TRACESET, - LTTV_FILTER_TRACEFILE, - LTTV_FILTER_STATE, - LTTV_FILTER_EVENT, - LTTV_FILTER_NAME, - LTTV_FILTER_CATEGORY, - LTTV_FILTER_TIME, - LTTV_FILTER_TSC, - LTTV_FILTER_PID, - LTTV_FILTER_PPID, - LTTV_FILTER_C_TIME, - LTTV_FILTER_I_TIME, - LTTV_FILTER_P_NAME, - LTTV_FILTER_EX_MODE, - LTTV_FILTER_EX_SUBMODE, - LTTV_FILTER_P_STATUS, - LTTV_FILTER_CPU; -*/ - /** * @fn LttvSimpleExpression* lttv_simple_expression_new() @@ -102,7 +84,7 @@ lttv_simple_expression_new() { } /** - * @fn gboolean lttv_simple_expression_add_field(GPtrArray*,LttvSimpleExpression*) + * @fn gboolean lttv_simple_expression_assign_field(GPtrArray*,LttvSimpleExpression*) * * Parse through filtering field hierarchy as specified * by user. This function compares each value to @@ -249,6 +231,7 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) { * Sets the function pointer for the current * Simple Expression * @param se current simple expression + * @param op current operator * @return success/failure of operation */ gboolean lttv_simple_expression_assign_operator(LttvSimpleExpression* se, LttvExpressionOp op) { @@ -346,7 +329,7 @@ gboolean lttv_simple_expression_assign_operator(LttvSimpleExpression* se, LttvEx } /** - * @fn void lttv_simple_expression_assign_value(LttvSimpleExpression*,char*) + * @fn gboolean lttv_simple_expression_assign_value(LttvSimpleExpression*,char*) * * Assign the value field to the current LttvSimpleExpression * @param se pointer to the current LttvSimpleExpression @@ -354,7 +337,6 @@ gboolean lttv_simple_expression_assign_operator(LttvSimpleExpression* se, LttvEx */ gboolean lttv_simple_expression_assign_value(LttvSimpleExpression* se, char* value) { -// g_print("se->value:%s\n",value); unsigned i; gboolean is_double = FALSE; LttTime t = ltt_time_zero; @@ -370,7 +352,7 @@ gboolean lttv_simple_expression_assign_value(LttvSimpleExpression* se, char* val case LTTV_FILTER_STATE_P_NAME: case LTTV_FILTER_EVENT_NAME: // se->value.v_string = value; - se->value.v_uint32 = g_quark_try_string(value); + se->value.v_uint32 = g_quark_to_string(value); g_free(value); break; /* @@ -491,7 +473,7 @@ lttv_struct_type(gint ft) { } /** - * @fn gboolean lttv_apply_op_eq_uint64(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_eq_uint64(gpointer,LttvFieldValue) * * Applies the 'equal' operator to the * specified structure and value @@ -507,7 +489,7 @@ gboolean lttv_apply_op_eq_uint64(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_eq_uint32(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_eq_uint32(gpointer,LttvFieldValue) * * Applies the 'equal' operator to the * specified structure and value @@ -521,7 +503,7 @@ gboolean lttv_apply_op_eq_uint32(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_eq_uint16(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_eq_uint16(gpointer,LttvFieldValue) * * Applies the 'equal' operator to the * specified structure and value @@ -535,7 +517,7 @@ gboolean lttv_apply_op_eq_uint16(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_eq_double(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_eq_double(gpointer,LttvFieldValue) * * Applies the 'equal' operator to the * specified structure and value @@ -549,7 +531,7 @@ gboolean lttv_apply_op_eq_double(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_eq_string(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_eq_string(gpointer,LttvFieldValue) * * Applies the 'equal' operator to the * specified structure and value @@ -563,7 +545,7 @@ gboolean lttv_apply_op_eq_string(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_eq_quark(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_eq_quark(gpointer,LttvFieldValue) * * Applies the 'equal' operator to the * specified structure and value @@ -578,7 +560,7 @@ gboolean lttv_apply_op_eq_quark(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_eq_ltttime(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_eq_ltttime(gpointer,LttvFieldValue) * * Applies the 'equal' operator to the * specified structure and value @@ -594,7 +576,7 @@ gboolean lttv_apply_op_eq_ltttime(const gpointer v1, LttvFieldValue v2) { /** - * @fn gboolean lttv_apply_op_ne_uint64(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_ne_uint64(gpointer,LttvFieldValue) * * Applies the 'not equal' operator to the * specified structure and value @@ -608,7 +590,7 @@ gboolean lttv_apply_op_ne_uint64(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_ne_uint32(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_ne_uint32(gpointer,LttvFieldValue) * * Applies the 'not equal' operator to the * specified structure and value @@ -622,7 +604,7 @@ gboolean lttv_apply_op_ne_uint32(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_ne_uint16(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_ne_uint16(gpointer,LttvFieldValue) * * Applies the 'not equal' operator to the * specified structure and value @@ -636,7 +618,7 @@ gboolean lttv_apply_op_ne_uint16(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_ne_double(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_ne_double(gpointer,LttvFieldValue) * * Applies the 'not equal' operator to the * specified structure and value @@ -650,7 +632,7 @@ gboolean lttv_apply_op_ne_double(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_ne_string(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_ne_string(gpointer,LttvFieldValue) * * Applies the 'not equal' operator to the * specified structure and value @@ -664,7 +646,7 @@ gboolean lttv_apply_op_ne_string(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_ne_quark(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_ne_quark(gpointer,LttvFieldValue) * * Applies the 'not equal' operator to the * specified structure and value @@ -679,7 +661,7 @@ gboolean lttv_apply_op_ne_quark(const gpointer v1, LttvFieldValue v2) { /** - * @fn gboolean lttv_apply_op_ne_ltttime(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_ne_ltttime(gpointer,LttvFieldValue) * * Applies the 'not equal' operator to the * specified structure and value @@ -694,7 +676,7 @@ gboolean lttv_apply_op_ne_ltttime(const gpointer v1, LttvFieldValue v2) { /** - * @fn gboolean lttv_apply_op_lt_uint64(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_lt_uint64(gpointer,LttvFieldValue) * * Applies the 'lower than' operator to the * specified structure and value @@ -708,7 +690,7 @@ gboolean lttv_apply_op_lt_uint64(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_lt_uint32(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_lt_uint32(gpointer,LttvFieldValue) * * Applies the 'lower than' operator to the * specified structure and value @@ -722,7 +704,7 @@ gboolean lttv_apply_op_lt_uint32(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_lt_uint16(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_lt_uint16(gpointer,LttvFieldValue) * * Applies the 'lower than' operator to the * specified structure and value @@ -736,7 +718,7 @@ gboolean lttv_apply_op_lt_uint16(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_lt_double(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_lt_double(gpointer,LttvFieldValue) * * Applies the 'lower than' operator to the * specified structure and value @@ -750,7 +732,7 @@ gboolean lttv_apply_op_lt_double(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_lt_ltttime(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_lt_ltttime(gpointer,LttvFieldValue) * * Applies the 'lower than' operator to the * specified structure and value @@ -766,7 +748,7 @@ gboolean lttv_apply_op_lt_ltttime(const gpointer v1, LttvFieldValue v2) { /** - * @fn gboolean lttv_apply_op_le_uint64(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_le_uint64(gpointer,LttvFieldValue) * * Applies the 'lower or equal' operator to the * specified structure and value @@ -780,7 +762,7 @@ gboolean lttv_apply_op_le_uint64(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_le_uint32(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_le_uint32(gpointer,LttvFieldValue) * * Applies the 'lower or equal' operator to the * specified structure and value @@ -794,7 +776,7 @@ gboolean lttv_apply_op_le_uint32(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_le_uint16(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_le_uint16(gpointer,LttvFieldValue) * * Applies the 'lower or equal' operator to the * specified structure and value @@ -808,7 +790,7 @@ gboolean lttv_apply_op_le_uint16(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_le_double(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_le_double(gpointer,LttvFieldValue) * * Applies the 'lower or equal' operator to the * specified structure and value @@ -822,7 +804,7 @@ gboolean lttv_apply_op_le_double(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_le_ltttime(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_le_ltttime(gpointer,LttvFieldValue) * * Applies the 'lower or equal' operator to the * specified structure and value @@ -838,7 +820,7 @@ gboolean lttv_apply_op_le_ltttime(const gpointer v1, LttvFieldValue v2) { /** - * @fn gboolean lttv_apply_op_gt_uint64(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_gt_uint64(gpointer,LttvFieldValue) * * Applies the 'greater than' operator to the * specified structure and value @@ -852,7 +834,7 @@ gboolean lttv_apply_op_gt_uint64(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_gt_uint32(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_gt_uint32(gpointer,LttvFieldValue) * * Applies the 'greater than' operator to the * specified structure and value @@ -866,7 +848,7 @@ gboolean lttv_apply_op_gt_uint32(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_gt_uint16(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_gt_uint16(gpointer,LttvFieldValue) * * Applies the 'greater than' operator to the * specified structure and value @@ -880,7 +862,7 @@ gboolean lttv_apply_op_gt_uint16(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_gt_double(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_gt_double(gpointer,LttvFieldValue) * * Applies the 'greater than' operator to the * specified structure and value @@ -894,7 +876,7 @@ gboolean lttv_apply_op_gt_double(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_gt_ltttime(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_gt_ltttime(gpointer,LttvFieldValue) * * Applies the 'greater than' operator to the * specified structure and value @@ -910,7 +892,7 @@ gboolean lttv_apply_op_gt_ltttime(const gpointer v1, LttvFieldValue v2) { /** - * @fn gboolean lttv_apply_op_ge_uint64(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_ge_uint64(gpointer,LttvFieldValue) * * Applies the 'greater or equal' operator to the * specified structure and value @@ -924,7 +906,7 @@ gboolean lttv_apply_op_ge_uint64(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_ge_uint32(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_ge_uint32(gpointer,LttvFieldValue) * * Applies the 'greater or equal' operator to the * specified structure and value @@ -938,7 +920,7 @@ gboolean lttv_apply_op_ge_uint32(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_ge_uint16(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_ge_uint16(gpointer,LttvFieldValue) * * Applies the 'greater or equal' operator to the * specified structure and value @@ -952,7 +934,7 @@ gboolean lttv_apply_op_ge_uint16(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_ge_double(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_ge_double(gpointer,LttvFieldValue) * * Applies the 'greater or equal' operator to the * specified structure and value @@ -966,7 +948,7 @@ gboolean lttv_apply_op_ge_double(const gpointer v1, LttvFieldValue v2) { } /** - * @fn gboolean lttv_apply_op_ge_ltttime(const gpointer,LttvFieldValue) + * @fn gboolean lttv_apply_op_ge_ltttime(gpointer,LttvFieldValue) * * Applies the 'greater or equal' operator to the * specified structure and value @@ -983,8 +965,6 @@ gboolean lttv_apply_op_ge_ltttime(const gpointer v1, LttvFieldValue v2) { /** - * @fn LttvFilterTree* lttv_filter_tree_clone(LttvFilterTree*) - * * Makes a copy of the current filter tree * @param tree pointer to the current tree * @return new copy of the filter tree @@ -1024,8 +1004,6 @@ lttv_filter_tree_clone(const LttvFilterTree* tree) { } /** - * @fn LttvFilter* lttv_filter_clone(LttvFilter*) - * * Makes a copy of the current filter * @param filter pointer to the current filter * @return new copy of the filter @@ -1035,7 +1013,6 @@ lttv_filter_clone(const LttvFilter* filter) { LttvFilter* newfilter = g_new(LttvFilter,1); - // newfilter->expression = g_new(char,1) strcpy(newfilter->expression,filter->expression); newfilter->head = lttv_filter_tree_clone(filter->head); @@ -1048,10 +1025,8 @@ lttv_filter_clone(const LttvFilter* filter) { /** * @fn LttvFilter* lttv_filter_new() * - * Creates a new lttv_filter - * @param expression filtering options string - * @param t pointer to the current LttvTrace - * @return the current lttv_filter or NULL if error + * Creates a new LttvFilter + * @return the current LttvFilter or NULL if error */ LttvFilter* lttv_filter_new() { @@ -1059,6 +1034,8 @@ lttv_filter_new() { LttvFilter* filter = g_new(LttvFilter,1); filter->expression = NULL; filter->head = NULL; + + return filter; } @@ -1463,21 +1440,21 @@ lttv_filter_tree_new() { * @param expression string that must be appended * @return Success/Failure of operation */ -gboolean lttv_filter_append_expression(LttvFilter* filter, char *expression) { +gboolean lttv_filter_append_expression(LttvFilter* filter, const char *expression) { if(expression == NULL) return FALSE; - if(filter == NULL) { - filter = lttv_filter_new(); - filter->expression = expression; - } else if(filter->expression == NULL) { - filter->expression = expression; - } else { - filter->expression = g_strconcat(filter->expression,"&",expression); - - /* clear expression */ - g_free(expression); - } + if(filter == NULL) return FALSE; + GString* s = g_string_new(""); + if(filter->expression != NULL) { + g_string_append(s,filter->expression); + g_string_append_c(s,'&'); + } + g_string_append(s,expression); + + filter->expression = g_string_free(s,FALSE); + + /* TRUE if construction of tree proceeded without errors */ return lttv_filter_update(filter); } @@ -1520,11 +1497,9 @@ lttv_filter_tree_destroy(LttvFilterTree* tree) { } /** - * @fn gboolean lttv_filter_tree_parse(LttvFilterTree*,LttEvent,LttTracefile,LttTrace,LttvProcessState) - * * Global parsing function for the current * LttvFilterTree - * @param tree pointer to the current LttvFilterTree + * @param t pointer to the current LttvFilterTree * @param event current LttEvent, NULL if not used * @param tracefile current LttTracefile, NULL if not used * @param trace current LttTrace, NULL if not used @@ -1630,10 +1605,8 @@ lttv_filter_tree_parse( } /** - * @fn gboolean lttv_filter_tree_parse_branch(LttvFilterTree*,LttEvent*,LttTracefile*,LttTrace*,LttvProcessState*,LttvTracefileContext*) - * * This function parses a particular branch of the tree - * @param tree pointer to the current LttvFilterTree + * @param se pointer to the current LttvSimpleExpression * @param event current LttEvent, NULL if not used * @param tracefile current LttTracefile, NULL if not used * @param trace current LttTrace, NULL if not used @@ -1655,14 +1628,14 @@ gboolean lttv_filter_tree_parse_branch( case LTTV_FILTER_TRACE_NAME: if(trace == NULL) return TRUE; else { - GQuark quark = g_quark_try_string(ltt_trace_name(trace)); + GQuark quark = g_quark_to_string(ltt_trace_name(trace)); return se->op((gpointer)&quark,v); } break; case LTTV_FILTER_TRACEFILE_NAME: if(tracefile == NULL) return TRUE; else { - GQuark quark = g_quark_try_string(ltt_tracefile_name(tracefile)); + GQuark quark = g_quark_to_string(ltt_tracefile_name(tracefile)); return se->op((gpointer)&quark,v); } break; @@ -1692,7 +1665,7 @@ gboolean lttv_filter_tree_parse_branch( */ if(state == NULL) return TRUE; else { - GQuark quark = g_quark_try_string(state->name); + GQuark quark = g_quark_to_string(state->name); return se->op((gpointer)&quark,v); } break; @@ -1712,7 +1685,7 @@ gboolean lttv_filter_tree_parse_branch( if(context == NULL) return TRUE; else { /* FIXME: not sure of that one */ - return se->op((gpointer)g_quark_try_string(((LttvTracefileState*)context)->cpu_name),v); + return se->op((gpointer)g_quark_to_string(((LttvTracefileState*)context)->cpu_name),v); } break; case LTTV_FILTER_EVENT_NAME: @@ -1721,7 +1694,7 @@ gboolean lttv_filter_tree_parse_branch( LttEventType* et; et = ltt_event_eventtype(event); g_print("v:%s\n",ltt_eventtype_name(et)); - GQuark quark = g_quark_try_string(ltt_eventtype_name(et)); + GQuark quark = g_quark_to_string(ltt_eventtype_name(et)); return se->op((gpointer)&quark,v); } break; @@ -1775,9 +1748,7 @@ gboolean lttv_filter_tree_parse_branch( /** - * @fn void lttv_print_tree(LttvFilterTree*) - * - * Debug + * Debug function. Prints tree memory allocation. * @param t the pointer to the current LttvFilterTree */ void @@ -1809,7 +1780,7 @@ static void module_init() } /** - * @fn Destroys the filter module and specific values + * Destroys the filter module and specific values */ static void module_destroy() {