@@ -66,7 +66,7 @@ ov::IAsyncInferRequest::IAsyncInferRequest(const std::shared_ptr<IInferRequest>&
6666void ov::IAsyncInferRequest::wait () {
6767 // Just use the last '_futures' member to wait pipeline completion
6868 auto future = [this ] {
69- std::lock_guard<std::mutex> lock{m_mutex};
69+ std::lock_guard lock{m_mutex};
7070 return m_futures.empty () ? std::shared_future<void >{} : m_futures.back ();
7171 }();
7272 if (future.valid ()) {
@@ -79,7 +79,7 @@ bool ov::IAsyncInferRequest::wait_for(const std::chrono::milliseconds& timeout)
7979
8080 // Just use the last '_futures' member to wait pipeline completion
8181 auto future = [this ] {
82- std::lock_guard<std::mutex> lock{m_mutex};
82+ std::lock_guard lock{m_mutex};
8383 return m_futures.empty () ? std::shared_future<void >{} : m_futures.back ();
8484 }();
8585
@@ -98,15 +98,15 @@ bool ov::IAsyncInferRequest::wait_for(const std::chrono::milliseconds& timeout)
9898}
9999
100100void ov::IAsyncInferRequest::cancel () {
101- std::lock_guard<std::mutex> lock{m_mutex};
101+ std::lock_guard lock{m_mutex};
102102 if (m_state == InferState::BUSY ) {
103103 m_state = InferState::CANCELLED ;
104104 }
105105}
106106
107107void ov::IAsyncInferRequest::set_callback (std::function<void (std::exception_ptr)> callback) {
108108 check_state ();
109- std::lock_guard callbackLock{m_callback_invoke_mutex };
109+ std::lock_guard lock{m_mutex };
110110 m_callback = std::move (callback);
111111}
112112
@@ -160,20 +160,27 @@ ov::threading::Task ov::IAsyncInferRequest::make_next_stage_task(
160160 if ((itEndStage == itNextStage) || (nullptr != currentException)) {
161161 auto lastStageTask = [this , currentException]() mutable {
162162 std::promise<void > promise;
163+ std::function<void (std::exception_ptr)> callback;
163164 {
164- std::lock_guard<std::mutex> lock{m_mutex};
165- m_state = InferState::IDLE ;
166- promise = std::move (m_promise);
167- }
168-
169- if (std::lock_guard callbackLock{m_callback_invoke_mutex}; m_callback) {
170- try {
171- m_callback (currentException);
172- } catch (...) {
173- currentException = std::current_exception ();
165+ std::lock_guard callbackLock{m_callback_invoke_mutex};
166+ {
167+ std::lock_guard lock{m_mutex};
168+ m_state = InferState::IDLE ;
169+ promise = std::move (m_promise);
170+ std::swap (callback, m_callback);
171+ }
172+ if (callback) {
173+ try {
174+ callback (currentException);
175+ } catch (...) {
176+ currentException = std::current_exception ();
177+ }
178+ std::lock_guard lock{m_mutex};
179+ if (!m_callback) {
180+ std::swap (callback, m_callback);
181+ }
174182 }
175183 }
176-
177184 if (nullptr == currentException) {
178185 promise.set_value ();
179186 } else {
@@ -248,10 +255,7 @@ void ov::IAsyncInferRequest::stop_and_wait() {
248255 std::lock_guard<std::mutex> lock{m_mutex};
249256 state = m_state;
250257 if (state != InferState::STOP ) {
251- {
252- std::lock_guard callbackLock{m_callback_invoke_mutex};
253- m_callback = {};
254- }
258+ m_callback = {};
255259 m_state = InferState::STOP ;
256260 futures = std::move (m_futures);
257261 }
0 commit comments