Publishing R3
[platform/upstream/dldt.git] / inference-engine / src / hetero_plugin / hetero_async_infer_request.cpp
1 // Copyright (C) 2018 Intel Corporation
2 //
3 // SPDX-License-Identifier: Apache-2.0
4 //
5
6 #include "hetero_async_infer_request.h"
7 #include <assert.h>
8 #include <ie_util_internal.hpp>
9 #include <ie_profiling.hpp>
10
11 using namespace HeteroPlugin;
12 using namespace InferenceEngine;
13
14 HeteroAsyncInferRequest::HeteroAsyncInferRequest(HeteroInferRequest::Ptr request,
15                                                  const ITaskExecutor::Ptr &taskExecutor,
16                                                  const TaskSynchronizer::Ptr &taskSynchronizer,
17                                                  const ITaskExecutor::Ptr &callbackExecutor)
18         : AsyncInferRequestThreadSafeDefault(request, taskExecutor, taskSynchronizer, callbackExecutor),
19           _heteroInferRequest(request) {
20     _heteroInferRequest->setCallbackSequence();
21
22     std::function<void(InferRequest, StatusCode)> f =
23         [&](InferRequest /*request*/, StatusCode /*sts*/) {
24             setIsRequestBusy(false);
25         };
26
27     _heteroInferRequest->setCallbackForLastRequest(f);
28 }
29
30 void HeteroAsyncInferRequest::StartAsync() {
31     IE_PROFILING_AUTO_SCOPE(Hetero_Async)
32     if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
33     setIsRequestBusy(true);
34     _heteroInferRequest->updateInOutIfNeeded();
35     _heteroInferRequest->startFirstAsyncRequest();
36 }
37
38 InferenceEngine::StatusCode HeteroAsyncInferRequest::Wait(int64_t millis_timeout) {
39     auto sts = _heteroInferRequest->waitAllRequests(millis_timeout);
40     if (sts != StatusCode::RESULT_NOT_READY && sts != StatusCode::REQUEST_BUSY) {
41         setIsRequestBusy(false);
42     }
43     return sts;
44 }
45
46 void HeteroAsyncInferRequest::SetCompletionCallback(IInferRequest::CompletionCallback callback) {
47     AsyncInferRequestThreadSafeDefault::SetCompletionCallback(callback);
48
49     std::function<void(InferRequest, StatusCode)> f =
50             [&](InferRequest /*request*/, StatusCode sts) {
51                 setIsRequestBusy(false);
52                 _callbackManager.set_requestStatus(sts);
53                 _callbackManager.runCallback();
54             };
55
56     _heteroInferRequest->setCallbackForLastRequest(f);
57 }