From: Philippe Proulx Date: Wed, 2 Sep 2015 15:31:35 +0000 (-0400) Subject: sessiond: add loglevels_match() X-Git-Tag: v2.8.0-rc1~368 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=19a97244f801504a7985eee1b4ecca933f660b4a sessiond: add loglevels_match() UST and agent event loglevel matching algorithm is the same so factor out this code into a common utility. Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- diff --git a/src/bin/lttng-sessiond/agent.c b/src/bin/lttng-sessiond/agent.c index 0b8bc0251..33559c89a 100644 --- a/src/bin/lttng-sessiond/agent.c +++ b/src/bin/lttng-sessiond/agent.c @@ -103,6 +103,7 @@ static int ht_match_event(struct cds_lfht_node *node, { struct agent_event *event; const struct agent_ht_key *key; + int ll_match; assert(node); assert(_key); @@ -118,19 +119,11 @@ static int ht_match_event(struct cds_lfht_node *node, } /* Event loglevel value and type. */ - if (event->loglevel_type == key->loglevel_type) { - /* Same loglevel type. */ - if (key->loglevel_type != LTTNG_EVENT_LOGLEVEL_ALL) { - /* - * Loglevel value must also match since the loglevel - * type is not all. - */ - if (event->loglevel_value != key->loglevel_value) { - goto no_match; - } - } - } else { - /* Loglevel type is different: no match. */ + ll_match = loglevels_match(event->loglevel_type, + event->loglevel_value, key->loglevel_type, + key->loglevel_value, LTTNG_EVENT_LOGLEVEL_ALL); + + if (!ll_match) { goto no_match; } diff --git a/src/bin/lttng-sessiond/trace-ust.c b/src/bin/lttng-sessiond/trace-ust.c index b7ef806af..1adda7e82 100644 --- a/src/bin/lttng-sessiond/trace-ust.c +++ b/src/bin/lttng-sessiond/trace-ust.c @@ -72,6 +72,7 @@ int trace_ust_ht_match_event(struct cds_lfht_node *node, const void *_key) struct ltt_ust_event *event; const struct ltt_ust_ht_key *key; int ev_loglevel_value; + int ll_match; assert(node); assert(_key); @@ -88,19 +89,11 @@ int trace_ust_ht_match_event(struct cds_lfht_node *node, const void *_key) } /* Event loglevel value and type. */ - if (event->attr.loglevel_type == key->loglevel_type) { - /* Same loglevel type. */ - if (key->loglevel_type != LTTNG_UST_LOGLEVEL_ALL) { - /* - * Loglevel value must also match since the loglevel - * type is not all. - */ - if (ev_loglevel_value != key->loglevel_value) { - goto no_match; - } - } - } else { - /* Loglevel type is different: no match. */ + ll_match = loglevels_match(event->attr.loglevel_type, + ev_loglevel_value, key->loglevel_type, + key->loglevel_value, LTTNG_UST_LOGLEVEL_ALL); + + if (!ll_match) { goto no_match; } diff --git a/src/bin/lttng-sessiond/utils.c b/src/bin/lttng-sessiond/utils.c index fef31803f..f5f1cff63 100644 --- a/src/bin/lttng-sessiond/utils.c +++ b/src/bin/lttng-sessiond/utils.c @@ -72,3 +72,27 @@ void ht_cleanup_push(struct lttng_ht *ht) error: assert(!ret); } + +int loglevels_match(int a_loglevel_type, int a_loglevel_value, + int b_loglevel_type, int b_loglevel_value, int loglevel_all_type) +{ + int match = 1; + + if (a_loglevel_type == b_loglevel_type) { + /* Same loglevel type. */ + if (b_loglevel_type != loglevel_all_type) { + /* + * Loglevel value must also match since the loglevel + * type is not all. + */ + if (a_loglevel_value != b_loglevel_value) { + match = 0; + } + } + } else { + /* Loglevel type is different: no match. */ + match = 0; + } + + return match; +} diff --git a/src/bin/lttng-sessiond/utils.h b/src/bin/lttng-sessiond/utils.h index 7c06d5b03..2be72c20f 100644 --- a/src/bin/lttng-sessiond/utils.h +++ b/src/bin/lttng-sessiond/utils.h @@ -23,5 +23,7 @@ struct lttng_ht; const char *get_home_dir(void); int notify_thread_pipe(int wpipe); void ht_cleanup_push(struct lttng_ht *ht); +int loglevels_match(int a_loglevel_type, int a_loglevel_value, + int b_loglevel_type, int b_loglevel_value, int loglevel_all_type); #endif /* _LTT_UTILS_H */