@@ -292,6 +292,8 @@ tracecmd_add_option_v(struct tracecmd_output *handle,
struct tracecmd_option *tracecmd_add_buffer_option(struct tracecmd_output *handle,
const char *name, int cpus);
+int tracecmd_add_buffer_info(struct tracecmd_output *handle, const char *name, int cpus);
+int tracecmd_write_buffer_info(struct tracecmd_output *handle);
int tracecmd_write_cpus(struct tracecmd_output *handle, int cpus);
int tracecmd_write_cmdlines(struct tracecmd_output *handle);
@@ -39,6 +39,14 @@ struct tracecmd_option {
struct list_head list;
};
+struct tracecmd_buffer {
+ int cpus;
+ void *name;
+ tsize_t offset;
+ struct tracecmd_option *option;
+ struct list_head list;
+};
+
enum {
OUTPUT_FL_SEND_META = (1 << 0),
};
@@ -58,6 +66,7 @@ struct tracecmd_output {
bool big_endian;
struct list_head options;
+ struct list_head buffers;
struct tracecmd_msg_handle *msg_handle;
char *trace_clock;
};
@@ -140,6 +149,7 @@ bool tracecmd_get_quiet(struct tracecmd_output *handle)
void tracecmd_output_free(struct tracecmd_output *handle)
{
struct tracecmd_option *option;
+ struct tracecmd_buffer *buffer;
if (!handle)
return;
@@ -150,6 +160,13 @@ void tracecmd_output_free(struct tracecmd_output *handle)
if (handle->pevent)
tep_unref(handle->pevent);
+ while (!list_empty(&handle->buffers)) {
+ buffer = container_of(handle->buffers.next,
+ struct tracecmd_buffer, list);
+ list_del(&buffer->list);
+ free(buffer->name);
+ free(buffer);
+ }
while (!list_empty(&handle->options)) {
option = container_of(handle->options.next,
struct tracecmd_option, list);
@@ -157,6 +174,7 @@ void tracecmd_output_free(struct tracecmd_output *handle)
free(option->data);
free(option);
}
+
free(handle->trace_clock);
free(handle);
}
@@ -907,6 +925,7 @@ struct tracecmd_output *tracecmd_output_allocate(int fd)
handle->big_endian = tracecmd_host_bigendian();
list_head_init(&handle->options);
+ list_head_init(&handle->buffers);
handle->file_state = TRACECMD_FILE_ALLOCATED;
@@ -1323,7 +1342,7 @@ tracecmd_add_buffer_option(struct tracecmd_output *handle, const char *name,
char *buf;
int size = 8 + strlen(name) + 1;
- buf = malloc(size);
+ buf = calloc(1, size);
if (!buf) {
tracecmd_warning("Failed to malloc buffer");
return NULL;
@@ -1345,6 +1364,38 @@ tracecmd_add_buffer_option(struct tracecmd_output *handle, const char *name,
return option;
}
+int tracecmd_add_buffer_info(struct tracecmd_output *handle, const char *name, int cpus)
+{
+ struct tracecmd_buffer *buf;
+
+ buf = calloc(1, sizeof(struct tracecmd_buffer));
+ if (!buf)
+ return -1;
+ buf->name = strdup(name);
+ buf->cpus = cpus;
+ if (!buf->name) {
+ free(buf);
+ return -1;
+ }
+ list_add_tail(&buf->list, &handle->buffers);
+ return 0;
+}
+
+int tracecmd_write_buffer_info(struct tracecmd_output *handle)
+{
+ struct tracecmd_option *option;
+ struct tracecmd_buffer *buf;
+
+ list_for_each_entry(buf, &handle->buffers, list) {
+ option = tracecmd_add_buffer_option(handle, buf->name, buf->cpus);
+ if (!option)
+ return -1;
+ buf->option = option;
+ }
+
+ return 0;
+}
+
int tracecmd_write_cmdlines(struct tracecmd_output *handle)
{
int ret;
@@ -1580,7 +1631,9 @@ int tracecmd_append_cpu_data(struct tracecmd_output *handle,
ret = tracecmd_write_cpus(handle, cpus);
if (ret)
return ret;
-
+ ret = tracecmd_write_buffer_info(handle);
+ if (ret)
+ return ret;
ret = tracecmd_write_options(handle);
if (ret)
return ret;
@@ -1658,6 +1711,7 @@ struct tracecmd_output *tracecmd_get_output_handle_fd(int fd)
handle->file_version = tracecmd_get_in_file_version(ihandle);
handle->options_start = tracecmd_get_options_offset(ihandle);
list_head_init(&handle->options);
+ list_head_init(&handle->buffers);
tracecmd_close(ihandle);
The new list with trace buffers information is added in the output handler, and internal APIs to work with that list. Storing various trace buffers information in the handler hides the complexity of this logic inside the library and simplifies possible extensions in the future. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- .../include/private/trace-cmd-private.h | 2 + lib/trace-cmd/trace-output.c | 58 ++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-)