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()18EventBuilder::~EventBuilder() { 19 UNRECOVERABLE_IF((this->event == nullptr) && ((parentEvents.size() != 0U))); 20 finalize(); 21 } 22 addParentEvent(Event & newParentEvent)23void 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)38void 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()46void 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()71void EventBuilder::clear() { 72 for (Event *parent : parentEvents) { 73 parent->decRefInternal(); 74 } 75 76 parentEvents.clear(); 77 } 78 } // namespace NEO 79