5
5
#include < cstring>
6
6
#include < vector>
7
7
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
+
8
19
// Backend registry
9
20
#ifdef GGML_USE_CPU
10
21
#include " ggml-cpu.h"
@@ -90,7 +101,8 @@ struct ggml_backend_registry {
90
101
91
102
~ggml_backend_registry () {
92
103
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 );
94
106
}
95
107
}
96
108
@@ -115,6 +127,43 @@ struct ggml_backend_registry {
115
127
#endif
116
128
devices.push_back (device);
117
129
}
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
+ }
118
167
};
119
168
120
169
static ggml_backend_registry & get_reg () {
@@ -209,16 +258,6 @@ ggml_backend_t ggml_backend_init_best(void) {
209
258
return ggml_backend_dev_init (dev, nullptr );
210
259
}
211
260
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
-
222
261
typedef ggml_backend_reg_t (*ggml_backend_init_t )(void );
223
262
224
263
ggml_backend_reg_t ggml_backend_load (const char * path) {
@@ -264,33 +303,7 @@ ggml_backend_reg_t ggml_backend_load(const char * path) {
264
303
}
265
304
266
305
void 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 );
294
307
}
295
308
296
309
void ggml_backend_load_all () {
0 commit comments