21 #include "rdk_moca_hal.h"
24 __attribute__((constructor(200))) void pRMH_APIWRAP_Initialize() {
25 strncpy( hRMHGeneric_APIList.apiListName,
"All APIs",
sizeof(hRMHGeneric_APIList.apiListName));
26 hRMHGeneric_APIList.apiListSize=0;
28 strncpy( hRMHGeneric_SoCUnimplementedAPIList.apiListName,
"Unimplemented APIs",
sizeof(hRMHGeneric_SoCUnimplementedAPIList.apiListName));
29 hRMHGeneric_SoCUnimplementedAPIList.apiListSize=0;
30 hRMHGeneric_APITags.tagListSize=0;
33 int pRMH_APIWRAP_Compare(
const void* a,
const void* b) {
36 return strcasecmp(_a->apiName, _b->apiName);
40 __attribute__((constructor(400))) void pRMH_APIWRAP_Finalize() {
42 qsort(hRMHGeneric_APIList.apiList, hRMHGeneric_APIList.apiListSize,
sizeof(
RMH_API*), pRMH_APIWRAP_Compare);
46 void pRMH_APIWRAP_PreAPIExecute(
const RMH_Handle handle,
const char *api,
const bool socEnabled,
const bool socBeforeGeneric) {
48 RMH_PrintTrace(
"+++++ Enter %s [%s] ++++\n", api, !socEnabled ?
"Generic Only" :
49 socBeforeGeneric ?
"SoC Before Generic" :
"SoC After Generic");
50 gettimeofday(&handle->startTime, NULL);
54 RMH_Result pRMH_APIWRAP_PostAPIExecute(
const RMH_Handle handle,
const char *api,
const RMH_Result genRet,
const RMH_Result socRet) {
56 struct timeval stopTime;
57 RMH_Result ret = (socRet == RMH_SUCCESS) ? genRet : socRet;
58 gettimeofday(&stopTime, NULL);
59 elapsedTime = (stopTime.tv_sec - handle->startTime.tv_sec) * 1000.0;
60 elapsedTime += (stopTime.tv_usec - handle->startTime.tv_usec) / 1000.0;
61 RMH_PrintTrace(
"------ Exit %s [%s] -- [Time: %.02fms] ----\n", api,
RMH_ResultToString(ret), elapsedTime);
67 RMH_Result pRMH_APIWRAP_GetSoCAPI(
const RMH_Handle handle,
const char *apiName, RMH_Result (**apiFunc)()) {
68 RMH_Result ret=RMH_UNIMPLEMENTED;
70 char *dlErr = dlerror();
71 *apiFunc=dlsym(handle->soclib, apiName);
74 RMH_PrintTrace(
"Error for '%s' in dlopen: '%s'\n", apiName, dlErr);
77 RMH_PrintTrace(
"Located SoC API '%s' at 0x%p\n", apiName, *apiFunc);
81 RMH_PrintTrace(
"Located SoC API '%s' at 0x%p but SoC library is not initialized!\n", apiName, *apiFunc);
82 ret = RMH_INVALID_INTERNAL_STATE;
86 RMH_PrintTrace(
"Unable to find SoC implementation of '%s'\n", apiName);
93 void pRMH_APIWRAP_RegisterAPI(
RMH_API *api) {
94 if (hRMHGeneric_APIList.apiListSize >= RMH_MAX_NUM_APIS) {
95 fprintf(stderr,
"ERROR: Unable to expose API %s! Increase the size of RMH_MAX_NUM_APIS\n", api->apiName);
98 hRMHGeneric_APIList.apiList[hRMHGeneric_APIList.apiListSize++]=api;
110 #undef RMH_API_IMPLEMENTATION_SOC_ONLY
111 #undef RMH_API_IMPLEMENTATION_GENERIC_ONLY
112 #undef RMH_API_IMPLEMENTATION_SOC_THEN_GENERIC
113 #undef RMH_API_IMPLEMENTATION_GENERIC_THEN_SOC
115 #define RMH_API_IMPLEMENTATION_SOC_ONLY(DECLARATION, API_NAME, DESCRIPTION_STR, PARAMS_LIST, WRAP_API, TAGS_STR) \
116 __RMH_API_WRAP_##WRAP_API(DECLARATION, API_NAME, DESCRIPTION_STR, PARAMS_LIST, TAGS_STR, false, true, false);
118 #define RMH_API_IMPLEMENTATION_GENERIC_ONLY(DECLARATION, API_NAME, DESCRIPTION_STR, PARAMS_LIST, WRAP_API, TAGS_STR) \
119 __RMH_API_WRAP_##WRAP_API(DECLARATION, API_NAME, DESCRIPTION_STR, PARAMS_LIST, TAGS_STR, true, false, false);
121 #define RMH_API_IMPLEMENTATION_SOC_THEN_GENERIC(DECLARATION, API_NAME, DESCRIPTION_STR, PARAMS_LIST, WRAP_API, TAGS_STR) \
122 __RMH_API_WRAP_##WRAP_API(DECLARATION, API_NAME, DESCRIPTION_STR, PARAMS_LIST, TAGS_STR, true, true, true);
124 #define RMH_API_IMPLEMENTATION_GENERIC_THEN_SOC(DECLARATION, API_NAME, DESCRIPTION_STR, PARAMS_LIST, WRAP_API, TAGS_STR) \
125 __RMH_API_WRAP_##WRAP_API(DECLARATION, API_NAME, DESCRIPTION_STR, PARAMS_LIST, TAGS_STR, true, true, false);
127 #include "librmh_wrap.h"