X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=trunk%2Flttv%2Flttv%2Flttv%2Ffilter.c;h=3c53e38791c7fd081a407015fc2503d1575883ae;hb=4ad053dfb73552faef1acc273a816ecf49e25b14;hp=f62755868f27f8958e4b13989556d2ef6effd5d1;hpb=d5662043c1570c860ee97af8d6cdd95af95a8c50;p=lttv.git diff --git a/trunk/lttv/lttv/lttv/filter.c b/trunk/lttv/lttv/lttv/filter.c index f6275586..3c53e387 100644 --- a/trunk/lttv/lttv/lttv/filter.c +++ b/trunk/lttv/lttv/lttv/filter.c @@ -101,6 +101,26 @@ lttv_simple_expression_new() { return se; } +/* + * Keeps the array order. + */ +static inline gpointer ltt_g_ptr_array_remove_index_slow(GPtrArray *fp, + int index) +{ + gpointer ptr; + int i; + + if (fp->len == 0) + return NULL; + + ptr = g_ptr_array_index(fp, index); + for (i = index; i < fp->len - 1; i++) { + g_ptr_array_index(fp, i) = g_ptr_array_index(fp, i + 1); + } + g_ptr_array_remove_index(fp, fp->len - 1); + return ptr; +} + /** * @fn gboolean lttv_simple_expression_assign_field(GPtrArray*,LttvSimpleExpression*) * @@ -115,10 +135,11 @@ gboolean lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) { GString* f = NULL; - + if(fp->len < 2) return FALSE; - g_assert((f=g_ptr_array_remove_index(fp,0))); - + g_assert((f=ltt_g_ptr_array_remove_index_slow(fp,0))); + + /* * Parse through the specified * hardcoded fields. @@ -132,13 +153,14 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) { * subfields, it will be considered * as a dynamic field */ + if(!g_strcasecmp(f->str,"trace") ) { /* * Possible values: * trace.name */ g_string_free(f,TRUE); - f=g_ptr_array_remove_index(fp,0); + f=ltt_g_ptr_array_remove_index_slow(fp,0); if(!g_strcasecmp(f->str,"name")) { se->field = LTTV_FILTER_TRACE_NAME; } @@ -152,7 +174,7 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) { * tracefile.name */ g_string_free(f,TRUE); - f=g_ptr_array_remove_index(fp,0); + f=ltt_g_ptr_array_remove_index_slow(fp,0); if(!g_strcasecmp(f->str,"name")) { se->field = LTTV_FILTER_TRACEFILE_NAME; } @@ -171,7 +193,7 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) { * state.cpu */ g_string_free(f,TRUE); - f=g_ptr_array_remove_index(fp,0); + f=ltt_g_ptr_array_remove_index_slow(fp,0); if(!g_strcasecmp(f->str,"pid") ) { se->field = LTTV_FILTER_STATE_PID; } @@ -213,7 +235,8 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) { * event.field */ g_string_free(f,TRUE); - f=g_ptr_array_remove_index(fp,0); + f=ltt_g_ptr_array_remove_index_slow(fp,0); + if(!g_strcasecmp(f->str,"name") ) { se->field = LTTV_FILTER_EVENT_NAME; } @@ -235,16 +258,16 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) { else if(!g_strcasecmp(f->str,"field") ) { se->field = LTTV_FILTER_EVENT_FIELD; g_string_free(f,TRUE); - f=g_ptr_array_remove_index(fp,0); + f=ltt_g_ptr_array_remove_index_slow(fp,0); } else { - g_string_free(f,TRUE); - f=g_ptr_array_remove_index(fp,0); + //g_string_free(f,TRUE); + //f=ltt_g_ptr_array_remove_index_slow(fp,0); g_warning("Unknown event filter subtype %s", f->str); } } else { g_string_free(f,TRUE); - f=g_ptr_array_remove_index(fp,0); + f=ltt_g_ptr_array_remove_index_slow(fp,0); g_warning("Unrecognized field in filter string"); } @@ -1666,7 +1689,7 @@ lttv_filter_update(LttvFilter* filter) { g_ptr_array_free(a_field_path,TRUE); /* free the tree stack -- but keep the root tree */ - filter->head = g_ptr_array_remove_index(tree_stack,0); + filter->head = ltt_g_ptr_array_remove_index_slow(tree_stack,0); g_ptr_array_free(tree_stack,TRUE); /* free the field buffer if allocated */ @@ -2024,7 +2047,8 @@ lttv_filter_tree_parse_branch( if(event == NULL) return TRUE; else { struct marker_info *info; - info = marker_get_info_from_id((LttTrace *)trace, event->event_id); + LttTracefile *tf = context->tf; + info = marker_get_info_from_id(tf->mdata, event->event_id); g_assert(info != NULL); GQuark quark = info->name; return se->op((gpointer)&quark,v);