Exemplo n.º 1
0
        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...);
        }