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,10 @@ ur_event_handle_t_::ur_event_handle_t_(
2425 zeTimerResolution(getDevice()->ZeDeviceProperties->timerResolution),
2526 timestampMaxValue(getDevice()->getTimestampMask()) {}
2627
28+ void ur_event_handle_t_::resetQueue (ur_queue_handle_t hQueue) {
29+ this ->hQueue = hQueue;
30+ }
31+
2732void ur_event_handle_t_::reset () {
2833 // consider make an abstraction for regular/counter based
2934 // events if there's more of this type of conditions
@@ -33,6 +38,7 @@ void ur_event_handle_t_::reset() {
3338}
3439
3540ze_event_handle_t ur_event_handle_t_::getZeEvent () const {
41+ assert (hQueue);
3642 return zeEvent.get ();
3743}
3844
@@ -41,14 +47,27 @@ ur_result_t ur_event_handle_t_::retain() {
4147 return UR_RESULT_SUCCESS;
4248}
4349
50+ ur_result_t ur_event_handle_t_::releaseDeferred () {
51+ assert (zeEventQueryStatus (zeEvent.get ()) == ZE_RESULT_SUCCESS);
52+ assert (RefCount.load () == 0 );
53+
54+ pool->free (this );
55+ return UR_RESULT_SUCCESS;
56+ }
57+
4458ur_result_t ur_event_handle_t_::release () {
4559 if (!RefCount.decrementAndTest ())
4660 return UR_RESULT_SUCCESS;
4761
62+ // Need to take a lock before checking if the event is timestamped.
63+ std::unique_lock<ur_shared_mutex> lock (Mutex);
64+
4865 if (isTimestamped () && adjustedEventEndTimestamp == 0 ) {
4966 // L0 will write end timestamp to this event some time in the future,
5067 // so we can't release it yet.
51- // TODO: delay releasing until the end timestamp is written.
68+
69+ assert (hQueue);
70+ hQueue->deferEventFree (this );
5271 return UR_RESULT_SUCCESS;
5372 }
5473
@@ -99,17 +118,16 @@ uint64_t ur_event_handle_t_::getEventEndTimestamp() {
99118 if (adjustedEventEndTimestamp)
100119 return adjustedEventEndTimestamp;
101120
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;
121+ auto status = zeEventQueryStatus (zeEvent.get ());
122+ if (status != ZE_RESULT_SUCCESS) {
123+ // profiling info not ready
124+ return 0 ;
125+ }
106126
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.
110127 adjustedEventEndTimestamp =
111128 adjustEndEventTimestamp (getEventStartTimestmap (), recordEventEndTimestamp,
112129 timestampMaxValue, zeTimerResolution);
130+
113131 return adjustedEventEndTimestamp;
114132}
115133
@@ -118,11 +136,13 @@ void ur_event_handle_t_::recordStartTimestamp() {
118136 UR_CALL_THROWS (ur::level_zero::urDeviceGetGlobalTimestamps (
119137 getDevice (), &deviceStartTimestamp, nullptr ));
120138
139+ assert (adjustedEventStartTimestamp == 0 );
121140 adjustedEventStartTimestamp = deviceStartTimestamp;
122141}
123142
124- uint64_t *ur_event_handle_t_::getEventEndTimestampPtr () {
125- return &recordEventEndTimestamp;
143+ std::pair<uint64_t *, ze_event_handle_t >
144+ ur_event_handle_t_::getEventEndTimestampAndHandle () {
145+ return {&recordEventEndTimestamp, zeEvent.get ()};
126146}
127147
128148namespace ur ::level_zero {
0 commit comments