@@ -200,12 +200,29 @@ struct RecordReplayTy {
200
200
201
201
} RecordReplay;
202
202
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
+
204
215
// If we used a local async info object we want synchronous behavior.
205
216
// In that case, and assuming the current status code is OK, we will
206
217
// synchronize explicitly when the object is deleted.
207
218
if (AsyncInfoPtr == &LocalAsyncInfo && LocalAsyncInfo.Queue && !Err)
208
219
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);
209
226
}
210
227
211
228
Error GenericKernelTy::init (GenericDeviceTy &GenericDevice,
@@ -912,35 +929,37 @@ Error GenericDeviceTy::dataDelete(void *TgtPtr, TargetAllocTy Kind) {
912
929
913
930
Error GenericDeviceTy::dataSubmit (void *TgtPtr, const void *HstPtr,
914
931
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 ();
917
935
Err = dataSubmitImpl (TgtPtr, HstPtr, Size, AsyncInfoWrapper);
918
- return Err ;
936
+ return AsyncInfoWrapper. finalize () ;
919
937
}
920
938
921
939
Error GenericDeviceTy::dataRetrieve (void *HstPtr, const void *TgtPtr,
922
940
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 ();
925
944
Err = dataRetrieveImpl (HstPtr, TgtPtr, Size, AsyncInfoWrapper);
926
- return Err ;
945
+ return AsyncInfoWrapper. finalize () ;
927
946
}
928
947
929
948
Error GenericDeviceTy::dataExchange (const void *SrcPtr, GenericDeviceTy &DstDev,
930
949
void *DstPtr, int64_t Size,
931
950
__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 ();
934
954
Err = dataExchangeImpl (SrcPtr, DstDev, DstPtr, Size, AsyncInfoWrapper);
935
- return Err ;
955
+ return AsyncInfoWrapper. finalize () ;
936
956
}
937
957
938
958
Error GenericDeviceTy::launchKernel (void *EntryPtr, void **ArgPtrs,
939
959
ptrdiff_t *ArgOffsets,
940
960
KernelArgsTy &KernelArgs,
941
961
__tgt_async_info *AsyncInfo) {
942
- auto Err = Plugin::success ();
943
- AsyncInfoWrapperTy AsyncInfoWrapper (Err, *this , AsyncInfo);
962
+ AsyncInfoWrapperTy AsyncInfoWrapper (*this , AsyncInfo);
944
963
945
964
GenericKernelTy &GenericKernel =
946
965
*reinterpret_cast <GenericKernelTy *>(EntryPtr);
@@ -951,6 +970,7 @@ Error GenericDeviceTy::launchKernel(void *EntryPtr, void **ArgPtrs,
951
970
KernelArgs.NumTeams [0 ], KernelArgs.ThreadLimit [0 ], KernelArgs.Tripcount ,
952
971
AsyncInfoWrapper);
953
972
973
+ auto &Err = AsyncInfoWrapper.getError ();
954
974
Err = GenericKernel.launch (*this , ArgPtrs, ArgOffsets, KernelArgs,
955
975
AsyncInfoWrapper);
956
976
@@ -959,18 +979,19 @@ Error GenericDeviceTy::launchKernel(void *EntryPtr, void **ArgPtrs,
959
979
RecordReplay.saveKernelOutputInfo (GenericKernel.getName (),
960
980
AsyncInfoWrapper);
961
981
962
- return Err ;
982
+ return AsyncInfoWrapper. finalize () ;
963
983
}
964
984
965
985
Error GenericDeviceTy::initAsyncInfo (__tgt_async_info **AsyncInfoPtr) {
966
986
assert (AsyncInfoPtr && " Invalid async info" );
967
987
968
988
*AsyncInfoPtr = new __tgt_async_info ();
969
989
970
- auto Err = Plugin::success ();
971
- AsyncInfoWrapperTy AsyncInfoWrapper (Err, *this , *AsyncInfoPtr);
990
+ AsyncInfoWrapperTy AsyncInfoWrapper (*this , *AsyncInfoPtr);
991
+
992
+ auto &Err = AsyncInfoWrapper.getError ();
972
993
Err = initAsyncInfoImpl (AsyncInfoWrapper);
973
- return Err ;
994
+ return AsyncInfoWrapper. finalize () ;
974
995
}
975
996
976
997
Error GenericDeviceTy::initDeviceInfo (__tgt_device_info *DeviceInfo) {
@@ -994,17 +1015,19 @@ Error GenericDeviceTy::destroyEvent(void *EventPtr) {
994
1015
995
1016
Error GenericDeviceTy::recordEvent (void *EventPtr,
996
1017
__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 ();
999
1021
Err = recordEventImpl (EventPtr, AsyncInfoWrapper);
1000
- return Err ;
1022
+ return AsyncInfoWrapper. finalize () ;
1001
1023
}
1002
1024
1003
1025
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 ();
1006
1029
Err = waitEventImpl (EventPtr, AsyncInfoWrapper);
1007
- return Err ;
1030
+ return AsyncInfoWrapper. finalize () ;
1008
1031
}
1009
1032
1010
1033
Error GenericDeviceTy::syncEvent (void *EventPtr) {
0 commit comments