55#include < cstring>
66#include < vector>
77
8+ #ifdef _WIN32
9+ # define WIN32_LEAN_AND_MEAN
10+ # ifndef NOMINMAX
11+ # define NOMINMAX
12+ # endif
13+ # include < windows.h>
14+ #else
15+ # include < dlfcn.h>
16+ #endif
17+
18+
819// Backend registry
920#ifdef GGML_USE_CPU
1021#include " ggml-cpu.h"
@@ -90,7 +101,8 @@ struct ggml_backend_registry {
90101
91102 ~ggml_backend_registry () {
92103 while (!backends.empty ()) {
93- ggml_backend_unload (backends.back ().reg );
104+ // use silent since the log system may have been destroyed at this point
105+ unload_backend (backends.back ().reg , true );
94106 }
95107 }
96108
@@ -115,6 +127,43 @@ struct ggml_backend_registry {
115127#endif
116128 devices.push_back (device);
117129 }
130+
131+ void unload_backend (ggml_backend_reg_t reg, bool silent) {
132+ if (!silent) {
133+ GGML_LOG_INFO (" %s: unloading %s backend\n " , __func__, ggml_backend_reg_name (reg));
134+ }
135+ auto it = std::find_if (backends.begin (), backends.end (),
136+ [reg](ggml_backend_reg_entry entry) { return entry.reg == reg; });
137+
138+ if (it == backends.end ()) {
139+ if (!silent) {
140+ GGML_LOG_ERROR (" %s: backend not found\n " , __func__);
141+ }
142+ return ;
143+ }
144+
145+ if (!silent) {
146+ GGML_LOG_DEBUG (" %s: unloading %s backend\n " , __func__, ggml_backend_reg_name (reg));
147+ }
148+
149+ // remove devices
150+ devices.erase (
151+ std::remove_if (devices.begin (), devices.end (),
152+ [reg](ggml_backend_dev_t dev) { return ggml_backend_dev_backend_reg (dev) == reg; }),
153+ devices.end ());
154+
155+ // unload library
156+ if (it->handle ) {
157+ #ifdef _WIN32
158+ FreeLibrary ((HMODULE) it->handle );
159+ #else
160+ dlclose (it->handle );
161+ #endif
162+ }
163+
164+ // remove backend
165+ backends.erase (it);
166+ }
118167};
119168
120169static ggml_backend_registry & get_reg () {
@@ -209,16 +258,6 @@ ggml_backend_t ggml_backend_init_best(void) {
209258 return ggml_backend_dev_init (dev, nullptr );
210259}
211260
212- #ifdef _WIN32
213- # define WIN32_LEAN_AND_MEAN
214- # ifndef NOMINMAX
215- # define NOMINMAX
216- # endif
217- # include < windows.h>
218- #else
219- # include < dlfcn.h>
220- #endif
221-
222261typedef ggml_backend_reg_t (*ggml_backend_init_t )(void );
223262
224263ggml_backend_reg_t ggml_backend_load (const char * path) {
@@ -264,33 +303,7 @@ ggml_backend_reg_t ggml_backend_load(const char * path) {
264303}
265304
266305void ggml_backend_unload (ggml_backend_reg_t reg) {
267- auto it = std::find_if (get_reg ().backends .begin (), get_reg ().backends .end (),
268- [reg](ggml_backend_reg_entry entry) { return entry.reg == reg; });
269-
270- if (it == get_reg ().backends .end ()) {
271- GGML_LOG_ERROR (" %s: backend not found\n " , __func__);
272- return ;
273- }
274-
275- GGML_LOG_DEBUG (" %s: unloading %s backend\n " , __func__, ggml_backend_reg_name (reg));
276-
277- // remove devices
278- get_reg ().devices .erase (
279- std::remove_if (get_reg ().devices .begin (), get_reg ().devices .end (),
280- [reg](ggml_backend_dev_t dev) { return ggml_backend_dev_backend_reg (dev) == reg; }),
281- get_reg ().devices .end ());
282-
283- // unload library
284- if (it->handle ) {
285- #ifdef _WIN32
286- FreeLibrary ((HMODULE) it->handle );
287- #else
288- dlclose (it->handle );
289- #endif
290- }
291-
292- // remove backend
293- get_reg ().backends .erase (it);
306+ get_reg ().unload_backend (reg, true );
294307}
295308
296309void ggml_backend_load_all () {
0 commit comments