Message ID | 20210106161120.119085-2-y.karadz@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | kernel-shark: Visualization plugin tools | expand |
On Wed, 6 Jan 2021 18:11:15 +0200 "Yordan Karadzhov (VMware)" <y.karadz@gmail.com> wrote: > The macro is useful for resizing of dynamic arrays. It is currently > used to resize the Data stream descriptor array, owned by the session > context. We will later use the macro with the arrays of data fields and > plugin contexts. > > Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com> > --- > src/libkshark-plugin.h | 14 ++++++++++++++ > src/libkshark.c | 15 +++++++-------- > 2 files changed, 21 insertions(+), 8 deletions(-) > > diff --git a/src/libkshark-plugin.h b/src/libkshark-plugin.h > index 1a642ad..f3c724f 100644 > --- a/src/libkshark-plugin.h > +++ b/src/libkshark-plugin.h > @@ -346,6 +346,20 @@ int kshark_handle_dpi(struct kshark_data_stream *stream, > int kshark_handle_all_dpis(struct kshark_data_stream *stream, > enum kshark_plugin_actions task_id); > > +/** General purpose macro for resizing dynamic arrays. */ Perhaps make this into a static inline function? > +#define KS_DOUBLE_SIZE(type, array, size, ok) \ > +{ \ > + ssize_t n = *size; \ > + *ok = false; \ As a macro, ok does not need to be passed in as an address. > + type *tmp = (type *) realloc(array, 2 * n * sizeof(*tmp)); \ > + if (tmp) { \ > + memset(tmp + n, 0, n * sizeof(*tmp)); \ > + *size = 2 * n; \ as a macro you do not need to pass in the address. If you are going to do that, then please make this into a static inline function. > + array = tmp; \ > + *ok = true; \ I would get rid of the ok, and just have this return true or false. FYI, as a macro, to return a value you have: #define foo() ({ return true; }) Which would then return a true value. -- Steve > + } \ > +} \ > + > #ifdef __cplusplus > } > #endif // __cplusplus > diff --git a/src/libkshark.c b/src/libkshark.c > index 315c24f..3aa3fa2 100644 > --- a/src/libkshark.c > +++ b/src/libkshark.c > @@ -234,16 +234,15 @@ int kshark_add_stream(struct kshark_context *kshark_ctx) > > if (kshark_ctx->stream_info.next_free_stream_id == > kshark_ctx->stream_info.array_size) { > - size_t new_size = 2 * kshark_ctx->stream_info.array_size; > - struct kshark_data_stream **streams_tmp; > + bool ok; > > - streams_tmp = realloc(kshark_ctx->stream, > - new_size * sizeof(*kshark_ctx->stream)); > - if (!streams_tmp) > - return -ENOMEM; > + KS_DOUBLE_SIZE(struct kshark_data_stream *, > + kshark_ctx->stream, > + &kshark_ctx->stream_info.array_size, > + &ok); > > - kshark_ctx->stream = streams_tmp; > - kshark_ctx->stream_info.array_size = new_size; > + if (!ok) > + return -ENOMEM; > } > > stream = kshark_stream_alloc();
On Wed, 6 Jan 2021 12:02:08 -0500 Steven Rostedt <rostedt@goodmis.org> wrote: > On Wed, 6 Jan 2021 18:11:15 +0200 > "Yordan Karadzhov (VMware)" <y.karadz@gmail.com> wrote: > > > The macro is useful for resizing of dynamic arrays. It is currently > > used to resize the Data stream descriptor array, owned by the session > > context. We will later use the macro with the arrays of data fields and > > plugin contexts. > > > > Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com> > > --- > > src/libkshark-plugin.h | 14 ++++++++++++++ > > src/libkshark.c | 15 +++++++-------- > > 2 files changed, 21 insertions(+), 8 deletions(-) > > > > diff --git a/src/libkshark-plugin.h b/src/libkshark-plugin.h > > index 1a642ad..f3c724f 100644 > > --- a/src/libkshark-plugin.h > > +++ b/src/libkshark-plugin.h > > @@ -346,6 +346,20 @@ int kshark_handle_dpi(struct kshark_data_stream *stream, > > int kshark_handle_all_dpis(struct kshark_data_stream *stream, > > enum kshark_plugin_actions task_id); > > > > +/** General purpose macro for resizing dynamic arrays. */ > > Perhaps make this into a static inline function? Never mind, I see you need the macro due to the "type" field. But we can shorten this with: #define KS_DOUBLE_SIZE(array, size) \ ({ \ ssize_t n = size; \ typeof(array) _tmp_ = (typeof(array)) realloc(array, 2 * n * \ sizeof(*_tmp_)); \ if (_tmp_) { \ memset(_tmp_ + n, 0, n * sizeof(*_tmp_)); \ size = 2 * n; \ array = _tmp_; \ true; \ } \ false; \ }) > FYI, as a macro, to return a value you have: > > #define foo() ({ return true; }) The above is wrong, it should have been: #define foo() ({ true; }) -- Steve
diff --git a/src/libkshark-plugin.h b/src/libkshark-plugin.h index 1a642ad..f3c724f 100644 --- a/src/libkshark-plugin.h +++ b/src/libkshark-plugin.h @@ -346,6 +346,20 @@ int kshark_handle_dpi(struct kshark_data_stream *stream, int kshark_handle_all_dpis(struct kshark_data_stream *stream, enum kshark_plugin_actions task_id); +/** General purpose macro for resizing dynamic arrays. */ +#define KS_DOUBLE_SIZE(type, array, size, ok) \ +{ \ + ssize_t n = *size; \ + *ok = false; \ + type *tmp = (type *) realloc(array, 2 * n * sizeof(*tmp)); \ + if (tmp) { \ + memset(tmp + n, 0, n * sizeof(*tmp)); \ + *size = 2 * n; \ + array = tmp; \ + *ok = true; \ + } \ +} \ + #ifdef __cplusplus } #endif // __cplusplus diff --git a/src/libkshark.c b/src/libkshark.c index 315c24f..3aa3fa2 100644 --- a/src/libkshark.c +++ b/src/libkshark.c @@ -234,16 +234,15 @@ int kshark_add_stream(struct kshark_context *kshark_ctx) if (kshark_ctx->stream_info.next_free_stream_id == kshark_ctx->stream_info.array_size) { - size_t new_size = 2 * kshark_ctx->stream_info.array_size; - struct kshark_data_stream **streams_tmp; + bool ok; - streams_tmp = realloc(kshark_ctx->stream, - new_size * sizeof(*kshark_ctx->stream)); - if (!streams_tmp) - return -ENOMEM; + KS_DOUBLE_SIZE(struct kshark_data_stream *, + kshark_ctx->stream, + &kshark_ctx->stream_info.array_size, + &ok); - kshark_ctx->stream = streams_tmp; - kshark_ctx->stream_info.array_size = new_size; + if (!ok) + return -ENOMEM; } stream = kshark_stream_alloc();
The macro is useful for resizing of dynamic arrays. It is currently used to resize the Data stream descriptor array, owned by the session context. We will later use the macro with the arrays of data fields and plugin contexts. Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com> --- src/libkshark-plugin.h | 14 ++++++++++++++ src/libkshark.c | 15 +++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-)