Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
280 changes: 173 additions & 107 deletions rlog/rlog.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

/*********************************************************************************
* Copyright (c) 2021 - 2024 Advanced Micro Devices, Inc. All rights reserved.
*
Expand All @@ -20,143 +21,208 @@
* THE SOFTWARE.
********************************************************************************/

#pragma once

#include <dlfcn.h>
namespace rlog {
#include <stdio.h>

// API functions -------------------------------------------------------------
void init();

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);
#ifdef __cplusplus
extern "C"
{
#endif

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

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

int registerActiveCallback(void (*cb)());
static inline void rlog_rangePop();

void setDefaultDomain(const char *);
void setDefaultCategory(const char *);
const char *getProperty(const char *domain, const char *property, const char *defaultValue);
static inline int rlog_registerActiveCallback(void (*cb)());

// END API functions ---------------------------------------------------------
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 --------------------------------------------------------

namespace {
const char *domain = "";
const char *category = "";
#ifdef __cplusplus
}
#endif

// 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;

// Static function pointers - ROCTX
void (*roctx_mark_) (const char* message) = NULL;
void (*roctx_rangePush_) (const char* message) = NULL;
void (*roctx_rangePop_) () = NULL;
} // namespace
#ifdef __cplusplus

namespace rlog
{

// C++ API functions -------------------------------------------------------------
static inline void init();

// Load library and look up symbols
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");
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);

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

static inline void rangePop();

static inline int registerActiveCallback(void (*cb)());

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

// END C++ API functions ---------------------------------------------------------

// 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;
}

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");
//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