Index: openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.h =================================================================== --- openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.h +++ openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.h @@ -70,17 +70,15 @@ /// Indicate whether there is queue. bool hasQueue() const { return (AsyncInfoPtr->Queue != nullptr); } - // Get a reference to the error associated with the asycnhronous operations - // related to the async info wrapper. - Error &getError() { return Err; } - /// Synchronize with the __tgt_async_info's pending operations if it's the - /// internal async info and return the error associated with the async - /// operations. This function must be called before destroying the object. - Error finalize(); + /// internal async info. The error associated to the aysnchronous operations + /// issued in this queue must be provided in \p Err. This function will return + /// any error associated with those pending operations or the synchronization + /// (if it was actually executed). This function must be called before + /// destroying the object and only once. + Error finalize(Error &Err); private: - Error Err; GenericDeviceTy &Device; __tgt_async_info LocalAsyncInfo; __tgt_async_info *AsyncInfoPtr; Index: openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.cpp =================================================================== --- openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.cpp +++ openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.cpp @@ -202,14 +202,10 @@ AsyncInfoWrapperTy::AsyncInfoWrapperTy(GenericDeviceTy &Device, __tgt_async_info *AsyncInfoPtr) - : Err(Plugin::success()), Device(Device), - AsyncInfoPtr(AsyncInfoPtr ? AsyncInfoPtr : &LocalAsyncInfo) { - // Mark the success as checked. Otherwise, it would produce an error when - // re-assigned another error value. - !Err; -} + : Device(Device), + AsyncInfoPtr(AsyncInfoPtr ? AsyncInfoPtr : &LocalAsyncInfo) {} -Error AsyncInfoWrapperTy::finalize() { +Error AsyncInfoWrapperTy::finalize(Error &Err) { assert(AsyncInfoPtr && "AsyncInfoWrapperTy already finalized"); // If we used a local async info object we want synchronous behavior. @@ -931,18 +927,16 @@ int64_t Size, __tgt_async_info *AsyncInfo) { AsyncInfoWrapperTy AsyncInfoWrapper(*this, AsyncInfo); - auto &Err = AsyncInfoWrapper.getError(); - Err = dataSubmitImpl(TgtPtr, HstPtr, Size, AsyncInfoWrapper); - return AsyncInfoWrapper.finalize(); + auto Err = dataSubmitImpl(TgtPtr, HstPtr, Size, AsyncInfoWrapper); + return AsyncInfoWrapper.finalize(Err); } Error GenericDeviceTy::dataRetrieve(void *HstPtr, const void *TgtPtr, int64_t Size, __tgt_async_info *AsyncInfo) { AsyncInfoWrapperTy AsyncInfoWrapper(*this, AsyncInfo); - auto &Err = AsyncInfoWrapper.getError(); - Err = dataRetrieveImpl(HstPtr, TgtPtr, Size, AsyncInfoWrapper); - return AsyncInfoWrapper.finalize(); + auto Err = dataRetrieveImpl(HstPtr, TgtPtr, Size, AsyncInfoWrapper); + return AsyncInfoWrapper.finalize(Err); } Error GenericDeviceTy::dataExchange(const void *SrcPtr, GenericDeviceTy &DstDev, @@ -950,9 +944,8 @@ __tgt_async_info *AsyncInfo) { AsyncInfoWrapperTy AsyncInfoWrapper(*this, AsyncInfo); - auto &Err = AsyncInfoWrapper.getError(); - Err = dataExchangeImpl(SrcPtr, DstDev, DstPtr, Size, AsyncInfoWrapper); - return AsyncInfoWrapper.finalize(); + auto Err = dataExchangeImpl(SrcPtr, DstDev, DstPtr, Size, AsyncInfoWrapper); + return AsyncInfoWrapper.finalize(Err); } Error GenericDeviceTy::launchKernel(void *EntryPtr, void **ArgPtrs, @@ -970,16 +963,15 @@ KernelArgs.NumTeams[0], KernelArgs.ThreadLimit[0], KernelArgs.Tripcount, AsyncInfoWrapper); - auto &Err = AsyncInfoWrapper.getError(); - Err = GenericKernel.launch(*this, ArgPtrs, ArgOffsets, KernelArgs, - AsyncInfoWrapper); + auto Err = GenericKernel.launch(*this, ArgPtrs, ArgOffsets, KernelArgs, + AsyncInfoWrapper); if (RecordReplay.isRecordingOrReplaying() && RecordReplay.isSaveOutputEnabled()) RecordReplay.saveKernelOutputInfo(GenericKernel.getName(), AsyncInfoWrapper); - return AsyncInfoWrapper.finalize(); + return AsyncInfoWrapper.finalize(Err); } Error GenericDeviceTy::initAsyncInfo(__tgt_async_info **AsyncInfoPtr) { @@ -989,9 +981,8 @@ AsyncInfoWrapperTy AsyncInfoWrapper(*this, *AsyncInfoPtr); - auto &Err = AsyncInfoWrapper.getError(); - Err = initAsyncInfoImpl(AsyncInfoWrapper); - return AsyncInfoWrapper.finalize(); + auto Err = initAsyncInfoImpl(AsyncInfoWrapper); + return AsyncInfoWrapper.finalize(Err); } Error GenericDeviceTy::initDeviceInfo(__tgt_device_info *DeviceInfo) { @@ -1017,17 +1008,15 @@ __tgt_async_info *AsyncInfo) { AsyncInfoWrapperTy AsyncInfoWrapper(*this, AsyncInfo); - auto &Err = AsyncInfoWrapper.getError(); - Err = recordEventImpl(EventPtr, AsyncInfoWrapper); - return AsyncInfoWrapper.finalize(); + auto Err = recordEventImpl(EventPtr, AsyncInfoWrapper); + return AsyncInfoWrapper.finalize(Err); } Error GenericDeviceTy::waitEvent(void *EventPtr, __tgt_async_info *AsyncInfo) { AsyncInfoWrapperTy AsyncInfoWrapper(*this, AsyncInfo); - auto &Err = AsyncInfoWrapper.getError(); - Err = waitEventImpl(EventPtr, AsyncInfoWrapper); - return AsyncInfoWrapper.finalize(); + auto Err = waitEventImpl(EventPtr, AsyncInfoWrapper); + return AsyncInfoWrapper.finalize(Err); } Error GenericDeviceTy::syncEvent(void *EventPtr) {