diff options
Diffstat (limited to 'offload/plugins-nextgen/common/src/PluginInterface.cpp')
-rw-r--r-- | offload/plugins-nextgen/common/src/PluginInterface.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/offload/plugins-nextgen/common/src/PluginInterface.cpp b/offload/plugins-nextgen/common/src/PluginInterface.cpp index bcc9179..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(); } |