@@ -514,6 +514,16 @@ struct tracecmd_compress_chunk {
off64_t offset;
};
struct tracecmd_compression;
+struct tracecmd_compression_proto {
+ int weight;
+ const char *name;
+ const char *version;
+ int (*compress)(const char *in, unsigned int in_bytes, char *out, unsigned int *out_bytes);
+ int (*uncompress)(const char *in, unsigned int in_bytes, char *out, unsigned int *out_bytes);
+ unsigned int (*compress_size)(unsigned int bytes);
+ bool (*is_supported)(const char *name, const char *version);
+};
+
struct tracecmd_compression *tracecmd_compress_alloc(const char *name, const char *version,
int fd, struct tep_handle *tep,
struct tracecmd_msg_handle *msg_handle);
@@ -530,13 +540,7 @@ int tracecmd_compress_proto_get_name(struct tracecmd_compression *compress,
const char **name, const char **version);
bool tracecmd_compress_is_supported(const char *name, const char *version);
int tracecmd_compress_protos_get(char ***names, char ***versions);
-int tracecmd_compress_proto_register(const char *name, const char *version, int weight,
- int (*compress)(const char *in, unsigned int in_bytes,
- char *out, unsigned int *out_bytes),
- int (*uncompress)(const char *in, unsigned int in_bytes,
- char *out, unsigned int *out_bytes),
- unsigned int (*comress_size)(unsigned int bytes),
- bool (*is_supported)(const char *name, const char *version));
+int tracecmd_compress_proto_register(struct tracecmd_compression_proto *proto);
int tracecmd_compress_copy_from(struct tracecmd_compression *handle, int fd, int chunk_size,
unsigned long long *read_size, unsigned long long *write_size);
int tracecmd_uncompress_copy_to(struct tracecmd_compression *handle, int fd,
@@ -103,7 +103,16 @@ static bool zlib_is_supported(const char *name, const char *version)
int tracecmd_zlib_init(void)
{
- return tracecmd_compress_proto_register(__ZLIB_NAME, zlibVersion(), __ZLIB_WEIGTH,
- zlib_compress, zlib_decompress,
- zlib_compress_bound, zlib_is_supported);
+ struct tracecmd_compression_proto proto;
+
+ memset(&proto, 0, sizeof(proto));
+ proto.name = __ZLIB_NAME;
+ proto.version = zlibVersion();
+ proto.weight = __ZLIB_WEIGTH;
+ proto.compress = zlib_compress;
+ proto.uncompress = zlib_decompress;
+ proto.is_supported = zlib_is_supported;
+ proto.compress_size = zlib_compress_bound;
+
+ return tracecmd_compress_proto_register(&proto);
}
@@ -59,9 +59,19 @@ static bool zstd_is_supported(const char *name, const char *version)
int tracecmd_zstd_init(void)
{
+ struct tracecmd_compression_proto proto;
int ret = 0;
size_t r;
+ memset(&proto, 0, sizeof(proto));
+ proto.name = __ZSTD_NAME;
+ proto.version = ZSTD_versionString();
+ proto.weight = __ZSTD_WEIGTH;
+ proto.compress = zstd_compress;
+ proto.uncompress = zstd_decompress;
+ proto.is_supported = zstd_is_supported;
+ proto.compress_size = zstd_compress_bound;
+
ctx_c = ZSTD_createCCtx();
ctx_d = ZSTD_createDCtx();
if (!ctx_c || !ctx_d)
@@ -71,13 +81,7 @@ int tracecmd_zstd_init(void)
if (ZSTD_isError(r))
goto err;
- ret = tracecmd_compress_proto_register(__ZSTD_NAME,
- ZSTD_versionString(),
- __ZSTD_WEIGTH,
- zstd_compress,
- zstd_decompress,
- zstd_compress_bound,
- zstd_is_supported);
+ ret = tracecmd_compress_proto_register(&proto);
if (!ret)
return 0;
err:
@@ -522,39 +522,33 @@ int tracecmd_compress_proto_get_name(struct tracecmd_compression *compress,
* Returns 0 on success, or -1 in case of an error. If algorithm with given name
* and version is already registered, -1 is returned.
*/
-int tracecmd_compress_proto_register(const char *name, const char *version, int weight,
- int (*compress)(const char *in, unsigned int in_bytes,
- char *out, unsigned int *out_bytes),
- int (*uncompress)(const char *in, unsigned int in_bytes,
- char *out, unsigned int *out_bytes),
- unsigned int (*compress_size)(unsigned int bytes),
- bool (*is_supported)(const char *name, const char *version))
+int tracecmd_compress_proto_register(struct tracecmd_compression_proto *proto)
{
struct compress_proto *new;
- if (!name || !compress || !uncompress)
+ if (!proto || !proto->name || !proto->compress || !proto->uncompress)
return -1;
- if (tracecmd_compress_is_supported(name, version))
+ if (tracecmd_compress_is_supported(proto->name, proto->version))
return -1;
new = calloc(1, sizeof(*new));
if (!new)
return -1;
- new->proto_name = strdup(name);
+ new->proto_name = strdup(proto->name);
if (!new->proto_name)
goto error;
- new->proto_version = strdup(version);
+ new->proto_version = strdup(proto->version);
if (!new->proto_version)
goto error;
- new->compress_block = compress;
- new->uncompress_block = uncompress;
- new->compress_size = compress_size;
- new->is_supported = is_supported;
- new->weight = weight;
+ new->compress_block = proto->compress;
+ new->uncompress_block = proto->uncompress;
+ new->compress_size = proto->compress_size;
+ new->is_supported = proto->is_supported;
+ new->weight = proto->weight;
new->next = proto_list;
proto_list = new;
return 0;
Changed the tracecmd_compress_proto_register() function to use a structure instead of list of arguments to describe new compression protocol. That approach is more flexible and allows to extend the API in the future without changing the already implemented protocols. Suggested-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- .../include/private/trace-cmd-private.h | 18 ++++++++----- lib/trace-cmd/trace-compress-zlib.c | 15 ++++++++--- lib/trace-cmd/trace-compress-zstd.c | 18 ++++++++----- lib/trace-cmd/trace-compress.c | 26 +++++++------------ 4 files changed, 44 insertions(+), 33 deletions(-)