@@ -17,6 +17,7 @@ int tracefs_synth_destroy(struct tracefs_instance pass:[*]instance,
struct tracefs_synth pass:[*]synth);
int tracefs_synth_show(struct trace_seq pass:[*]seq, struct tracefs_instance pass:[*]instance,
struct tracefs_synth pass:[*]synth);
+struct tracefs_hist pass:[*]tracefs_synth_get_start_hist(struct tracefs_synth pass:[*]synth);
--
@@ -52,6 +53,9 @@ this may fail as busy.
the synthetic event in the given _instance_, it will write the echo commands to
manually create it in the _seq_ given.
+*tracefs_synth_get_start_hist*() returns a struct tracefs_hist descriptor describing
+the histogram used to create the synthetic event.
+
RETURN VALUE
------------
Returns zero on success or -1 on error.
@@ -467,6 +467,7 @@ int tracefs_synth_append_end_filter(struct tracefs_synth *synth,
const char *field,
enum tracefs_compare compare,
const char *val);
+struct tracefs_hist *tracefs_synth_get_start_hist(struct tracefs_synth *synth);
int tracefs_synth_create(struct tracefs_instance *instance,
struct tracefs_synth *synth);
int tracefs_synth_destroy(struct tracefs_instance *instance,
@@ -543,6 +543,7 @@ struct tracefs_synth {
char *name;
char **synthetic_fields;
char **synthetic_args;
+ char **start_selection;
char **start_keys;
char **end_keys;
char **start_vars;
@@ -1061,6 +1062,7 @@ int tracefs_synth_add_start_field(struct tracefs_synth *synth,
{
const struct tep_format_field *field;
char *start_arg;
+ char **tmp;
int ret;
if (!synth || !start_field) {
@@ -1087,7 +1089,14 @@ int tracefs_synth_add_start_field(struct tracefs_synth *synth,
goto out_free;
ret = add_synth_fields(synth, field, name);
+ if (ret)
+ goto out_free;
+ tmp = tracefs_list_add(synth->start_selection, start_field);
+ if (tmp)
+ synth->start_selection = tmp;
+ else
+ ret = -1;
out_free:
free(start_arg);
return ret;
@@ -1345,6 +1354,70 @@ static int verify_state(struct tracefs_synth *synth)
return 0;
}
+/**
+ * tracefs_synth_get_start_hist - Return the histogram of the start event
+ * @synth: The synthetic event to get the start hist from.
+ *
+ * On success, returns a tracefs_hist descriptor that holds the
+ * histogram information of the start_event of the synthetic event
+ * structure. Returns NULL on failure.
+ */
+struct tracefs_hist *
+tracefs_synth_get_start_hist(struct tracefs_synth *synth)
+{
+ struct tracefs_hist *hist = NULL;
+ struct tep_handle *tep;
+ const char *system;
+ const char *event;
+ const char *key;
+ char **keys;
+ int ret;
+ int i;
+
+ if (!synth) {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ system = synth->start_event->system;
+ event = synth->start_event->name;
+ keys = synth->start_keys;
+ tep = synth->tep;
+
+ if (!keys)
+ keys = synth->start_selection;
+
+ if (!keys)
+ return NULL;
+
+ for (i = 0; keys[i]; i++) {
+ key = keys[i];
+
+ if (i) {
+ ret = tracefs_hist_add_key(hist, key, 0);
+ if (ret < 0) {
+ tracefs_hist_free(hist);
+ return NULL;
+ }
+ } else {
+ hist = tracefs_hist_alloc(tep, system, event,
+ key, 0);
+ if (!hist)
+ return NULL;
+ }
+ }
+
+ if (synth->start_filter) {
+ hist->filter = strdup(synth->start_filter);
+ if (!hist->filter) {
+ tracefs_hist_free(hist);
+ return NULL;
+ }
+ }
+
+ return hist;
+}
+
/**
* tracefs_synth_create - creates the synthetic event on the system
* @instance: The instance to modify the start and end events