af_err call(const char* symbolName, CalleeArgs... args) { if (!activeHandle) return AF_ERR_LOAD_LIB; typedef af_err(*af_func)(CalleeArgs...); af_func funcHandle; #if defined(OS_WIN) funcHandle = (af_func)GetProcAddress(activeHandle, symbolName); #else funcHandle = (af_func)dlsym(activeHandle, symbolName); #endif if (!funcHandle) { return AF_ERR_LOAD_SYM; } return funcHandle(args...); }
af_err call(const char* symbolName, CalleeArgs... args) { typedef af_err(*af_func)(CalleeArgs...); if (!activeHandle) { UNIFIED_ERROR_LOAD_LIB(); } thread_local std::array<std::unordered_map<const char*, af_func>, NUM_BACKENDS> funcHandles; int index = backend_index(getActiveBackend()); af_func& funcHandle = funcHandles[index][symbolName]; if (!funcHandle) { AF_TRACE("Loading: {}", symbolName); funcHandle = (af_func)common::getFunctionPointer(activeHandle, symbolName); } if (!funcHandle) { AF_TRACE("Failed to load symbol: {}", symbolName); std::string str = "Failed to load symbol: "; str += symbolName; AF_RETURN_ERROR(str.c_str(), AF_ERR_LOAD_SYM); } return funcHandle(args...); }