X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Ffilter.h;h=1345574d595494771a59219af37dd2435640f796;hb=f4e9dd16df04f26cdbe885ea7c9744d423fe6869;hp=9224a9a51e6cbef7898387af740d297b231d9c2c;hpb=a4c292d42202029a5153c487fd01263a183a0af2;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/filter.h b/ltt/branches/poly/lttv/lttv/filter.h index 9224a9a5..1345574d 100644 --- a/ltt/branches/poly/lttv/lttv/filter.h +++ b/ltt/branches/poly/lttv/lttv/filter.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -52,6 +53,26 @@ */ +extern 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; + /** * @enum lttv_expression_op */ @@ -68,65 +89,96 @@ typedef enum _lttv_expression_op typedef enum _lttv_expression_type { LTTV_EXPRESSION, - LTTV_SIMPLE_EXPRESSION + LTTV_SIMPLE_EXPRESSION, + LTTV_EXPRESSION_OP, + LTTV_UNDEFINED_EXPRESSION } lttv_expression_type; +typedef enum _lttv_tree_element { + LTTV_TREE_UNDEFINED, + LTTV_TREE_NODE, + LTTV_TREE_LEAF +} lttv_tree_element; + typedef struct _lttv_simple_expression { - lttv_expression_op op; char *field_name; + lttv_expression_op op; char *value; } lttv_simple_expression; - -//typedef union _tmp { -// struct lttv_expression *e; -// lttv_field_relation *se; -//} tmp; +typedef enum _lttv_logical_op { + LTTV_LOGICAL_OR = 1, /* 1 */ + LTTV_LOGICAL_AND = 1<<1, /* 2 */ + LTTV_LOGICAL_NOT = 1<<2, /* 4 */ + LTTV_LOGICAL_XOR = 1<<3 /* 8 */ +} lttv_logical_op; + /* -typedef struct _lttv_expression -{ - gboolean or; - gboolean not; - gboolean and; - gboolean xor; - gboolean simple_expression; -// tmp e; -} lttv_expression; -*/ - -typedef union _lttv_expression { - lttv_simple_expression se; - + * Ah .. that's my tree + */ +//typedef struct _lttv_expression +//{ +// gboolean simple_expression; +// int op; +// lttv_expression_type type; +// union { +// struct lttv_expression *e; + // lttv_field_relation *se; /* --> simple expression */ +// } e; +//} lttv_expression; + +typedef struct _lttv_expression { + lttv_expression_type type; + union { + lttv_simple_expression *se; + int op; + } e; } lttv_expression; typedef struct _lttv_filter_tree { lttv_expression* node; - struct lttv_filter_tree* r_child; - struct lttv_filter_tree* l_child; + lttv_tree_element left; + lttv_tree_element right; + union { + struct lttv_filter_tree* t; + lttv_expression* leaf; + } l_child; + union { + struct lttv_filter_tree* t; + lttv_expression* leaf; + } r_child; } lttv_filter_tree; /** * @struct lttv_filter * ( will later contain a binary tree of filtering options ) */ -typedef struct _lttv_filter { +typedef struct _lttv_filter_t { lttv_filter_tree* tree; -} lttv_filter; +} lttv_filter_t; -gboolean parse_simple_expression(GString* expression); -/* Compile the filter expression into an efficient data structure */ +lttv_filter_tree* lttv_filter_tree_new(); -lttv_filter *lttv_filter_new(char *expression, LttvTraceState *tfs); +void lttv_filter_tree_destroy(lttv_filter_tree* tree); +/* Parse field path contained in list */ +gboolean parse_field_path(GPtrArray* fp); + +gboolean parse_simple_expression(GString* expression); + +/* Compile the filter expression into an efficient data structure */ +lttv_filter_tree *lttv_filter_new(char *expression, LttvTraceState *tfs); /* Check if the tracefile or event satisfies the filter. The arguments are declared as void * to allow these functions to be used as hooks. */ -gboolean lttv_filter_tracefile(lttv_filter *filter, LttvTrace *tracefile); +gboolean lttv_filter_tracefile(lttv_filter_t *filter, LttTracefile *tracefile); + +gboolean lttv_filter_tracestate(lttv_filter_t *filter, LttvTraceState *tracestate); -gboolean lttv_filter_event(lttv_filter *filter, LttEvent *event); +gboolean lttv_filter_event(lttv_filter_t *filter, LttEvent *event); #endif // FILTER_H