diff --git a/openmp/libomptarget/include/omptarget.h b/openmp/libomptarget/include/omptarget.h index dd577e4051e21..4aab729190b9c 100644 --- a/openmp/libomptarget/include/omptarget.h +++ b/openmp/libomptarget/include/omptarget.h @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -244,12 +243,12 @@ class AsyncInfoTy { /// Check if all asynchronous operations are completed. /// - /// \note if the operations are completed, the registered post-processing - /// functions will be executed once and unregistered afterwards. + /// \note only a lightweight check. If needed, use synchronize() to query the + /// status of AsyncInfo before checking. /// /// \returns true if there is no pending asynchronous operations, false - /// otherwise. We return a null value in the case of an error from the plugin. - std::optional isDone(); + /// otherwise. + bool isDone() const; /// Add a new post-processing function to be executed after synchronization. /// diff --git a/openmp/libomptarget/src/interface.cpp b/openmp/libomptarget/src/interface.cpp index 45f499962e4d1..b155d09dcf8c7 100644 --- a/openmp/libomptarget/src/interface.cpp +++ b/openmp/libomptarget/src/interface.cpp @@ -412,12 +412,11 @@ EXTERN void __tgt_target_nowait_query(void **AsyncHandle) { if (QueryCounter.isAboveThreshold()) AsyncInfo->SyncType = AsyncInfoTy::SyncTy::BLOCKING; - auto DoneOrErr = AsyncInfo->isDone(); - if (!DoneOrErr) + if (const int Rc = AsyncInfo->synchronize()) FATAL_MESSAGE0(1, "Error while querying the async queue for completion.\n"); // If there are device operations still pending, return immediately without // deallocating the handle and increase the current thread query count. - if (!*DoneOrErr) { + if (!AsyncInfo->isDone()) { QueryCounter.increment(); return; } diff --git a/openmp/libomptarget/src/omptarget.cpp b/openmp/libomptarget/src/omptarget.cpp index 221ba949b8ebb..bbf1389429fef 100644 --- a/openmp/libomptarget/src/omptarget.cpp +++ b/openmp/libomptarget/src/omptarget.cpp @@ -51,13 +51,7 @@ void *&AsyncInfoTy::getVoidPtrLocation() { return BufferLocations.back(); } -std::optional AsyncInfoTy::isDone() { - if (synchronize() == OFFLOAD_FAIL) - return std::nullopt; - - // The async info operations are completed when the internal queue is empty. - return isQueueEmpty(); -} +bool AsyncInfoTy::isDone() const { return isQueueEmpty(); } int32_t AsyncInfoTy::runPostProcessing() { size_t Size = PostProcessingFunctions.size(); diff --git a/openmp/libomptarget/src/private.h b/openmp/libomptarget/src/private.h index fe55355e62187..9f156192e1036 100644 --- a/openmp/libomptarget/src/private.h +++ b/openmp/libomptarget/src/private.h @@ -250,13 +250,9 @@ class TaskAsyncInfoWrapperTy { if (AsyncInfo == &LocalAsyncInfo) return; - auto DoneOrErr = AsyncInfo->isDone(); - if (!DoneOrErr) - FATAL_MESSAGE0(1, - "Error while querying the async queue for completion.\n"); // If the are device operations still pending, return immediately without // deallocating the handle. - if (!*DoneOrErr) + if (!AsyncInfo->isDone()) return; // Delete the handle and unset it from the OpenMP task data.