@@ -49,6 +49,9 @@ void out_compression_reset(struct tracecmd_output *handle, bool compress);
unsigned long long out_copy_fd_compress(struct tracecmd_output *handle,
int fd, unsigned long long max,
unsigned long long *write_size);
+void in_uncompress_reset(struct tracecmd_input *handle);
+int in_uncompress_block(struct tracecmd_input *handle);
+
unsigned long long
out_write_section_header(struct tracecmd_output *handle, unsigned short header_id,
char *description, int flags, bool option);
@@ -160,6 +160,9 @@ struct tracecmd_input {
unsigned int strings_size; /* size of the metadata strings */
char *strings; /* metadata strings */
+ bool read_compress;
+ struct tracecmd_compression *compress;
+
struct host_trace_info host;
double ts2secs;
char * cpustats;
@@ -266,13 +269,13 @@ static const char *show_records(struct page **pages, int nr_pages)
static int init_cpu(struct tracecmd_input *handle, int cpu);
-static ssize_t do_read(struct tracecmd_input *handle, void *data, size_t size)
+static ssize_t do_read_fd(int fd, void *data, size_t size)
{
ssize_t tot = 0;
ssize_t r;
do {
- r = read(handle->fd, data + tot, size - tot);
+ r = read(fd, data + tot, size - tot);
tot += r;
if (!r)
@@ -284,6 +287,22 @@ static ssize_t do_read(struct tracecmd_input *handle, void *data, size_t size)
return tot;
}
+static inline int do_lseek(struct tracecmd_input *handle, int offset, int whence)
+{
+ if (handle->read_compress)
+ return tracecmd_compress_lseek(handle->compress, offset, whence);
+ else
+ return lseek(handle->fd, offset, whence);
+}
+
+static inline ssize_t do_read(struct tracecmd_input *handle, void *data, size_t size)
+{
+ if (handle->read_compress)
+ return tracecmd_compress_buffer_read(handle->compress, data, size);
+ else
+ return do_read_fd(handle->fd, data, size);
+}
+
static ssize_t
do_read_check(struct tracecmd_input *handle, void *data, size_t size)
{
@@ -308,9 +327,7 @@ static char *read_string(struct tracecmd_input *handle)
for (;;) {
r = do_read(handle, buf, BUFSIZ);
- if (r < 0)
- goto fail;
- if (!r)
+ if (r <= 0)
goto fail;
for (i = 0; i < r; i++) {
@@ -336,7 +353,7 @@ static char *read_string(struct tracecmd_input *handle)
}
/* move the file descriptor to the end of the string */
- r = lseek(handle->fd, -(r - (i+1)), SEEK_CUR);
+ r = do_lseek(handle, -(r - (i+1)), SEEK_CUR);
if (r < 0)
goto fail;
@@ -400,6 +417,26 @@ static int read8(struct tracecmd_input *handle, unsigned long long *size)
return 0;
}
+__hidden void in_uncompress_reset(struct tracecmd_input *handle)
+{
+ if (handle->compress) {
+ handle->read_compress = false;
+ tracecmd_compress_reset(handle->compress);
+ }
+}
+
+__hidden int in_uncompress_block(struct tracecmd_input *handle)
+{
+ int ret = 0;
+
+ if (handle->compress) {
+ ret = tracecmd_uncompress_block(handle->compress);
+ if (!ret)
+ handle->read_compress = true;
+ }
+ return ret;
+}
+
static struct file_section *section_get(struct tracecmd_input *handle, int id)
{
struct file_section *sec;
New library internal helper functions are introduced, to add compression functionality to the input trace handler. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- lib/trace-cmd/include/trace-cmd-local.h | 3 ++ lib/trace-cmd/trace-input.c | 49 ++++++++++++++++++++++--- 2 files changed, 46 insertions(+), 6 deletions(-)