@@ -116,6 +116,11 @@ void SimpleNativeMemoryMap::release(OnReleaseCompleteFn &&OnComplete,
116116 OnComplete (hostOSMemoryRelease (Addr, SI->Size ));
117117}
118118
119+ void SimpleNativeMemoryMap::releaseMultiple (OnReleaseCompleteFn &&OnComplete,
120+ std::vector<void *> Addrs) {
121+ releaseNext (std::move (OnComplete), std::move (Addrs), false , Error::success ());
122+ }
123+
119124void SimpleNativeMemoryMap::finalize (OnFinalizeCompleteFn &&OnComplete,
120125 FinalizeRequest FR) {
121126
@@ -207,6 +212,12 @@ void SimpleNativeMemoryMap::deallocate(OnDeallocateCompleteFn &&OnComplete,
207212 OnComplete (Error::success ());
208213}
209214
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+
210221void SimpleNativeMemoryMap::detach (ResourceManager::OnCompleteFn OnComplete) {
211222 // Detach is a noop for now: we just retain all actions to run at shutdown
212223 // time.
@@ -228,6 +239,64 @@ void SimpleNativeMemoryMap::shutdown(ResourceManager::OnCompleteFn OnComplete) {
228239 shutdownNext (std::move (OnComplete), std::move (Bases));
229240}
230241
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+
231300void SimpleNativeMemoryMap::shutdownNext (
232301 ResourceManager::OnCompleteFn OnComplete, std::vector<void *> Bases) {
233302 if (Bases.empty ())
@@ -303,14 +372,15 @@ ORC_RT_SPS_INTERFACE void orc_rt_SimpleNativeMemoryMap_reserve_sps_wrapper(
303372 WrapperFunction::handleWithAsyncMethod (&SimpleNativeMemoryMap::reserve));
304373}
305374
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 (
307377 orc_rt_SessionRef Session, void *CallCtx,
308378 orc_rt_WrapperFunctionReturn Return,
309379 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 ));
314384}
315385
316386ORC_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(
324394 WrapperFunction::handleWithAsyncMethod (&SimpleNativeMemoryMap::finalize));
325395}
326396
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 (
328399 orc_rt_SessionRef Session, void *CallCtx,
329400 orc_rt_WrapperFunctionReturn Return,
330401 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));
335407}
336408
337409} // namespace orc_rt
0 commit comments