1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "server_executor/include/server_executor.h"
17
18 #include "protocol/data_channel/include/i_request.h"
19 #include "server_executor/include/future_factory.h"
20 #include "server_executor/include/i_future.h"
21
22 namespace OHOS {
23 namespace AI {
24 std::mutex ServerExecutor::mutex_;
25 ServerExecutor *ServerExecutor::instance_ = nullptr;
26
GetInstance()27 ServerExecutor *ServerExecutor::GetInstance()
28 {
29 CHK_RET(instance_ != nullptr, instance_);
30
31 std::lock_guard<std::mutex> lock(mutex_);
32 CHK_RET(instance_ != nullptr, instance_);
33
34 ServerExecutor *tempInstance = nullptr;
35 AIE_NEW(tempInstance, ServerExecutor);
36 CHK_RET(tempInstance == nullptr, nullptr);
37
38 if (tempInstance->Initialize() != RETCODE_SUCCESS) {
39 AIE_DELETE(tempInstance);
40 return nullptr;
41 }
42 instance_ = tempInstance;
43 return instance_;
44 }
45
ReleaseInstance()46 void ServerExecutor::ReleaseInstance()
47 {
48 std::lock_guard<std::mutex> lock(mutex_);
49 AIE_DELETE(instance_);
50 }
51
ServerExecutor()52 ServerExecutor::ServerExecutor() : engineMgr_(nullptr)
53 {
54 }
55
~ServerExecutor()56 ServerExecutor::~ServerExecutor()
57 {
58 Uninitialize();
59 }
60
Initialize()61 int ServerExecutor::Initialize()
62 {
63 AIE_NEW(engineMgr_, EngineManager);
64 if (engineMgr_ == nullptr) {
65 HILOGE("[ServerExecutor]Failed to new engine manager");
66 return RETCODE_OUT_OF_MEMORY;
67 }
68 int retCode = engineMgr_->Initialize();
69 if (retCode != RETCODE_SUCCESS) {
70 HILOGE("[ServerExecutor]Failed to initialize engine manager");
71 AIE_DELETE(engineMgr_);
72 }
73 return retCode;
74 }
75
Uninitialize()76 void ServerExecutor::Uninitialize()
77 {
78 AIE_DELETE(engineMgr_);
79 FutureFactory::ReleaseInstance();
80 }
81
StartEngine(long long transactionId,const AlgorithmInfo & algoInfo,const DataInfo & inputInfo,DataInfo & outputInfo)82 int ServerExecutor::StartEngine(long long transactionId, const AlgorithmInfo &algoInfo, const DataInfo &inputInfo,
83 DataInfo &outputInfo)
84 {
85 CHK_RET(engineMgr_ == nullptr, RETCODE_ENGINE_MANAGER_NOT_INIT);
86
87 HILOGI("[ServerExecutor]Begin to start engine for algorithm, algorithmType:%d.", algoInfo.algorithmType);
88 return engineMgr_->StartEngine(transactionId, algoInfo, inputInfo, outputInfo);
89 }
90
StopEngine(long long transactionId,const DataInfo & inputInfo)91 int ServerExecutor::StopEngine(long long transactionId, const DataInfo &inputInfo)
92 {
93 CHK_RET(engineMgr_ == nullptr, RETCODE_ENGINE_MANAGER_NOT_INIT);
94
95 HILOGI("[ServerExecutor]Begin to stop engine for algorithm.");
96 return engineMgr_->StopEngine(transactionId, inputInfo);
97 }
98
SetOption(long long transactionId,int optionType,const DataInfo & inputInfo)99 int ServerExecutor::SetOption(long long transactionId, int optionType, const DataInfo &inputInfo)
100 {
101 CHK_RET(engineMgr_ == nullptr, RETCODE_ENGINE_MANAGER_NOT_INIT);
102
103 HILOGI("[ServerExecutor]Begin to set option for algorithm.");
104 return engineMgr_->SetOption(transactionId, optionType, inputInfo);
105 }
106
GetOption(long long transactionId,int optionType,const DataInfo & inputInfo,DataInfo & outputInfo)107 int ServerExecutor::GetOption(long long transactionId, int optionType, const DataInfo &inputInfo,
108 DataInfo &outputInfo)
109 {
110 CHK_RET(engineMgr_ == nullptr, RETCODE_ENGINE_MANAGER_NOT_INIT);
111
112 HILOGI("[ServerExecutor]Begin to get option for algorithm.");
113 return engineMgr_->GetOption(transactionId, optionType, inputInfo, outputInfo);
114 }
115
SyncExecute(IRequest * request,IResponse * & response)116 int ServerExecutor::SyncExecute(IRequest *request, IResponse *&response)
117 {
118 CHK_RET(engineMgr_ == nullptr, RETCODE_ENGINE_MANAGER_NOT_INIT);
119 CHK_RET(request == nullptr, RETCODE_NULL_PARAM);
120 HILOGI("[ServerExecutor]Begin to call SyncExecute, algoType:%d.", request->GetAlgoPluginType());
121
122 std::shared_ptr<Engine> engine = engineMgr_->FindEngine(request->GetTransactionId());
123 CHK_RET(engine == nullptr, RETCODE_ENGINE_NOT_EXIST);
124
125 return engine->SyncExecute(request, response);
126 }
127
AsyncExecute(IRequest * request)128 int ServerExecutor::AsyncExecute(IRequest *request)
129 {
130 if (engineMgr_ == nullptr) {
131 HILOGI("[ServerExecutor]The engineMgr_ is null.");
132 return RETCODE_ENGINE_MANAGER_NOT_INIT;
133 }
134
135 if (request == nullptr) {
136 HILOGI("[ServerExecutor]The request is null.");
137 return RETCODE_NULL_PARAM;
138 }
139
140 std::shared_ptr<Engine> engine = engineMgr_->FindEngine(request->GetTransactionId());
141 CHK_RET(engine == nullptr, RETCODE_ENGINE_NOT_EXIST);
142
143 int retCode = engine->AsyncExecute(request);
144 if (retCode != RETCODE_SUCCESS) {
145 HILOGE("[ServerExecutor]Engine AsyncExecute failed, retCode is %d.", retCode);
146 }
147 return retCode;
148 }
149
RegisterListener(IFutureListener * listener,long long transactionId)150 int ServerExecutor::RegisterListener(IFutureListener *listener, long long transactionId)
151 {
152 FutureFactory *futureFactory = FutureFactory::GetInstance();
153 CHK_RET(futureFactory == nullptr, RETCODE_NULL_PARAM);
154 futureFactory->RegisterListener(listener, transactionId);
155 return RETCODE_SUCCESS;
156 }
157
UnRegisterListener(long long transactionId)158 int ServerExecutor::UnRegisterListener(long long transactionId)
159 {
160 FutureFactory *futureFactory = FutureFactory::GetInstance();
161 CHK_RET(futureFactory == nullptr, RETCODE_NULL_PARAM);
162 futureFactory->UnregisterListener(transactionId);
163 return RETCODE_SUCCESS;
164 }
165
GetSyncTaskManager()166 ISyncTaskManager *GetSyncTaskManager()
167 {
168 return ServerExecutor::GetInstance();
169 }
170
GetAsyncTaskManager()171 IAsyncTaskManager *GetAsyncTaskManager()
172 {
173 return ServerExecutor::GetInstance();
174 }
175
GetEngineManager()176 IEngineManager *GetEngineManager()
177 {
178 return ServerExecutor::GetInstance();
179 }
180
ReleaseEngineManager()181 void ReleaseEngineManager()
182 {
183 return ServerExecutor::ReleaseInstance();
184 }
185 } // namespace AI
186 } // namespace OHOS
187