diff mbox series

[1/6] kernel-shark: Add KS_DOUBLE_SIZE macro

Message ID 20210106161120.119085-2-y.karadz@gmail.com (mailing list archive)
State Superseded
Headers show
Series kernel-shark: Visualization plugin tools | expand

Commit Message

Yordan Karadzhov Jan. 6, 2021, 4:11 p.m. UTC
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(-)

Comments

Steven Rostedt Jan. 6, 2021, 5:02 p.m. UTC | #1
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();
Steven Rostedt Jan. 6, 2021, 5:28 p.m. UTC | #2
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 mbox series

Patch

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();