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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxx>
---
 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. */
+#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();
-- 
2.25.1




[Index of Archives]     [Linux USB Development]     [Linux USB Development]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux