@@ -63,16 +63,17 @@ struct traceeval_dynamic {
};
struct traceeval_type;
+struct traceeval;
/* struct traceeval_dynamic release function signature */
-typedef void (*traceeval_data_release_fn)(struct traceeval_type *,
- union traceeval_data *);
+typedef void (*traceeval_data_release_fn)(const struct traceeval_type *type,
+ union traceeval_data *data);
/* struct traceeval_dynamic compare function signature */
-typedef int (*traceeval_data_cmp_fn)(const union traceeval_data *,
- const union traceeval_data *,
- struct traceeval_type *);
-
+typedef int (*traceeval_data_cmp_fn)(struct traceeval *teval,
+ const struct traceeval_type *type,
+ const union traceeval_data *A,
+ const union traceeval_data *B);
/*
* struct traceeval_type - Describes the type of a traceevent_data instance
* @type: The enum type that describes the traceeval_data
@@ -112,7 +112,8 @@ static int compare_traceeval_type(struct traceeval_type *orig,
* Return 0 if @orig and @copy are the same, 1 if @orig is greater than @copy,
* -1 for the other way around, and -2 on error.
*/
-static int compare_traceeval_data(union traceeval_data *orig,
+static int compare_traceeval_data(struct traceeval *teval,
+ union traceeval_data *orig,
const union traceeval_data *copy,
struct traceeval_type *type)
{
@@ -128,7 +129,7 @@ static int compare_traceeval_data(union traceeval_data *orig,
return 1;
if (type->cmp)
- return type->cmp(orig, copy, type);
+ return type->cmp(teval, type, orig, copy);
switch (type->type) {
case TRACEEVAL_TYPE_STRING:
@@ -166,7 +167,8 @@ static int compare_traceeval_data(union traceeval_data *orig,
*
* Return 0 if @orig and @copy are the same, 1 if not, and -1 on error.
*/
-static int compare_traceeval_data_set(union traceeval_data *orig,
+static int compare_traceeval_data_set(struct traceeval *teval,
+ union traceeval_data *orig,
const union traceeval_data *copy,
struct traceeval_type *defs, size_t size)
{
@@ -175,7 +177,7 @@ static int compare_traceeval_data_set(union traceeval_data *orig,
/* compare data arrays */
for (i = 0; i < size; i++) {
- if ((check = compare_traceeval_data(orig + i, copy + i, defs + i)))
+ if ((check = compare_traceeval_data(teval, orig + i, copy + i, defs + i)))
return check == -2 ? -1 : 1;
}
@@ -191,13 +193,13 @@ static int compare_entries(struct entry *orig, struct entry *copy,
int check;
/* compare keys */
- check = compare_traceeval_data_set(orig->keys, copy->keys,
+ check = compare_traceeval_data_set(teval, orig->keys, copy->keys,
teval->key_types, teval->nr_key_types);
if (check)
return check;
/* compare values */
- check = compare_traceeval_data_set(orig->vals, copy->vals,
+ check = compare_traceeval_data_set(teval, orig->vals, copy->vals,
teval->val_types, teval->nr_val_types);
return check;
}
@@ -543,8 +545,8 @@ static int get_entry(struct traceeval *teval, const union traceeval_data *keys,
i = 0;
for (struct entry *entry = hist->map; i < hist->nr_entries;
entry = &hist->map[++i]) {
- check = compare_traceeval_data_set(entry->keys, keys,
- teval->key_types, teval->nr_key_types);
+ check = compare_traceeval_data_set(teval, entry->keys, keys,
+ teval->key_types, teval->nr_key_types);
/* return entry if keys match */
if (!check) {