diff options
Diffstat (limited to 'offload/plugins-nextgen/common/src')
-rw-r--r-- | offload/plugins-nextgen/common/src/PluginInterface.cpp | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/offload/plugins-nextgen/common/src/PluginInterface.cpp b/offload/plugins-nextgen/common/src/PluginInterface.cpp index 0a57046..083d416 100644 --- a/offload/plugins-nextgen/common/src/PluginInterface.cpp +++ b/offload/plugins-nextgen/common/src/PluginInterface.cpp @@ -1335,18 +1335,25 @@ Error PinnedAllocationMapTy::unlockUnmappedHostBuffer(void *HstPtr) { return eraseEntry(*Entry); } -Error GenericDeviceTy::synchronize(__tgt_async_info *AsyncInfo) { - if (!AsyncInfo || !AsyncInfo->Queue) - return Plugin::error(ErrorCode::INVALID_ARGUMENT, - "invalid async info queue"); +Error GenericDeviceTy::synchronize(__tgt_async_info *AsyncInfo, + bool ReleaseQueue) { + SmallVector<void *> AllocsToDelete{}; + { + std::lock_guard<std::mutex> AllocationGuard{AsyncInfo->Mutex}; - if (auto Err = synchronizeImpl(*AsyncInfo)) - return Err; + if (!AsyncInfo || !AsyncInfo->Queue) + return Plugin::error(ErrorCode::INVALID_ARGUMENT, + "invalid async info queue"); + + if (auto Err = synchronizeImpl(*AsyncInfo, ReleaseQueue)) + return Err; + + std::swap(AllocsToDelete, AsyncInfo->AssociatedAllocations); + } - for (auto *Ptr : AsyncInfo->AssociatedAllocations) + for (auto *Ptr : AllocsToDelete) if (auto Err = dataDelete(Ptr, TargetAllocTy::TARGET_ALLOC_DEVICE)) return Err; - AsyncInfo->AssociatedAllocations.clear(); return Plugin::success(); } @@ -1626,6 +1633,21 @@ Error GenericDeviceTy::waitEvent(void *EventPtr, __tgt_async_info *AsyncInfo) { return Err; } +Expected<bool> GenericDeviceTy::hasPendingWork(__tgt_async_info *AsyncInfo) { + AsyncInfoWrapperTy AsyncInfoWrapper(*this, AsyncInfo); + auto Res = hasPendingWorkImpl(AsyncInfoWrapper); + if (auto Err = Res.takeError()) { + AsyncInfoWrapper.finalize(Err); + return Err; + } + + auto Err = Plugin::success(); + AsyncInfoWrapper.finalize(Err); + if (Err) + return Err; + return Res; +} + Error GenericDeviceTy::syncEvent(void *EventPtr) { return syncEventImpl(EventPtr); } |