@@ -24,6 +24,8 @@ extern "C" {
/* Quiet warnings over documenting simple structures */
//! @cond Doxygen_Suppress
+#define __hidden __attribute__((visibility ("hidden")))
+
#define _MAKE_STR(x) #x
#define MAKE_STR(x) _MAKE_STR(x)
@@ -364,11 +366,14 @@ int kshark_handle_all_dpis(struct kshark_data_stream *stream,
__ok; \
}) \
-/** General purpose macro defining methods for adding plugin context. */
+/**
+ * General purpose macro defining methods for adding plugin context.
+ * Do not use this macro in header files.
+ */
#define KS_DEFINE_PLUGIN_CONTEXT(type) \
static type **__context_handler; \
static ssize_t __n_streams = -1; \
-static inline type *__init(int sd) \
+__hidden type *__init(int sd) \
{ \
type *obj; \
if (__n_streams < 0 && sd < KS_DEFAULT_NUM_STREAMS) { \
@@ -388,7 +393,7 @@ static inline type *__init(int sd) \
__context_handler[sd] = obj; \
return obj; \
} \
-static inline void __close(int sd) \
+__hidden void __close(int sd) \
{ \
if (sd < 0) { \
free(__context_handler); \
@@ -398,13 +403,22 @@ static inline void __close(int sd) \
free(__context_handler[sd]); \
__context_handler[sd] = NULL; \
} \
-static inline type *__get_context(int sd) \
+__hidden type *__get_context(int sd) \
{ \
if (sd < 0 || sd >= __n_streams) \
return NULL; \
return __context_handler[sd]; \
} \
+/**
+ * General purpose macro declaring the methods for adding plugin context.
+ * To be used in header files.
+ */
+#define KS_DECLARE_PLUGIN_CONTEXT_METHODS(type) \
+type *__init(int sd); \
+void __close(int sd); \
+type *__get_context(int sd); \
+
#ifdef __cplusplus
}
#endif // __cplusplus
@@ -73,6 +73,9 @@ int plugin_sched_get_prev_state(ks_num_field_t field)
return (field & mask) >> PREV_STATE_SHIFT;
}
+/** A general purpose macro is used to define plugin context. */
+KS_DEFINE_PLUGIN_CONTEXT(struct plugin_sched_context);
+
static bool plugin_sched_init_context(struct kshark_data_stream *stream,
struct plugin_sched_context *plugin_ctx)
{
@@ -53,8 +53,7 @@ struct plugin_sched_context {
struct kshark_data_container *sw_data;
};
-/** A general purpose macro is used to define plugin context. */
-KS_DEFINE_PLUGIN_CONTEXT(struct plugin_sched_context);
+KS_DECLARE_PLUGIN_CONTEXT_METHODS(struct plugin_sched_context)
/** The type of the data field stored in the kshark_data_container object. */
typedef int64_t ks_num_field_t;
The KS_DEFINE_PLUGIN_CONTEXT macro implements methods that are used to deal with plugin-specific context objects. However, when this macro is used in multiple plugins and those plugins are loaded together the symbol resolving fails, resulting in undefined behavior. Namely, version of the function from one plugin, being called by another plugin. Here we make sure that the methods defined in KS_DEFINE_PLUGIN_CONTEXT are not visible outside of the corresponding plugin. Fixing: 15df009 (kernel-shark: Add KS_DEFINE_PLUGIN_CONTEXT macro) Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com> --- src/libkshark-plugin.h | 22 ++++++++++++++++++---- src/plugins/sched_events.c | 3 +++ src/plugins/sched_events.h | 3 +-- 3 files changed, 22 insertions(+), 6 deletions(-)