dlhandle: suppress DLL errors on Windows (#2389)

Signed-off-by: Jared Van Bortel <jared@nomic.ai>
This commit is contained in:
Jared Van Bortel 2024-05-31 16:33:40 -04:00 committed by GitHub
parent 4e89a9c44f
commit 8ba7ef4832
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 28 additions and 9 deletions

View File

@ -1,8 +1,11 @@
#include "dlhandle.h" #include "dlhandle.h"
#include <string>
#ifndef _WIN32 #ifndef _WIN32
# include <dlfcn.h> # include <dlfcn.h>
#else #else
# include <cassert>
# include <sstream> # include <sstream>
# define WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN
# ifndef NOMINMAX # ifndef NOMINMAX
@ -11,6 +14,7 @@
# include <windows.h> # include <windows.h>
#endif #endif
using namespace std::string_literals;
namespace fs = std::filesystem; namespace fs = std::filesystem;
@ -19,7 +23,7 @@ namespace fs = std::filesystem;
Dlhandle::Dlhandle(const fs::path &fpath) { Dlhandle::Dlhandle(const fs::path &fpath) {
chandle = dlopen(fpath.c_str(), RTLD_LAZY | RTLD_LOCAL); chandle = dlopen(fpath.c_str(), RTLD_LAZY | RTLD_LOCAL);
if (!chandle) { if (!chandle) {
throw Exception("dlopen(\"" + fpath.filename().string() + "\"): " + dlerror()); throw Exception("dlopen: "s + dlerror());
} }
} }
@ -34,13 +38,22 @@ void *Dlhandle::get_internal(const char *symbol) const {
#else // defined(_WIN32) #else // defined(_WIN32)
Dlhandle::Dlhandle(const fs::path &fpath) { Dlhandle::Dlhandle(const fs::path &fpath) {
auto afpath = fs::absolute(fpath); fs::path afpath = fs::absolute(fpath);
// Suppress the "Entry Point Not Found" dialog, caused by outdated nvcuda.dll from the GPU driver
UINT lastErrorMode = GetErrorMode();
UINT success = SetErrorMode(lastErrorMode | SEM_FAILCRITICALERRORS);
assert(success);
chandle = LoadLibraryExW(afpath.c_str(), NULL, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); chandle = LoadLibraryExW(afpath.c_str(), NULL, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
success = SetErrorMode(lastErrorMode);
assert(success);
if (!chandle) { if (!chandle) {
auto err = GetLastError(); DWORD err = GetLastError();
std::ostringstream ss; std::ostringstream ss;
ss << "LoadLibraryExW(\"" << fpath.filename().string() << "\") failed with error 0x" << std::hex << err; ss << "LoadLibraryExW failed with error 0x" << std::hex << err;
throw Exception(ss.str()); throw Exception(ss.str());
} }
} }

View File

@ -141,12 +141,18 @@ const std::vector<LLModel::Implementation> &LLModel::Implementation::implementat
if (!std::regex_search(p.stem().string(), re)) continue; if (!std::regex_search(p.stem().string(), re)) continue;
// Add to list if model implementation // Add to list if model implementation
Dlhandle dl;
try { try {
Dlhandle dl(p); dl = Dlhandle(p);
if (!isImplementation(dl)) } catch (const Dlhandle::Exception &e) {
continue; std::cerr << "Failed to load " << p.filename().string() << ": " << e.what() << "\n";
fres.emplace_back(Implementation(std::move(dl))); continue;
} catch (...) {} }
if (!isImplementation(dl)) {
std::cerr << "Not an implementation: " << p.filename().string() << "\n";
continue;
}
fres.emplace_back(Implementation(std::move(dl)));
} }
} }
}; };