@@ -116,6 +116,11 @@ void SimpleNativeMemoryMap::release(OnReleaseCompleteFn &&OnComplete,
116
116
OnComplete (hostOSMemoryRelease (Addr, SI->Size ));
117
117
}
118
118
119
+ void SimpleNativeMemoryMap::releaseMultiple (OnReleaseCompleteFn &&OnComplete,
120
+ std::vector<void *> Addrs) {
121
+ releaseNext (std::move (OnComplete), std::move (Addrs), false , Error::success ());
122
+ }
123
+
119
124
void SimpleNativeMemoryMap::finalize (OnFinalizeCompleteFn &&OnComplete,
120
125
FinalizeRequest FR) {
121
126
@@ -207,6 +212,12 @@ void SimpleNativeMemoryMap::deallocate(OnDeallocateCompleteFn &&OnComplete,
207
212
OnComplete (Error::success ());
208
213
}
209
214
215
+ void SimpleNativeMemoryMap::deallocateMultiple (
216
+ OnDeallocateCompleteFn &&OnComplete, std::vector<void *> Bases) {
217
+ deallocateNext (std::move (OnComplete), std::move (Bases), false ,
218
+ Error::success ());
219
+ }
220
+
210
221
void SimpleNativeMemoryMap::detach (ResourceManager::OnCompleteFn OnComplete) {
211
222
// Detach is a noop for now: we just retain all actions to run at shutdown
212
223
// time.
@@ -228,6 +239,64 @@ void SimpleNativeMemoryMap::shutdown(ResourceManager::OnCompleteFn OnComplete) {
228
239
shutdownNext (std::move (OnComplete), std::move (Bases));
229
240
}
230
241
242
+ void SimpleNativeMemoryMap::releaseNext (OnReleaseCompleteFn &&OnComplete,
243
+ std::vector<void *> Addrs,
244
+ bool AnyError, Error LastErr) {
245
+ // TODO: Log error?
246
+ if (LastErr) {
247
+ consumeError (std::move (LastErr));
248
+ AnyError |= true ;
249
+ }
250
+
251
+ if (Addrs.empty ()) {
252
+ if (!AnyError)
253
+ return OnComplete (Error::success ());
254
+
255
+ return OnComplete (
256
+ make_error<StringError>(" Failed to release some addresses" ));
257
+ }
258
+
259
+ void *NextAddr = Addrs.back ();
260
+ Addrs.pop_back ();
261
+
262
+ release (
263
+ [this , OnComplete = std::move (OnComplete), AnyError = AnyError,
264
+ Addrs = std::move (Addrs)](Error Err) mutable {
265
+ releaseNext (std::move (OnComplete), std::move (Addrs), AnyError,
266
+ std::move (Err));
267
+ },
268
+ NextAddr);
269
+ }
270
+
271
+ void SimpleNativeMemoryMap::deallocateNext (OnDeallocateCompleteFn &&OnComplete,
272
+ std::vector<void *> Addrs,
273
+ bool AnyError, Error LastErr) {
274
+ // TODO: Log error?
275
+ if (LastErr) {
276
+ consumeError (std::move (LastErr));
277
+ AnyError |= true ;
278
+ }
279
+
280
+ if (Addrs.empty ()) {
281
+ if (!AnyError)
282
+ return OnComplete (Error::success ());
283
+
284
+ return OnComplete (
285
+ make_error<StringError>(" Failed to deallocate some addresses" ));
286
+ }
287
+
288
+ void *NextAddr = Addrs.back ();
289
+ Addrs.pop_back ();
290
+
291
+ deallocate (
292
+ [this , OnComplete = std::move (OnComplete), AnyError = AnyError,
293
+ Addrs = std::move (Addrs)](Error Err) mutable {
294
+ deallocateNext (std::move (OnComplete), std::move (Addrs), AnyError,
295
+ std::move (Err));
296
+ },
297
+ NextAddr);
298
+ }
299
+
231
300
void SimpleNativeMemoryMap::shutdownNext (
232
301
ResourceManager::OnCompleteFn OnComplete, std::vector<void *> Bases) {
233
302
if (Bases.empty ())
@@ -303,14 +372,15 @@ ORC_RT_SPS_INTERFACE void orc_rt_SimpleNativeMemoryMap_reserve_sps_wrapper(
303
372
WrapperFunction::handleWithAsyncMethod (&SimpleNativeMemoryMap::reserve));
304
373
}
305
374
306
- ORC_RT_SPS_INTERFACE void orc_rt_SimpleNativeMemoryMap_release_sps_wrapper (
375
+ ORC_RT_SPS_INTERFACE void
376
+ orc_rt_SimpleNativeMemoryMap_releaseMultiple_sps_wrapper (
307
377
orc_rt_SessionRef Session, void *CallCtx,
308
378
orc_rt_WrapperFunctionReturn Return,
309
379
orc_rt_WrapperFunctionBuffer ArgBytes) {
310
- using Sig = SPSError (SPSExecutorAddr, SPSExecutorAddr);
311
- SPSWrapperFunction<Sig>::handle (
312
- Session, CallCtx, Return, ArgBytes,
313
- WrapperFunction::handleWithAsyncMethod ( &SimpleNativeMemoryMap::release ));
380
+ using Sig = SPSError (SPSExecutorAddr, SPSSequence< SPSExecutorAddr> );
381
+ SPSWrapperFunction<Sig>::handle (Session, CallCtx, Return, ArgBytes,
382
+ WrapperFunction::handleWithAsyncMethod (
383
+ &SimpleNativeMemoryMap::releaseMultiple ));
314
384
}
315
385
316
386
ORC_RT_SPS_INTERFACE void orc_rt_SimpleNativeMemoryMap_finalize_sps_wrapper (
@@ -324,14 +394,16 @@ ORC_RT_SPS_INTERFACE void orc_rt_SimpleNativeMemoryMap_finalize_sps_wrapper(
324
394
WrapperFunction::handleWithAsyncMethod (&SimpleNativeMemoryMap::finalize));
325
395
}
326
396
327
- ORC_RT_SPS_INTERFACE void orc_rt_SimpleNativeMemoryMap_deallocate_sps_wrapper (
397
+ ORC_RT_SPS_INTERFACE void
398
+ orc_rt_SimpleNativeMemoryMap_deallocateMultiple_sps_wrapper (
328
399
orc_rt_SessionRef Session, void *CallCtx,
329
400
orc_rt_WrapperFunctionReturn Return,
330
401
orc_rt_WrapperFunctionBuffer ArgBytes) {
331
- using Sig = SPSError (SPSExecutorAddr, SPSExecutorAddr);
332
- SPSWrapperFunction<Sig>::handle (Session, CallCtx, Return, ArgBytes,
333
- WrapperFunction::handleWithAsyncMethod (
334
- &SimpleNativeMemoryMap::deallocate));
402
+ using Sig = SPSError (SPSExecutorAddr, SPSSequence<SPSExecutorAddr>);
403
+ SPSWrapperFunction<Sig>::handle (
404
+ Session, CallCtx, Return, ArgBytes,
405
+ WrapperFunction::handleWithAsyncMethod (
406
+ &SimpleNativeMemoryMap::deallocateMultiple));
335
407
}
336
408
337
409
} // namespace orc_rt
0 commit comments