|
@@ -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;
|
|
|
}
|
|
|
|