Skip to content

Commit 8dad7f4

Browse files
committed
[OpenMP][libomptarget] Do not rely on AsyncInfoWrapperTy's destructor
1 parent 273f736 commit 8dad7f4

File tree

2 files changed

+62
-33
lines changed

2 files changed

+62
-33
lines changed

openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.cpp

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,29 @@ struct RecordReplayTy {
200200

201201
} RecordReplay;
202202

203-
AsyncInfoWrapperTy::~AsyncInfoWrapperTy() {
203+
AsyncInfoWrapperTy::AsyncInfoWrapperTy(GenericDeviceTy &Device,
204+
__tgt_async_info *AsyncInfoPtr)
205+
: Err(Plugin::success()), Device(Device),
206+
AsyncInfoPtr(AsyncInfoPtr ? AsyncInfoPtr : &LocalAsyncInfo) {
207+
// Mark the success as checked. Otherwise, it would produce an error when
208+
// re-assigned another error value.
209+
!Err;
210+
}
211+
212+
Error AsyncInfoWrapperTy::finalize() {
213+
assert(AsyncInfoPtr && "AsyncInfoWrapperTy already finalized");
214+
204215
// If we used a local async info object we want synchronous behavior.
205216
// In that case, and assuming the current status code is OK, we will
206217
// synchronize explicitly when the object is deleted.
207218
if (AsyncInfoPtr == &LocalAsyncInfo && LocalAsyncInfo.Queue && !Err)
208219
Err = Device.synchronize(&LocalAsyncInfo);
220+
221+
// Invalidate the wrapper object.
222+
AsyncInfoPtr = nullptr;
223+
224+
// Return the error associated to the async operations and the synchronize.
225+
return std::move(Err);
209226
}
210227

211228
Error GenericKernelTy::init(GenericDeviceTy &GenericDevice,
@@ -912,35 +929,37 @@ Error GenericDeviceTy::dataDelete(void *TgtPtr, TargetAllocTy Kind) {
912929

913930
Error GenericDeviceTy::dataSubmit(void *TgtPtr, const void *HstPtr,
914931
int64_t Size, __tgt_async_info *AsyncInfo) {
915-
auto Err = Plugin::success();
916-
AsyncInfoWrapperTy AsyncInfoWrapper(Err, *this, AsyncInfo);
932+
AsyncInfoWrapperTy AsyncInfoWrapper(*this, AsyncInfo);
933+
934+
auto &Err = AsyncInfoWrapper.getError();
917935
Err = dataSubmitImpl(TgtPtr, HstPtr, Size, AsyncInfoWrapper);
918-
return Err;
936+
return AsyncInfoWrapper.finalize();
919937
}
920938

921939
Error GenericDeviceTy::dataRetrieve(void *HstPtr, const void *TgtPtr,
922940
int64_t Size, __tgt_async_info *AsyncInfo) {
923-
auto Err = Plugin::success();
924-
AsyncInfoWrapperTy AsyncInfoWrapper(Err, *this, AsyncInfo);
941+
AsyncInfoWrapperTy AsyncInfoWrapper(*this, AsyncInfo);
942+
943+
auto &Err = AsyncInfoWrapper.getError();
925944
Err = dataRetrieveImpl(HstPtr, TgtPtr, Size, AsyncInfoWrapper);
926-
return Err;
945+
return AsyncInfoWrapper.finalize();
927946
}
928947

929948
Error GenericDeviceTy::dataExchange(const void *SrcPtr, GenericDeviceTy &DstDev,
930949
void *DstPtr, int64_t Size,
931950
__tgt_async_info *AsyncInfo) {
932-
auto Err = Plugin::success();
933-
AsyncInfoWrapperTy AsyncInfoWrapper(Err, *this, AsyncInfo);
951+
AsyncInfoWrapperTy AsyncInfoWrapper(*this, AsyncInfo);
952+
953+
auto &Err = AsyncInfoWrapper.getError();
934954
Err = dataExchangeImpl(SrcPtr, DstDev, DstPtr, Size, AsyncInfoWrapper);
935-
return Err;
955+
return AsyncInfoWrapper.finalize();
936956
}
937957

938958
Error GenericDeviceTy::launchKernel(void *EntryPtr, void **ArgPtrs,
939959
ptrdiff_t *ArgOffsets,
940960
KernelArgsTy &KernelArgs,
941961
__tgt_async_info *AsyncInfo) {
942-
auto Err = Plugin::success();
943-
AsyncInfoWrapperTy AsyncInfoWrapper(Err, *this, AsyncInfo);
962+
AsyncInfoWrapperTy AsyncInfoWrapper(*this, AsyncInfo);
944963

945964
GenericKernelTy &GenericKernel =
946965
*reinterpret_cast<GenericKernelTy *>(EntryPtr);
@@ -951,6 +970,7 @@ Error GenericDeviceTy::launchKernel(void *EntryPtr, void **ArgPtrs,
951970
KernelArgs.NumTeams[0], KernelArgs.ThreadLimit[0], KernelArgs.Tripcount,
952971
AsyncInfoWrapper);
953972

973+
auto &Err = AsyncInfoWrapper.getError();
954974
Err = GenericKernel.launch(*this, ArgPtrs, ArgOffsets, KernelArgs,
955975
AsyncInfoWrapper);
956976

@@ -959,18 +979,19 @@ Error GenericDeviceTy::launchKernel(void *EntryPtr, void **ArgPtrs,
959979
RecordReplay.saveKernelOutputInfo(GenericKernel.getName(),
960980
AsyncInfoWrapper);
961981

962-
return Err;
982+
return AsyncInfoWrapper.finalize();
963983
}
964984

965985
Error GenericDeviceTy::initAsyncInfo(__tgt_async_info **AsyncInfoPtr) {
966986
assert(AsyncInfoPtr && "Invalid async info");
967987

968988
*AsyncInfoPtr = new __tgt_async_info();
969989

970-
auto Err = Plugin::success();
971-
AsyncInfoWrapperTy AsyncInfoWrapper(Err, *this, *AsyncInfoPtr);
990+
AsyncInfoWrapperTy AsyncInfoWrapper(*this, *AsyncInfoPtr);
991+
992+
auto &Err = AsyncInfoWrapper.getError();
972993
Err = initAsyncInfoImpl(AsyncInfoWrapper);
973-
return Err;
994+
return AsyncInfoWrapper.finalize();
974995
}
975996

976997
Error GenericDeviceTy::initDeviceInfo(__tgt_device_info *DeviceInfo) {
@@ -994,17 +1015,19 @@ Error GenericDeviceTy::destroyEvent(void *EventPtr) {
9941015

9951016
Error GenericDeviceTy::recordEvent(void *EventPtr,
9961017
__tgt_async_info *AsyncInfo) {
997-
auto Err = Plugin::success();
998-
AsyncInfoWrapperTy AsyncInfoWrapper(Err, *this, AsyncInfo);
1018+
AsyncInfoWrapperTy AsyncInfoWrapper(*this, AsyncInfo);
1019+
1020+
auto &Err = AsyncInfoWrapper.getError();
9991021
Err = recordEventImpl(EventPtr, AsyncInfoWrapper);
1000-
return Err;
1022+
return AsyncInfoWrapper.finalize();
10011023
}
10021024

10031025
Error GenericDeviceTy::waitEvent(void *EventPtr, __tgt_async_info *AsyncInfo) {
1004-
auto Err = Plugin::success();
1005-
AsyncInfoWrapperTy AsyncInfoWrapper(Err, *this, AsyncInfo);
1026+
AsyncInfoWrapperTy AsyncInfoWrapper(*this, AsyncInfo);
1027+
1028+
auto &Err = AsyncInfoWrapper.getError();
10061029
Err = waitEventImpl(EventPtr, AsyncInfoWrapper);
1007-
return Err;
1030+
return AsyncInfoWrapper.finalize();
10081031
}
10091032

10101033
Error GenericDeviceTy::syncEvent(void *EventPtr) {

openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.h

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,14 @@ struct GenericDeviceTy;
4848
/// Class that wraps the __tgt_async_info to simply its usage. In case the
4949
/// object is constructed without a valid __tgt_async_info, the object will use
5050
/// an internal one and will synchronize the current thread with the pending
51-
/// operations on object destruction.
51+
/// operations when calling AsyncInfoWrapperTy::finalize(). This latter function
52+
/// must be called before destroying the wrapper object.
5253
struct AsyncInfoWrapperTy {
53-
AsyncInfoWrapperTy(Error &Err, GenericDeviceTy &Device,
54-
__tgt_async_info *AsyncInfoPtr)
55-
: Err(Err), ErrOutParam(&Err), Device(Device),
56-
AsyncInfoPtr(AsyncInfoPtr ? AsyncInfoPtr : &LocalAsyncInfo) {}
54+
AsyncInfoWrapperTy(GenericDeviceTy &Device, __tgt_async_info *AsyncInfoPtr);
5755

58-
/// Synchronize with the __tgt_async_info's pending operations if it's the
59-
/// internal one.
60-
~AsyncInfoWrapperTy();
56+
~AsyncInfoWrapperTy() {
57+
assert(!AsyncInfoPtr && "AsyncInfoWrapperTy not finalized");
58+
}
6159

6260
/// Get the raw __tgt_async_info pointer.
6361
operator __tgt_async_info *() const { return AsyncInfoPtr; }
@@ -72,12 +70,20 @@ struct AsyncInfoWrapperTy {
7270
/// Indicate whether there is queue.
7371
bool hasQueue() const { return (AsyncInfoPtr->Queue != nullptr); }
7472

73+
// Get a reference to the error associated with the asycnhronous operations
74+
// related to the async info wrapper.
75+
Error &getError() { return Err; }
76+
77+
/// Synchronize with the __tgt_async_info's pending operations if it's the
78+
/// internal async info and return the error associated with the async
79+
/// operations. This function must be called before destroying the object.
80+
Error finalize();
81+
7582
private:
76-
Error &Err;
77-
ErrorAsOutParameter ErrOutParam;
83+
Error Err;
7884
GenericDeviceTy &Device;
7985
__tgt_async_info LocalAsyncInfo;
80-
__tgt_async_info *const AsyncInfoPtr;
86+
__tgt_async_info *AsyncInfoPtr;
8187
};
8288

8389
/// Class wrapping a __tgt_device_image and its offload entry table on a

0 commit comments

Comments
 (0)