1 // Copyright (C) 2018 Intel Corporation
3 // SPDX-License-Identifier: Apache-2.0
11 #include <cpp_interfaces/ie_task.hpp>
12 #include "cpp_interfaces/interface/ie_iinfer_async_request_internal.hpp"
13 #include "cpp_interfaces/impl/ie_infer_request_internal.hpp"
15 namespace InferenceEngine {
18 * @brief Wrapper of async request to support thread-safe execution.
20 class AsyncInferRequestThreadSafeInternal : public IAsyncInferRequestInternal {
21 bool _isRequestBusy = false;
22 std::mutex _isBusyMutex;
25 typedef std::shared_ptr<AsyncInferRequestThreadSafeInternal> Ptr;
27 AsyncInferRequestThreadSafeInternal() {
28 setIsRequestBusy(false);
32 virtual bool isRequestBusy() const {
33 return _isRequestBusy;
36 virtual void setIsRequestBusy(bool isBusy) {
37 std::unique_lock<std::mutex> lock(_isBusyMutex);
38 _isRequestBusy = isBusy;
42 void StartAsync() override {
43 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
44 setIsRequestBusy(true);
46 StartAsync_ThreadUnsafe();
48 setIsRequestBusy(false);
49 std::rethrow_exception(std::current_exception());
53 void GetUserData(void **data) override {
54 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
55 GetUserData_ThreadUnsafe(data);
58 void SetUserData(void *data) override {
59 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
60 SetUserData_ThreadUnsafe(data);
63 void SetCompletionCallback(IInferRequest::CompletionCallback callback) override {
64 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
65 SetCompletionCallback_ThreadUnsafe(callback);
68 void Infer() override {
69 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
70 setIsRequestBusy(true);
74 setIsRequestBusy(false);
75 std::rethrow_exception(std::current_exception());
77 setIsRequestBusy(false);
80 void GetPerformanceCounts(std::map<std::string, InferenceEngineProfileInfo> &perfMap) const override {
81 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
82 GetPerformanceCounts_ThreadUnsafe(perfMap);
85 void SetBlob(const char *name, const Blob::Ptr &data) override {
86 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
87 SetBlob_ThreadUnsafe(name, data);
90 void GetBlob(const char *name, Blob::Ptr &data) override {
91 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
92 GetBlob_ThreadUnsafe(name, data);
95 void SetBatch(int batch) override {
96 if (isRequestBusy()) THROW_IE_EXCEPTION << REQUEST_BUSY_str;
97 SetBatch_ThreadUnsafe(batch);
101 * @brief methods with _ThreadUnsafe prefix are to implement in plugins
102 * or in default wrapper (e.g. AsyncInferRequestThreadSafeDefault)
104 virtual void StartAsync_ThreadUnsafe() = 0;
106 virtual void GetUserData_ThreadUnsafe(void **data) = 0;
108 virtual void SetUserData_ThreadUnsafe(void *data) = 0;
110 virtual void SetCompletionCallback_ThreadUnsafe(IInferRequest::CompletionCallback callback) = 0;
112 virtual void Infer_ThreadUnsafe() = 0;
115 GetPerformanceCounts_ThreadUnsafe(std::map<std::string, InferenceEngineProfileInfo> &perfMap) const = 0;
117 virtual void SetBlob_ThreadUnsafe(const char *name, const Blob::Ptr &data) = 0;
119 virtual void GetBlob_ThreadUnsafe(const char *name, Blob::Ptr &data) = 0;
121 virtual void SetBatch_ThreadUnsafe(int batch) = 0;
124 } // namespace InferenceEngine