1313#include " event.hpp"
1414#include " event_pool.hpp"
1515#include " event_provider.hpp"
16+ #include " queue_api.hpp"
1617
1718#include " ../ur_interface_loader.hpp"
1819
@@ -24,6 +25,12 @@ ur_event_handle_t_::ur_event_handle_t_(
2425 zeTimerResolution(getDevice()->ZeDeviceProperties->timerResolution),
2526 timestampMaxValue(getDevice()->getTimestampMask()) {}
2627
28+ void ur_event_handle_t_::resetQueueAndCommand (ur_queue_handle_t hQueue,
29+ ur_command_t commandType) {
30+ this ->hQueue = hQueue;
31+ this ->commandType = commandType;
32+ }
33+
2734void ur_event_handle_t_::reset () {
2835 // consider make an abstraction for regular/counter based
2936 // events if there's more of this type of conditions
@@ -33,6 +40,8 @@ void ur_event_handle_t_::reset() {
3340}
3441
3542ze_event_handle_t ur_event_handle_t_::getZeEvent () const {
43+ assert (hQueue);
44+ assert (commandType != UR_COMMAND_FORCE_UINT32);
3645 return zeEvent.get ();
3746}
3847
@@ -41,14 +50,27 @@ ur_result_t ur_event_handle_t_::retain() {
4150 return UR_RESULT_SUCCESS;
4251}
4352
53+ ur_result_t ur_event_handle_t_::releaseDeferred () {
54+ assert (zeEventQueryStatus (zeEvent.get ()) == ZE_RESULT_SUCCESS);
55+ assert (RefCount.load () == 0 );
56+
57+ pool->free (this );
58+ return UR_RESULT_SUCCESS;
59+ }
60+
4461ur_result_t ur_event_handle_t_::release () {
4562 if (!RefCount.decrementAndTest ())
4663 return UR_RESULT_SUCCESS;
4764
65+ // Need to take a lock before checking if the event is timestamped.
66+ std::unique_lock<ur_shared_mutex> lock (Mutex);
67+
4868 if (isTimestamped () && adjustedEventEndTimestamp == 0 ) {
4969 // L0 will write end timestamp to this event some time in the future,
5070 // so we can't release it yet.
51- // TODO: delay releasing until the end timestamp is written.
71+
72+ assert (hQueue);
73+ hQueue->deferEventFree (this );
5274 return UR_RESULT_SUCCESS;
5375 }
5476
@@ -99,17 +121,16 @@ uint64_t ur_event_handle_t_::getEventEndTimestamp() {
99121 if (adjustedEventEndTimestamp)
100122 return adjustedEventEndTimestamp;
101123
102- // If the result is 0, we have not yet gotten results back and so we just
103- // return it.
104- if (recordEventEndTimestamp == 0 )
105- return recordEventEndTimestamp;
124+ auto status = zeEventQueryStatus (zeEvent.get ());
125+ if (status != ZE_RESULT_SUCCESS) {
126+ // profiling info not ready
127+ return 0 ;
128+ }
106129
107- // Now that we have the result, there is no need to keep it in the queue
108- // anymore, so we cache it on the event and evict the record from the
109- // queue.
110130 adjustedEventEndTimestamp =
111131 adjustEndEventTimestamp (getEventStartTimestmap (), recordEventEndTimestamp,
112132 timestampMaxValue, zeTimerResolution);
133+
113134 return adjustedEventEndTimestamp;
114135}
115136
@@ -118,13 +139,19 @@ void ur_event_handle_t_::recordStartTimestamp() {
118139 UR_CALL_THROWS (ur::level_zero::urDeviceGetGlobalTimestamps (
119140 getDevice (), &deviceStartTimestamp, nullptr ));
120141
142+ assert (adjustedEventStartTimestamp == 0 );
121143 adjustedEventStartTimestamp = deviceStartTimestamp;
122144}
123145
124- uint64_t *ur_event_handle_t_::getEventEndTimestampPtr () {
125- return &recordEventEndTimestamp;
146+ std::pair<uint64_t *, ze_event_handle_t >
147+ ur_event_handle_t_::getEventEndTimestampAndHandle () {
148+ return {&recordEventEndTimestamp, zeEvent.get ()};
126149}
127150
151+ ur_queue_handle_t ur_event_handle_t_::getQueue () const { return hQueue; }
152+
153+ ur_command_t ur_event_handle_t_::getCommandType () const { return commandType; }
154+
128155namespace ur ::level_zero {
129156ur_result_t urEventRetain (ur_event_handle_t hEvent) { return hEvent->retain (); }
130157
@@ -159,6 +186,19 @@ ur_result_t urEventGetInfo(ur_event_handle_t hEvent, ur_event_info_t propName,
159186 case UR_EVENT_INFO_REFERENCE_COUNT: {
160187 return returnValue (hEvent->RefCount .load ());
161188 }
189+ case UR_EVENT_INFO_COMMAND_QUEUE: {
190+ return returnValue (ur_queue_handle_t {hEvent->getQueue ()});
191+ }
192+ case UR_EVENT_INFO_CONTEXT: {
193+ ur_context_handle_t hContext;
194+ UR_CALL (::ur::level_zero::urQueueGetInfo (
195+ hEvent->getQueue (), UR_QUEUE_INFO_CONTEXT, sizeof (hContext),
196+ reinterpret_cast <void *>(&hContext), nullptr ));
197+ return returnValue (hContext);
198+ }
199+ case UR_EVENT_INFO_COMMAND_TYPE: {
200+ return returnValue (hEvent->getCommandType ());
201+ }
162202 default :
163203 logger::error (
164204 " Unsupported ParamName in urEventGetInfo: ParamName=ParamName={}(0x{})" ,
0 commit comments