fix: return error when flush in waitForEvents return error

Signed-off-by: Maciej Plewka <maciej.plewka@intel.com>
This commit is contained in:
Maciej Plewka
2024-09-23 13:43:32 +00:00
committed by Compute-Runtime-Automation
parent 4b3a6e9cfe
commit 33a346838e
2 changed files with 46 additions and 26 deletions

View File

@@ -715,7 +715,10 @@ cl_int Event::waitForEvents(cl_uint numEvents,
Event *event = castToObjectOrAbort<Event>(*it);
if (event->cmdQueue) {
if (event->taskLevel != CompletionStamp::notReady) {
event->cmdQueue->flush();
auto ret = event->cmdQueue->flush();
if (ret != CL_SUCCESS) {
return ret;
}
}
}
}

View File

@@ -192,19 +192,21 @@ TEST(Event, givenCommandQueueWhenEventIsCreatedWithoutCommandQueueThenCommandQue
EXPECT_EQ(intitialRefCount, finalRefCount);
}
class MockCommandQueueWithFlushCheck : public MockCommandQueue {
public:
MockCommandQueueWithFlushCheck() = delete;
MockCommandQueueWithFlushCheck(MockCommandQueueWithFlushCheck &) = delete;
MockCommandQueueWithFlushCheck(Context &context, ClDevice *device) : MockCommandQueue(&context, device, nullptr, false) {
}
cl_int flush() override {
flushCounter++;
return flushReturnStatus;
}
cl_int flushReturnStatus = CL_SUCCESS;
uint32_t flushCounter = 0;
};
TEST(Event, WhenWaitingForEventsThenAllQueuesAreFlushed) {
class MockCommandQueueWithFlushCheck : public MockCommandQueue {
public:
MockCommandQueueWithFlushCheck() = delete;
MockCommandQueueWithFlushCheck(MockCommandQueueWithFlushCheck &) = delete;
MockCommandQueueWithFlushCheck(Context &context, ClDevice *device) : MockCommandQueue(&context, device, nullptr, false) {
}
cl_int flush() override {
flushCounter++;
return CL_SUCCESS;
}
uint32_t flushCounter = 0;
};
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr));
MockContext context;
@@ -224,19 +226,6 @@ TEST(Event, WhenWaitingForEventsThenAllQueuesAreFlushed) {
}
TEST(Event, GivenNotReadyEventWhenWaitingForEventsThenQueueIsNotFlushed) {
class MockCommandQueueWithFlushCheck : public MockCommandQueue {
public:
MockCommandQueueWithFlushCheck() = delete;
MockCommandQueueWithFlushCheck(MockCommandQueueWithFlushCheck &) = delete;
MockCommandQueueWithFlushCheck(Context &context, ClDevice *device) : MockCommandQueue(&context, device, nullptr, false) {
}
cl_int flush() override {
flushCounter++;
return CL_SUCCESS;
}
uint32_t flushCounter = 0;
};
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr));
MockContext context;
@@ -249,6 +238,34 @@ TEST(Event, GivenNotReadyEventWhenWaitingForEventsThenQueueIsNotFlushed) {
EXPECT_EQ(0u, cmdQ1->flushCounter);
}
TEST(Event, GivenEventWhenFlushReturnSuccessThenSuccessReturnedFromWaitForEvents) {
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr));
MockContext context;
std::unique_ptr<MockCommandQueueWithFlushCheck> cmdQ1(new MockCommandQueueWithFlushCheck(context, device.get()));
cmdQ1->flushReturnStatus = CL_SUCCESS;
std::unique_ptr<Event> event1(new Event(cmdQ1.get(), CL_COMMAND_NDRANGE_KERNEL, 4, 10));
cl_event eventWaitlist[] = {event1.get()};
EXPECT_EQ(Event::waitForEvents(1, eventWaitlist), CL_SUCCESS);
}
TEST(Event, GivenEventWhenFlushReturnErrorThenErrorReturnedFromWaitForEvents) {
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr));
MockContext context;
std::unique_ptr<MockCommandQueueWithFlushCheck> cmdQ1(new MockCommandQueueWithFlushCheck(context, device.get()));
cmdQ1->flushReturnStatus = CL_OUT_OF_RESOURCES;
std::unique_ptr<Event> event1(new Event(cmdQ1.get(), CL_COMMAND_NDRANGE_KERNEL, 4, 10));
cl_event eventWaitlist[] = {event1.get()};
EXPECT_EQ(Event::waitForEvents(1, eventWaitlist), CL_OUT_OF_RESOURCES);
}
TEST(Event, givenNotReadyEventOnWaitlistWhenCheckingUserEventDependeciesThenTrueIsReturned) {
auto event1 = std::make_unique<Event>(nullptr, CL_COMMAND_NDRANGE_KERNEL, CompletionStamp::notReady, 0);
cl_event eventWaitlist[] = {event1.get()};