Skip to content

Commit 1c356f2

Browse files
fix: return error when flush in waitForEvents return error
Signed-off-by: Maciej Plewka <[email protected]> Source: 33a3468
1 parent e4fe171 commit 1c356f2

File tree

2 files changed

+46
-26
lines changed

2 files changed

+46
-26
lines changed

opencl/source/event/event.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,10 @@ cl_int Event::waitForEvents(cl_uint numEvents,
715715
Event *event = castToObjectOrAbort<Event>(*it);
716716
if (event->cmdQueue) {
717717
if (event->taskLevel != CompletionStamp::notReady) {
718-
event->cmdQueue->flush();
718+
auto ret = event->cmdQueue->flush();
719+
if (ret != CL_SUCCESS) {
720+
return ret;
721+
}
719722
}
720723
}
721724
}

opencl/test/unit_test/event/event_tests.cpp

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -192,19 +192,21 @@ TEST(Event, givenCommandQueueWhenEventIsCreatedWithoutCommandQueueThenCommandQue
192192
EXPECT_EQ(intitialRefCount, finalRefCount);
193193
}
194194

195+
class MockCommandQueueWithFlushCheck : public MockCommandQueue {
196+
public:
197+
MockCommandQueueWithFlushCheck() = delete;
198+
MockCommandQueueWithFlushCheck(MockCommandQueueWithFlushCheck &) = delete;
199+
MockCommandQueueWithFlushCheck(Context &context, ClDevice *device) : MockCommandQueue(&context, device, nullptr, false) {
200+
}
201+
cl_int flush() override {
202+
flushCounter++;
203+
return flushReturnStatus;
204+
}
205+
cl_int flushReturnStatus = CL_SUCCESS;
206+
uint32_t flushCounter = 0;
207+
};
208+
195209
TEST(Event, WhenWaitingForEventsThenAllQueuesAreFlushed) {
196-
class MockCommandQueueWithFlushCheck : public MockCommandQueue {
197-
public:
198-
MockCommandQueueWithFlushCheck() = delete;
199-
MockCommandQueueWithFlushCheck(MockCommandQueueWithFlushCheck &) = delete;
200-
MockCommandQueueWithFlushCheck(Context &context, ClDevice *device) : MockCommandQueue(&context, device, nullptr, false) {
201-
}
202-
cl_int flush() override {
203-
flushCounter++;
204-
return CL_SUCCESS;
205-
}
206-
uint32_t flushCounter = 0;
207-
};
208210

209211
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr));
210212
MockContext context;
@@ -224,19 +226,6 @@ TEST(Event, WhenWaitingForEventsThenAllQueuesAreFlushed) {
224226
}
225227

226228
TEST(Event, GivenNotReadyEventWhenWaitingForEventsThenQueueIsNotFlushed) {
227-
class MockCommandQueueWithFlushCheck : public MockCommandQueue {
228-
public:
229-
MockCommandQueueWithFlushCheck() = delete;
230-
MockCommandQueueWithFlushCheck(MockCommandQueueWithFlushCheck &) = delete;
231-
MockCommandQueueWithFlushCheck(Context &context, ClDevice *device) : MockCommandQueue(&context, device, nullptr, false) {
232-
}
233-
cl_int flush() override {
234-
flushCounter++;
235-
return CL_SUCCESS;
236-
}
237-
uint32_t flushCounter = 0;
238-
};
239-
240229
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr));
241230
MockContext context;
242231

@@ -249,6 +238,34 @@ TEST(Event, GivenNotReadyEventWhenWaitingForEventsThenQueueIsNotFlushed) {
249238
EXPECT_EQ(0u, cmdQ1->flushCounter);
250239
}
251240

241+
TEST(Event, GivenEventWhenFlushReturnSuccessThenSuccessReturnedFromWaitForEvents) {
242+
243+
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr));
244+
MockContext context;
245+
246+
std::unique_ptr<MockCommandQueueWithFlushCheck> cmdQ1(new MockCommandQueueWithFlushCheck(context, device.get()));
247+
cmdQ1->flushReturnStatus = CL_SUCCESS;
248+
std::unique_ptr<Event> event1(new Event(cmdQ1.get(), CL_COMMAND_NDRANGE_KERNEL, 4, 10));
249+
250+
cl_event eventWaitlist[] = {event1.get()};
251+
252+
EXPECT_EQ(Event::waitForEvents(1, eventWaitlist), CL_SUCCESS);
253+
}
254+
255+
TEST(Event, GivenEventWhenFlushReturnErrorThenErrorReturnedFromWaitForEvents) {
256+
257+
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr));
258+
MockContext context;
259+
260+
std::unique_ptr<MockCommandQueueWithFlushCheck> cmdQ1(new MockCommandQueueWithFlushCheck(context, device.get()));
261+
cmdQ1->flushReturnStatus = CL_OUT_OF_RESOURCES;
262+
std::unique_ptr<Event> event1(new Event(cmdQ1.get(), CL_COMMAND_NDRANGE_KERNEL, 4, 10));
263+
264+
cl_event eventWaitlist[] = {event1.get()};
265+
266+
EXPECT_EQ(Event::waitForEvents(1, eventWaitlist), CL_OUT_OF_RESOURCES);
267+
}
268+
252269
TEST(Event, givenNotReadyEventOnWaitlistWhenCheckingUserEventDependeciesThenTrueIsReturned) {
253270
auto event1 = std::make_unique<Event>(nullptr, CL_COMMAND_NDRANGE_KERNEL, CompletionStamp::notReady, 0);
254271
cl_event eventWaitlist[] = {event1.get()};

0 commit comments

Comments
 (0)