1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
10 #include <cpp_interfaces/ie_task.hpp>
11 #include "cpp_interfaces/interface/ie_iinfer_async_request_internal.hpp"
12 #include "cpp_interfaces/impl/ie_infer_request_internal.hpp"
14 namespace InferenceEngine {
17 * @brief Wrapper of async request to support thread-safe execution.
19 class AsyncInferRequestThreadSafeInternal : public IAsyncInferRequestInternal {
20 bool _isRequestBusy = false;
21 std::mutex _isBusyMutex;
24 typedef std::shared_ptr<AsyncInferRequestThreadSafeInternal> Ptr;
26 AsyncInferRequestThreadSafeInternal() {
27 setIsRequestBusy(false);
31 virtual bool isRequestBusy() const {
32 return _isRequestBusy;
35 virtual void setIsRequestBusy(bool isBusy) {
36 std::unique_lock<std::mutex> lock(_isBusyMutex);
37 _isRequestBusy = isBusy;
41 void StartAsync() override {
42 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
43 setIsRequestBusy(true);
45 StartAsync_ThreadUnsafe();
47 setIsRequestBusy(false);
48 std::rethrow_exception(std::current_exception());
52 void GetUserData(void **data) override {
53 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
54 GetUserData_ThreadUnsafe(data);
57 void SetUserData(void *data) override {
58 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
59 SetUserData_ThreadUnsafe(data);
62 void SetCompletionCallback(IInferRequest::CompletionCallback callback) override {
63 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
64 SetCompletionCallback_ThreadUnsafe(callback);
67 void Infer() override {
68 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
69 setIsRequestBusy(true);
73 setIsRequestBusy(false);
74 std::rethrow_exception(std::current_exception());
76 setIsRequestBusy(false);
79 void GetPerformanceCounts(std::map<std::string, InferenceEngineProfileInfo> &perfMap) const override {
80 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
81 GetPerformanceCounts_ThreadUnsafe(perfMap);
84 void SetBlob(const char *name, const Blob::Ptr &data) override {
85 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
86 SetBlob_ThreadUnsafe(name, data);
89 void GetBlob(const char *name, Blob::Ptr &data) override {
90 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
91 GetBlob_ThreadUnsafe(name, data);
94 void SetBatch(int batch) override {
95 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
96 SetBatch_ThreadUnsafe(batch);
100 * @brief methods with _ThreadUnsafe prefix are to implement in plugins
101 * or in default wrapper (e.g. AsyncInferRequestThreadSafeDefault)
103 virtual void StartAsync_ThreadUnsafe() = 0;
105 virtual void GetUserData_ThreadUnsafe(void **data) = 0;
107 virtual void SetUserData_ThreadUnsafe(void *data) = 0;
109 virtual void SetCompletionCallback_ThreadUnsafe(IInferRequest::CompletionCallback callback) = 0;
111 virtual void Infer_ThreadUnsafe() = 0;
114 GetPerformanceCounts_ThreadUnsafe(std::map<std::string, InferenceEngineProfileInfo> &perfMap) const = 0;
116 virtual void SetBlob_ThreadUnsafe(const char *name, const Blob::Ptr &data) = 0;
118 virtual void GetBlob_ThreadUnsafe(const char *name, Blob::Ptr &data) = 0;
120 virtual void SetBatch_ThreadUnsafe(int batch) = 0;
123 } // namespace InferenceEngine