From 056b13f9edbfc423c99b786f90bf44e08a0abad8 Mon Sep 17 00:00:00 2001 From: Ruban Kumar Date: Tue, 1 Oct 2024 15:30:28 +0000 Subject: [PATCH 1/2] fix duplicate symbol error --- rlog/rlog.h | 251 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 144 insertions(+), 107 deletions(-) diff --git a/rlog/rlog.h b/rlog/rlog.h index 63b0d22..951afb3 100644 --- a/rlog/rlog.h +++ b/rlog/rlog.h @@ -1,3 +1,4 @@ + /********************************************************************************* * Copyright (c) 2021 - 2024 Advanced Micro Devices, Inc. All rights reserved. * @@ -20,143 +21,179 @@ * THE SOFTWARE. ********************************************************************************/ +#pragma once + #include -namespace rlog { +#include - // API functions ------------------------------------------------------------- - void init(); +#ifdef __cplusplus - void mark(const char *domain, const char *category, const char *apiname, const char *args); - void mark(const char *category, const char *apiname, const char *args); - void mark(const char *apiname, const char *args); +namespace rlog +{ - void rangePush(const char *domain, const char *category, const char *apiname, const char *args); - void rangePush(const char *category, const char *apiname, const char *args); - void rangePush(const char *apiname, const char *args); + // C++ API functions ------------------------------------------------------------- + static inline void init(); - void rangePop(); + static inline void mark(const char *domain, const char *category, const char *apiname, const char *args); + static inline void mark(const char *category, const char *apiname, const char *args); + static inline void mark(const char *apiname, const char *args); - int registerActiveCallback(void (*cb)()); + static inline void rangePush(const char *domain, const char *category, const char *apiname, const char *args); + static inline void rangePush(const char *category, const char *apiname, const char *args); + static inline void rangePush(const char *apiname, const char *args); - void setDefaultDomain(const char *); - void setDefaultCategory(const char *); - const char *getProperty(const char *domain, const char *property, const char *defaultValue); + static inline void rangePop(); - // END API functions --------------------------------------------------------- + static inline int registerActiveCallback(void (*cb)()); -namespace { - const char *domain = ""; - const char *category = ""; + static inline void setDefaultDomain(const char *); + static inline void setDefaultCategory(const char *); + static inline const char *getProperty(const char *domain, const char *property, const char *defaultValue); - // Static function pointers - void (*log_mark_) (const char*, const char*, const char*) = NULL; - void (*log_rangePush_) (const char*, const char*, const char*) = NULL; - void (*log_rangePop_) () = NULL; - void (*registerActiveCallback_) (void (*cb)()) = NULL; + // END C++ API functions --------------------------------------------------------- - // Static function pointers - ROCTX - void (*roctx_mark_) (const char* message) = NULL; - void (*roctx_rangePush_) (const char* message) = NULL; - void (*roctx_rangePop_) () = NULL; -} // namespace + // Static data and function pointers to maintain state within C++ code. + namespace + { + const char *domain = ""; + const char *category = ""; + static void (*log_mark_)(const char *, const char *, const char *) = nullptr; + static void (*log_rangePush_)(const char *, const char *, const char *) = nullptr; + static void (*log_rangePop_)() = nullptr; + static void (*registerActiveCallback_)(void (*cb)()) = nullptr; + static void (*roctx_mark_)(const char *message) = nullptr; + static void (*roctx_rangePush_)(const char *message) = nullptr; + static void (*roctx_rangePop_)() = nullptr; + } -// Load library and look up symbols -void init() { + static inline void init() + { #if 0 - void (*dl) = dlopen("librlog.so", RTLD_LAZY); - if (dl) { - log_mark_ = (void (*)(const char*, const char*, const char*)) dlsym(dl, "log_mark"); - log_rangePush_ = (void (*)(const char*, const char*, const char*)) dlsym(dl, "log_rangePush"); - log_rangePop_ = (void (*)()) dlsym(dl, "log_rangePop"); - } + void *dl = dlopen("librlog.so", RTLD_LAZY); + if (dl) + { + log_mark_ = (void (*)(const char *, const char *, const char *))dlsym(dl, "log_mark"); + log_rangePush_ = (void (*)(const char *, const char *, const char *))dlsym(dl, "log_rangePush"); + log_rangePop_ = (void (*)())dlsym(dl, "log_rangePop"); + //TODO: debug prints, remove before merge + fprintf(stderr, "Info : librlog found\n"); + } + else #endif -#if 1 - void (*dltx) = dlopen("libroctx64.so", RTLD_LAZY); - if (dltx) { - roctx_mark_ = (void (*)(const char*)) dlsym(dltx, "roctxMarkA"); - roctx_rangePush_ = (void (*)(const char*)) dlsym(dltx, "roctxRangePushA"); - roctx_rangePop_ = (void (*)()) dlsym(dltx, "roctxRangePop"); + { + + void *dltx = dlopen("libroctx64.so", RTLD_LAZY); + if (dltx) + { + roctx_mark_ = (void (*)(const char *))dlsym(dltx, "roctxMarkA"); + if (!roctx_mark_) + fprintf(stderr, "Error : roctx_mark_ not set \n"); + roctx_rangePush_ = (void (*)(const char *))dlsym(dltx, "roctxRangePushA"); + if (!roctx_rangePush_) + fprintf(stderr, "Error : roctx_rangePush_ not set \n"); + roctx_rangePop_ = (void (*)())dlsym(dltx, "roctxRangePop"); + if (!roctx_rangePop_) + fprintf(stderr, "Error : roctx_rangePop_ not set \n"); + if (!roctx_mark_) + fprintf(stderr, "Error : roctx_mark_ not set \n"); + + //TODO: debug prints, remove before merge + fprintf(stderr, "Info : libroctx found\n"); + } + else + //TODO: debug prints, remove before merge + fprintf(stderr, "Warning : librlog & libroctx NOT found\n"); + } } -#endif -} -void mark(const char *domain, const char *category, const char *apiname, const char *args) -{ - if (log_mark_) - log_mark_(domain, apiname, args); - if (roctx_mark_) { - char buff[4096]; - snprintf(buff, 4096, "%s : %s : api = %s | %s", domain, category, apiname, args); - roctx_mark_(buff); + // Inline function implementations + static inline void mark(const char *domain, const char *category, const char *apiname, const char *args) + { + if (log_mark_) + log_mark_(domain, apiname, args); + if (roctx_mark_) + { + char buff[4096]; + snprintf(buff, 4096, "%s : %s : api = %s | %s", domain, category, apiname, args); + roctx_mark_(buff); + } } -} -void mark(const char *category, const char *apiname, const char *args) -{ - mark(domain, category, apiname, args); -} - -void mark(const char *apiname, const char *args) -{ - mark(domain, category, apiname, args); -} + static inline void mark(const char *category, const char *apiname, const char *args) + { + mark(domain, category, apiname, args); + } -void rangePush(const char *domain, const char *category, const char *apiname, const char *args) -{ - if (log_rangePush_) - log_rangePush_(domain, apiname, args); - if (roctx_rangePush_) { - char buff[4096]; - snprintf(buff, 4096, "%s : %s : api = %s | %s", domain, category, apiname, args); - roctx_rangePush_(buff); + static inline void mark(const char *apiname, const char *args) + { + mark(domain, category, apiname, args); } -} -void rangePush(const char *category, const char *apiname, const char *args) -{ - rangePush(domain, category, apiname, args); -} + static inline void rangePush(const char *domain, const char *category, const char *apiname, const char *args) + { + fprintf(stderr, "RK Test rangePush \n"); + + if (log_rangePush_) + log_rangePush_(domain, apiname, args); + + if (roctx_rangePush_) + { + fprintf(stderr, "RK Test roctx_rangePush_ \n"); + char buff[4096]; + snprintf(buff, 4096, "%s : %s : api = %s | %s", domain, category, apiname, args); + roctx_rangePush_(buff); + } + else + fprintf(stderr, "Error roctx_rangePush_ not set \n"); + } -void rangePush(const char *apiname, const char *args) -{ - rangePush(domain, category, apiname, args); -} + static inline void rangePush(const char *category, const char *apiname, const char *args) + { + rangePush(domain, category, apiname, args); + } -void rangePop() -{ - if (log_rangePop_) - log_rangePop_(); - if (roctx_rangePop_) - roctx_rangePop_(); -} + static inline void rangePush(const char *apiname, const char *args) + { + rangePush(domain, category, apiname, args); + } + static inline void rangePop() + { + if (log_rangePop_) + log_rangePop_(); + if (roctx_rangePop_) + roctx_rangePop_(); + } -int registerActiveCallback(void (*cb)()) -{ - if (registerActiveCallback_) { - registerActiveCallback_(cb); - return 0; + static inline int registerActiveCallback(void (*cb)()) + { + if (registerActiveCallback_) + { + registerActiveCallback_(cb); + return 0; + } + else + return -1; } - else - return -1; -} -void setDefaultDomain(const char* ddomain) -{ - domain = ddomain; -} + static inline void setDefaultDomain(const char *ddomain) + { + domain = ddomain; + } -void setDefaultCategory(const char* dcat) -{ - category = dcat; -} + static inline void setDefaultCategory(const char *dcat) + { + category = dcat; + } -// FIXME: lifetime -const char *getProperty(const char *domain, const char *property, const char *defaultValue) -{ - return defaultValue; -} + // FIXME: lifetime + static inline const char *getProperty(const char *domain, const char *property, const char *defaultValue) + { + return defaultValue; + } } // namespace rlog + +#endif // __cplusplus \ No newline at end of file From b2f3d29b1fe31edb03ba8bf16b0ba9fa63438631 Mon Sep 17 00:00:00 2001 From: Ruban Kumar Date: Tue, 1 Oct 2024 15:31:37 +0000 Subject: [PATCH 2/2] Add C API definitions --- rlog/rlog.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/rlog/rlog.h b/rlog/rlog.h index 951afb3..a9462bd 100644 --- a/rlog/rlog.h +++ b/rlog/rlog.h @@ -26,6 +26,35 @@ #include #include + +#ifdef __cplusplus +extern "C" +{ +#endif + + // C API functions ------------------------------------------------------------ + static inline void rlog_markFull(const char *domain, const char *category, const char *apiname, const char *args); + static inline void rlog_markCategory(const char *category, const char *apiname, const char *args); + static inline void rlog_markArgs(const char *apiname, const char *args); + + static inline void rlog_rangePushFull(const char *domain, const char *category, const char *apiname, const char *args); + static inline void rlog_rangePushCategory(const char *category, const char *apiname, const char *args); + static inline void rlog_rangePushArgs(const char *apiname, const char *args); + + static inline void rlog_rangePop(); + + static inline int rlog_registerActiveCallback(void (*cb)()); + + static inline void rlog_setDefaultDomain(const char *ddomain); + static inline void rlog_setDefaultCategory(const char *dcat); + static inline const char *rlog_getProperty(const char *domain, const char *property, const char *defaultValue); + // END C API functions -------------------------------------------------------- + +#ifdef __cplusplus +} +#endif + + #ifdef __cplusplus namespace rlog