From 417610268a16cb4b84d79bf449b1f70142791676 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Wed, 23 Jun 2010 09:31:04 +0200 Subject: [PATCH] src/graph.c: graph_inst_search_field: Only call "inst_matches_field" if really necessary. --- src/graph.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/graph.c b/src/graph.c index 02b3ebf..fc6a636 100644 --- a/src/graph.c +++ b/src/graph.c @@ -388,6 +388,8 @@ int graph_inst_search_field (graph_config_t *cfg, /* {{{ */ graph_inst_callback_t callback, void *user_data) { size_t i; + const char *selector_field; + _Bool need_check_instances = 0; if ((cfg == NULL) || (field_value == NULL) || (callback == NULL)) return (EINVAL); @@ -395,16 +397,24 @@ int graph_inst_search_field (graph_config_t *cfg, /* {{{ */ if (!graph_matches_field (cfg, field, field_value)) return (0); + selector_field = ident_get_field (cfg->select, field); + if (selector_field == NULL) + return (-1); + + if (IS_ALL (selector_field) || IS_ANY (selector_field)) + need_check_instances = 1; + for (i = 0; i < cfg->instances_num; i++) { - if (inst_matches_field (cfg->instances[i], field, field_value)) - { - int status; + int status; - status = (*callback) (cfg, cfg->instances[i], user_data); - if (status != 0) - return (status); - } + if (need_check_instances + && !inst_matches_field (cfg->instances[i], field, field_value)) + continue; + + status = (*callback) (cfg, cfg->instances[i], user_data); + if (status != 0) + return (status); } return (0); -- 2.30.2