1 /*
2  * Copyright (C) 2018-2021 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #include "opencl/source/event/event_builder.h"
9 
10 #include "shared/source/helpers/debug_helpers.h"
11 #include "shared/source/helpers/timestamp_packet.h"
12 
13 #include "opencl/source/api/cl_types.h"
14 #include "opencl/source/context/context.h"
15 #include "opencl/source/event/user_event.h"
16 
17 namespace NEO {
~EventBuilder()18 EventBuilder::~EventBuilder() {
19     UNRECOVERABLE_IF((this->event == nullptr) && ((parentEvents.size() != 0U)));
20     finalize();
21 }
22 
addParentEvent(Event & newParentEvent)23 void EventBuilder::addParentEvent(Event &newParentEvent) {
24     bool duplicate = false;
25     for (Event *parent : parentEvents) {
26         if (parent == &newParentEvent) {
27             duplicate = true;
28             break;
29         }
30     }
31 
32     if (!duplicate) {
33         newParentEvent.incRefInternal();
34         parentEvents.push_back(&newParentEvent);
35     }
36 }
37 
addParentEvents(ArrayRef<const cl_event> newParentEvents)38 void EventBuilder::addParentEvents(ArrayRef<const cl_event> newParentEvents) {
39     for (cl_event clEv : newParentEvents) {
40         auto neoEv = castToObject<Event>(clEv);
41         DEBUG_BREAK_IF(neoEv == nullptr);
42         addParentEvent(neoEv);
43     }
44 }
45 
finalize()46 void EventBuilder::finalize() {
47     if ((this->event == nullptr) || finalized) {
48         clear();
49         return;
50     }
51     if (parentEvents.size() != 0) {
52         UserEvent sentinel;
53         sentinel.addChild(*this->event);
54         for (Event *parent : parentEvents) {
55 
56             //do not add as child if:
57             //parent has no parents and is not blocked
58             if (!(parent->peekIsBlocked() == false && parent->taskLevel != CompletionStamp::notReady) ||
59                 (!parent->isEventWithoutCommand() && !parent->peekIsCmdSubmitted())) {
60                 parent->addChild(*this->event);
61             }
62         }
63         sentinel.setStatus(CL_COMPLETE);
64     }
65 
66     clear();
67 
68     finalized = true;
69 }
70 
clear()71 void EventBuilder::clear() {
72     for (Event *parent : parentEvents) {
73         parent->decRefInternal();
74     }
75 
76     parentEvents.clear();
77 }
78 } // namespace NEO
79