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 <string>
#ifndef _WIN32
# include <dlfcn.h>
#else
# include <cassert>
# include <sstream>
# define WIN32_LEAN_AND_MEAN
# ifndef NOMINMAX
@ -11,6 +14,7 @@
# include <windows.h>
#endif
using namespace std::string_literals;
namespace fs = std::filesystem;
@ -19,7 +23,7 @@ namespace fs = std::filesystem;
Dlhandle::Dlhandle(const fs::path &fpath) {
chandle = dlopen(fpath.c_str(), RTLD_LAZY | RTLD_LOCAL);
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)
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);
success = SetErrorMode(lastErrorMode);
assert(success);
if (!chandle) {
auto err = GetLastError();
DWORD err = GetLastError();
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());
}
}

View File

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