@@ -39,6 +39,10 @@ void tracecmd_zlib_free(void);
int tracecmd_compress_init(void);
void tracecmd_compress_free(void);
+bool check_file_state(unsigned long file_version, int current_state, int new_state);
+bool check_in_state(struct tracecmd_input *handle, int new_state);
+bool check_out_state(struct tracecmd_output *handle, int new_state);
+
int out_uncompress_block(struct tracecmd_output *handle);
int out_compression_start(struct tracecmd_output *handle);
int out_compression_end(struct tracecmd_output *handle);
@@ -4397,3 +4397,8 @@ int tracecmd_enable_tsync(struct tracecmd_input *handle, bool enable)
return 0;
}
+
+__hidden bool check_in_state(struct tracecmd_input *handle, int new_state)
+{
+ return check_file_state(handle->file_version, handle->file_state, new_state);
+}
@@ -419,50 +419,6 @@ int tracecmd_ftrace_enable(int set)
return ret;
}
-static int check_out_state(struct tracecmd_output *handle, int new_state)
-{
- if (!handle)
- return -1;
-
- if (handle->file_version < 7) {
- switch (new_state) {
- case TRACECMD_FILE_BUFERS:
- tracecmd_warning("State %d is not supported in trace file version %d",
- new_state, handle->file_version);
- return -1;
- default:
- break;
- }
- }
-
- switch (new_state) {
- case TRACECMD_FILE_HEADERS:
- case TRACECMD_FILE_FTRACE_EVENTS:
- case TRACECMD_FILE_ALL_EVENTS:
- case TRACECMD_FILE_KALLSYMS:
- case TRACECMD_FILE_PRINTK:
- case TRACECMD_FILE_CMD_LINES:
- case TRACECMD_FILE_CPU_COUNT:
- case TRACECMD_FILE_BUFERS:
- if (handle->file_state == (new_state - 1))
- return 0;
- break;
- case TRACECMD_FILE_OPTIONS:
- if (handle->file_version < 7 && handle->file_state == TRACECMD_FILE_CPU_COUNT)
- return 0;
- if (handle->file_version >= 7 && handle->file_state == TRACECMD_FILE_BUFERS)
- return 0;
- break;
- case TRACECMD_FILE_CPU_LATENCY:
- case TRACECMD_FILE_CPU_FLYRECORD:
- if (handle->file_state == TRACECMD_FILE_OPTIONS)
- return 0;
- break;
- }
-
- return -1;
-}
-
static int read_header_files(struct tracecmd_output *handle)
{
tsize_t size, check_size, endian8;
@@ -471,7 +427,7 @@ static int read_header_files(struct tracecmd_output *handle)
int fd;
int ret;
- if (check_out_state(handle, TRACECMD_FILE_HEADERS) < 0) {
+ if (!check_out_state(handle, TRACECMD_FILE_HEADERS)) {
tracecmd_warning("Cannot read header files, unexpected state 0x%X",
handle->file_state);
return -1;
@@ -783,7 +739,7 @@ static int read_ftrace_files(struct tracecmd_output *handle)
struct tracecmd_event_list list = { .glob = "ftrace/*" };
int ret;
- if (check_out_state(handle, TRACECMD_FILE_FTRACE_EVENTS) < 0) {
+ if (!check_out_state(handle, TRACECMD_FILE_FTRACE_EVENTS)) {
tracecmd_warning("Cannot read ftrace files, unexpected state 0x%X",
handle->file_state);
return -1;
@@ -828,7 +784,7 @@ static int read_event_files(struct tracecmd_output *handle,
int endian4;
int ret;
- if (check_out_state(handle, TRACECMD_FILE_ALL_EVENTS) < 0) {
+ if (!check_out_state(handle, TRACECMD_FILE_ALL_EVENTS)) {
tracecmd_warning("Cannot read event files, unexpected state 0x%X",
handle->file_state);
return -1;
@@ -927,7 +883,7 @@ static int read_proc_kallsyms(struct tracecmd_output *handle,
struct stat st;
int ret;
- if (check_out_state(handle, TRACECMD_FILE_KALLSYMS) < 0) {
+ if (!check_out_state(handle, TRACECMD_FILE_KALLSYMS)) {
tracecmd_warning("Cannot read kallsyms, unexpected state 0x%X",
handle->file_state);
return -1;
@@ -977,7 +933,7 @@ static int read_ftrace_printk(struct tracecmd_output *handle)
char *path;
int ret;
- if (check_out_state(handle, TRACECMD_FILE_PRINTK) < 0) {
+ if (!check_out_state(handle, TRACECMD_FILE_PRINTK)) {
tracecmd_warning("Cannot read printk, unexpected state 0x%X",
handle->file_state);
return -1;
@@ -1343,11 +1299,10 @@ int tracecmd_write_cpus(struct tracecmd_output *handle, int cpus)
{
int ret;
- ret = check_out_state(handle, TRACECMD_FILE_CPU_COUNT);
- if (ret < 0) {
+ if (!check_out_state(handle, TRACECMD_FILE_CPU_COUNT)) {
tracecmd_warning("Cannot write CPU count into the file, unexpected state 0x%X",
handle->file_state);
- return ret;
+ return -1;
}
cpus = convert_endian_4(handle, cpus);
ret = do_write_check(handle, &cpus, 4);
@@ -1363,16 +1318,14 @@ int tracecmd_write_options(struct tracecmd_output *handle)
unsigned short option;
unsigned short endian2;
unsigned int endian4;
- int ret;
/* If already written, ignore */
if (handle->file_state == TRACECMD_FILE_OPTIONS)
return 0;
- ret = check_out_state(handle, TRACECMD_FILE_OPTIONS);
- if (ret < 0) {
+ if (!check_out_state(handle, TRACECMD_FILE_OPTIONS)) {
tracecmd_warning("Cannot write options into the file, unexpected state 0x%X",
handle->file_state);
- return ret;
+ return -1;
}
if (do_write_check(handle, "options ", 10))
@@ -1535,10 +1488,9 @@ static int write_buffers_description_v7(struct tracecmd_output *handle)
int size;
int ret;
- ret = check_out_state(handle, TRACECMD_FILE_BUFERS);
- if (ret < 0) {
+ if (!check_out_state(handle, TRACECMD_FILE_BUFERS)) {
tracecmd_warning("Cannot write buffers descriptions");
- return ret;
+ return -1;
}
list_for_each_entry(buf, &handle->buffers, list) {
@@ -1597,11 +1549,10 @@ int tracecmd_write_cmdlines(struct tracecmd_output *handle)
{
int ret;
- ret = check_out_state(handle, TRACECMD_FILE_CMD_LINES);
- if (ret < 0) {
+ if (!check_out_state(handle, TRACECMD_FILE_CMD_LINES)) {
tracecmd_warning("Cannot write command lines into the file, unexpected state 0x%X",
handle->file_state);
- return ret;
+ return -1;
}
out_compression_start(handle);
@@ -1621,7 +1572,6 @@ struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, in
{
struct tracecmd_output *handle;
char *path;
- int ret;
handle = create_file(output_file, NULL, NULL, NULL, &all_event_list, compression);
if (!handle)
@@ -1640,8 +1590,7 @@ struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, in
if (tracecmd_write_options(handle) < 0)
goto out_free;
- ret = check_out_state(handle, TRACECMD_FILE_CPU_LATENCY);
- if (ret < 0) {
+ if (!check_out_state(handle, TRACECMD_FILE_CPU_LATENCY)) {
tracecmd_warning("Cannot write latency data into the file, unexpected state 0x%X",
handle->file_state);
goto out_free;
@@ -1730,7 +1679,9 @@ int tracecmd_write_cpu_data(struct tracecmd_output *handle,
/* This can be called multiple times (when recording instances) */
ret = handle->file_state == TRACECMD_FILE_CPU_FLYRECORD ? 0 :
- check_out_state(handle, TRACECMD_FILE_CPU_FLYRECORD);
+ check_file_state(handle->file_version,
+ handle->file_state,
+ TRACECMD_FILE_CPU_FLYRECORD);
if (ret < 0) {
tracecmd_warning("Cannot write trace data into the file, unexpected state 0x%X",
handle->file_state);
@@ -1999,3 +1950,8 @@ out_free:
tracecmd_output_close(handle);
return NULL;
}
+
+__hidden bool check_out_state(struct tracecmd_output *handle, int new_state)
+{
+ return check_file_state(handle->file_version, handle->file_state, new_state);
+}
@@ -636,3 +636,44 @@ void tracecmd_lib_free(void)
{
tracecmd_compress_free();
}
+
+__hidden bool check_file_state(unsigned long file_version, int current_state, int new_state)
+{
+ if (file_version < 7) {
+ switch (new_state) {
+ case TRACECMD_FILE_BUFERS:
+ tracecmd_warning("State %d is not supported in trace file version %d",
+ new_state, file_version);
+ return false;
+ default:
+ break;
+ }
+ }
+
+ switch (new_state) {
+ case TRACECMD_FILE_HEADERS:
+ case TRACECMD_FILE_FTRACE_EVENTS:
+ case TRACECMD_FILE_ALL_EVENTS:
+ case TRACECMD_FILE_KALLSYMS:
+ case TRACECMD_FILE_PRINTK:
+ case TRACECMD_FILE_CMD_LINES:
+ case TRACECMD_FILE_CPU_COUNT:
+ case TRACECMD_FILE_BUFERS:
+ if (current_state == (new_state - 1))
+ return true;
+ break;
+ case TRACECMD_FILE_OPTIONS:
+ if (file_version < 7 && current_state == TRACECMD_FILE_CPU_COUNT)
+ return true;
+ if (file_version >= 7 && current_state == TRACECMD_FILE_BUFERS)
+ return true;
+ break;
+ case TRACECMD_FILE_CPU_LATENCY:
+ case TRACECMD_FILE_CPU_FLYRECORD:
+ if (current_state == TRACECMD_FILE_OPTIONS)
+ return true;
+ break;
+ }
+
+ return false;
+}
Make the function, that checks if the next file state is valid, global for the tracmd-library, so it can be reused. It is important the same check logic to be used in the whole library. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- lib/trace-cmd/include/trace-cmd-local.h | 4 ++ lib/trace-cmd/trace-input.c | 5 ++ lib/trace-cmd/trace-output.c | 88 +++++++------------------ lib/trace-cmd/trace-util.c | 41 ++++++++++++ 4 files changed, 72 insertions(+), 66 deletions(-)