tracing/filter: Change count_leafs function to use walk_pred_tree
authorJiri Olsa <jolsa@redhat.com>
Thu, 11 Aug 2011 14:25:50 +0000 (16:25 +0200)
committerSteven Rostedt <rostedt@goodmis.org>
Fri, 19 Aug 2011 18:35:55 +0000 (14:35 -0400)
Changing count_leafs function to use unified predicates tree
processing.

Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/1313072754-4620-7-git-send-email-jolsa@redhat.com
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/trace_events_filter.c

index 5b889d43d8567b24bd731fd383c83a55e3a19e63..ebbb2611982e5e7ee15e8e126c59de3e4adcd5f9 100644 (file)
@@ -1418,43 +1418,24 @@ static int check_pred_tree(struct event_filter *filter,
                              check_pred_tree_cb, &data);
 }
 
-static int count_leafs(struct filter_pred *preds, struct filter_pred *root)
+static int count_leafs_cb(enum move_type move, struct filter_pred *pred,
+                         int *err, void *data)
 {
-       struct filter_pred *pred;
-       enum move_type move = MOVE_DOWN;
-       int count = 0;
-       int done = 0;
+       int *count = data;
 
-       pred = root;
+       if ((move == MOVE_DOWN) &&
+           (pred->left == FILTER_PRED_INVALID))
+               (*count)++;
 
-       do {
-               switch (move) {
-               case MOVE_DOWN:
-                       if (pred->left != FILTER_PRED_INVALID) {
-                               pred = &preds[pred->left];
-                               continue;
-                       }
-                       /* A leaf at the root is just a leaf in the tree */
-                       if (pred == root)
-                               return 1;
-                       count++;
-                       pred = get_pred_parent(pred, preds,
-                                              pred->parent, &move);
-                       continue;
-               case MOVE_UP_FROM_LEFT:
-                       pred = &preds[pred->right];
-                       move = MOVE_DOWN;
-                       continue;
-               case MOVE_UP_FROM_RIGHT:
-                       if (pred == root)
-                               break;
-                       pred = get_pred_parent(pred, preds,
-                                              pred->parent, &move);
-                       continue;
-               }
-               done = 1;
-       } while (!done);
+       return WALK_PRED_DEFAULT;
+}
+
+static int count_leafs(struct filter_pred *preds, struct filter_pred *root)
+{
+       int count = 0, ret;
 
+       ret = walk_pred_tree(preds, root, count_leafs_cb, &count);
+       WARN_ON(ret);
        return count;
 }