From: Jérémie Galarneau Date: Fri, 5 May 2017 02:49:35 +0000 (-0400) Subject: Add lttng_buffer_view util X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=commitdiff_plain;h=01dc0eed91e5c7db3f12beda894cb3d9cc7a4fa1 Add lttng_buffer_view util Signed-off-by: Jérémie Galarneau --- diff --git a/src/common/Makefile.am b/src/common/Makefile.am index f54f646c6..83354d070 100644 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -73,7 +73,8 @@ libcommon_la_SOURCES = error.h error.c utils.c utils.h runas.c runas.h \ mi-lttng.h mi-lttng.c \ daemonize.c daemonize.h \ unix.c unix.h \ - dynamic-buffer.h dynamic-buffer.c + dynamic-buffer.h dynamic-buffer.c \ + buffer-view.h buffer-view.c libcommon_la_LIBADD = \ $(top_builddir)/src/common/config/libconfig.la diff --git a/src/common/buffer-view.c b/src/common/buffer-view.c new file mode 100644 index 000000000..8ff153991 --- /dev/null +++ b/src/common/buffer-view.c @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2017 - Jérémie Galarneau + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License, version 2.1 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include + +struct lttng_buffer_view lttng_buffer_view_from_view( + const struct lttng_buffer_view *src, size_t offset, + ptrdiff_t len) +{ + struct lttng_buffer_view view = { .data = NULL, .size = 0 }; + + assert(src); + + if (offset > src->size) { + ERR("Attempt to create buffer view with invalid offset"); + goto end; + } + + if (len != -1 && len > (src->size - offset)) { + ERR("Attempt to create buffer view with invalid length"); + goto end; + } + + view.data = src->data + offset; + view.size = len == -1 ? (src->size - offset) : len; +end: + return view; +} + +struct lttng_buffer_view lttng_buffer_view_from_dynamic_buffer( + const struct lttng_dynamic_buffer *src, size_t offset, + ptrdiff_t len) +{ + struct lttng_buffer_view view = { .data = NULL, .size = 0 }; + + assert(src); + + if (offset > src->size) { + ERR("Attempt to create buffer view with invalid offset"); + goto end; + } + + if (len != -1 && len > (src->size - offset)) { + ERR("Attempt to create buffer view with invalid length"); + goto end; + } + + view.data = src->data + offset; + view.size = len == -1 ? (src->size - offset) : len; +end: + return view; +} diff --git a/src/common/buffer-view.h b/src/common/buffer-view.h new file mode 100644 index 000000000..7d03b41dd --- /dev/null +++ b/src/common/buffer-view.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2017 - Jérémie Galarneau + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License, version 2.1 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LTTNG_BUFFER_VIEW_H +#define LTTNG_BUFFER_VIEW_H + +#include +#include + +struct lttng_dynamic_buffer; + +struct lttng_buffer_view { + const char *data; + size_t size; +}; + +/** + * Return a buffer view referencing a subset of the memory referenced by another + * view. + * + * @src Source view to reference + * @offset Offset to apply to the source memory content + * @len Length of the memory contents to reference. Passing -1 will + * cause the view to reference the whole view from the offset + * provided. + * + * Note that a buffer view never assumes the ownership of the memory it + * references. + */ +struct lttng_buffer_view lttng_buffer_view_from_view( + const struct lttng_buffer_view *src, size_t offset, + ptrdiff_t len); + +/** + * Return a buffer view referencing a subset of the memory referenced by a + * dynamic buffer. + * + * @src Source dynamic buffer to reference + * @offset Offset to apply to the source memory content + * @len Length of the memory contents to reference. Passing -1 will + * cause the view to reference the whole dynamic buffer from the + * offset provided. + * + * Note that a buffer view never assumes the ownership of the memory it + * references. + */ +struct lttng_buffer_view lttng_buffer_view_from_dynamic_buffer( + const struct lttng_dynamic_buffer *src, size_t offset, + ptrdiff_t len); + +#endif /* LTTNG_BUFFER_VIEW_H */