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 "communication_adapter/include/sa_server_adapter.h"
17
18 #include "liteipc_adapter.h"
19 #include "securec.h"
20
21 #include "protocol/retcode_inner/aie_retcode_inner.h"
22 #include "server_executor/include/i_async_task_manager.h"
23 #include "server_executor/include/i_engine_manager.h"
24 #include "server_executor/include/i_sync_task_manager.h"
25 #include "utils/aie_guard.h"
26 #include "utils/log/aie_log.h"
27
28 namespace OHOS {
29 namespace AI {
30 namespace {
31 const unsigned int ADAPT_ID_BIT = 32U;
32 const int INPUT_LENGTH_NULL = 0;
33 }
34
SaServerAdapter(int adapterId)35 SaServerAdapter::SaServerAdapter(int adapterId) : adapterId_(adapterId), refCount_(0)
36 {
37 }
38
~SaServerAdapter()39 SaServerAdapter::~SaServerAdapter()
40 {
41 Uninitialize();
42 }
43
GetSessionId(long long transactionId) const44 int SaServerAdapter::GetSessionId(long long transactionId) const
45 {
46 return static_cast<int>(static_cast<unsigned long long>(transactionId) & TRANS_ID_MASK);
47 }
48
GetAdapterId() const49 int SaServerAdapter::GetAdapterId() const
50 {
51 return adapterId_;
52 }
53
IncRef()54 void SaServerAdapter::IncRef()
55 {
56 ++refCount_;
57 }
58
DecRef()59 void SaServerAdapter::DecRef()
60 {
61 refCount_--;
62 }
63
GetRefCount() const64 int SaServerAdapter::GetRefCount() const
65 {
66 return refCount_;
67 }
68
Uninitialize()69 void SaServerAdapter::Uninitialize()
70 {
71 std::lock_guard<std::mutex> guard(mutex_);
72 IEngineManager* engineManager = GetEngineManager();
73 if (engineManager == nullptr) {
74 HILOGE("[SaServerAdapter]Failed to get engine manager.");
75 return;
76 }
77
78 DataInfo inputInfo = {
79 .data = nullptr,
80 .length = INPUT_LENGTH_NULL,
81 };
82
83 for (auto &item: transactionIds_) {
84 engineManager->StopEngine(item, inputInfo);
85 }
86 transactionIds_.clear();
87 }
88
SaveEngineListener(SvcIdentity * svcIdentity)89 void SaServerAdapter::SaveEngineListener(SvcIdentity *svcIdentity)
90 {
91 svcIdentity_ = svcIdentity;
92 }
93
ClearEngineListener()94 void SaServerAdapter::ClearEngineListener()
95 {
96 #ifdef __LINUX__
97 BinderRelease(svcIdentity_->ipcContext, svcIdentity_->handle);
98 #endif
99 svcIdentity_ = nullptr;
100 }
101
GetEngineListener() const102 SvcIdentity *SaServerAdapter::GetEngineListener() const
103 {
104 return svcIdentity_;
105 }
106
GetTransactionId(int sessionId) const107 long long SaServerAdapter::GetTransactionId(int sessionId) const
108 {
109 return static_cast<long long>(static_cast<unsigned long long>(adapterId_) << ADAPT_ID_BIT) + sessionId;
110 }
111
AsyncExecute(const ClientInfo & clientInfo,const AlgorithmInfo & algoInfo,const DataInfo & inputInfo)112 int SaServerAdapter::AsyncExecute(const ClientInfo &clientInfo, const AlgorithmInfo &algoInfo,
113 const DataInfo &inputInfo)
114 {
115 IRequest *request = nullptr;
116 ConvertToRequest(clientInfo, algoInfo, inputInfo, request);
117 ResGuard<IRequest> guardReq(request);
118
119 IAsyncTaskManager *asyncTaskManager = GetAsyncTaskManager();
120 if (asyncTaskManager == nullptr) {
121 HILOGE("[SaServerAdapter]Get async task manager fail, ret: %d, clientId: %d, sessionId: %d, algoType: %d.",
122 RETCODE_OUT_OF_MEMORY, clientInfo.clientId, clientInfo.sessionId, algoInfo.algorithmType);
123 return RETCODE_OUT_OF_MEMORY;
124 }
125
126 int ret = asyncTaskManager->AsyncExecute(request);
127 if (ret != RETCODE_SUCCESS) {
128 HILOGE("[SaServerAdapter]Fail to get async execute request, ret is %d.", ret);
129 return ret;
130 }
131
132 guardReq.Detach();
133 return RETCODE_SUCCESS;
134 }
135
ConvertToRequest(const ClientInfo & clientInfo,const AlgorithmInfo & algoInfo,const DataInfo & inputInfo,IRequest * & request)136 void SaServerAdapter::ConvertToRequest(const ClientInfo &clientInfo, const AlgorithmInfo &algoInfo,
137 const DataInfo &inputInfo, IRequest *&request)
138 {
139 request = IRequest::Create();
140 if (request == nullptr) {
141 HILOGE("[SaServerAdapter]Fail to create request.");
142 return;
143 }
144 request->SetRequestId(algoInfo.requestId);
145 request->SetOperationId(algoInfo.operateId);
146 request->SetTransactionId(GetTransactionId(clientInfo.sessionId));
147 request->SetAlgoPluginType(algoInfo.algorithmType);
148 request->SetMsg(inputInfo);
149 request->SetClientUid(clientInfo.clientUid);
150 }
151
LoadAlgorithm(long long transactionId,const AlgorithmInfo & algoInfo,const DataInfo & inputInfo,DataInfo & outputInfo)152 int SaServerAdapter::LoadAlgorithm(long long transactionId, const AlgorithmInfo &algoInfo,
153 const DataInfo &inputInfo, DataInfo &outputInfo)
154 {
155 IEngineManager *engineManager = GetEngineManager();
156 if (engineManager == nullptr) {
157 HILOGE("[SaServerAdapter][transactionId:%lld]Failed to get engine manager.", transactionId);
158 return RETCODE_OUT_OF_MEMORY;
159 }
160 int retCode = engineManager->StartEngine(transactionId, algoInfo, inputInfo, outputInfo);
161 if (retCode != RETCODE_SUCCESS) {
162 HILOGE("[SaServerAdapter][transactionId:%lld]Failed to load algorithm.", transactionId);
163 return retCode;
164 }
165
166 SaveTransaction(transactionId);
167 return RETCODE_SUCCESS;
168 }
169
SetOption(long long transactionId,int optionType,const DataInfo & dataInfo)170 int SaServerAdapter::SetOption(long long transactionId, int optionType, const DataInfo &dataInfo)
171 {
172 IEngineManager *engineManager = GetEngineManager();
173 if (engineManager == nullptr) {
174 HILOGE("[SaServerAdapter][transactionId:0x%llx]Failed to get engine manager.", transactionId);
175 return RETCODE_OUT_OF_MEMORY;
176 }
177
178 return engineManager->SetOption(transactionId, optionType, dataInfo);
179 }
180
GetOption(long long transactionId,int optionType,const DataInfo & dataInfo,DataInfo & outputInfo)181 int SaServerAdapter::GetOption(long long transactionId, int optionType, const DataInfo &dataInfo,
182 DataInfo &outputInfo)
183 {
184 IEngineManager *engineManager = GetEngineManager();
185 if (engineManager == nullptr) {
186 HILOGE("[SaServerAdapter][transactionId:0x%llx]Failed to get engine manager.", transactionId);
187 return RETCODE_OUT_OF_MEMORY;
188 }
189
190 return engineManager->GetOption(transactionId, optionType, dataInfo, outputInfo);
191 }
192
SaveTransaction(long long transactionId)193 void SaServerAdapter::SaveTransaction(long long transactionId)
194 {
195 std::lock_guard<std::mutex> guard(mutex_);
196 transactionIds_.insert(transactionId);
197 }
198
UnloadAlgorithm(long long transactionId,const DataInfo & inputInfo)199 int SaServerAdapter::UnloadAlgorithm(long long transactionId, const DataInfo &inputInfo)
200 {
201 IEngineManager* engineInstance = GetEngineManager();
202 if (engineInstance == nullptr) {
203 HILOGE("[SaServerAdapter][transactionId:%lld]Failed to get engine manager.", transactionId);
204 return RETCODE_OUT_OF_MEMORY;
205 }
206 int retCode = engineInstance->StopEngine(transactionId, inputInfo);
207 if (retCode != RETCODE_SUCCESS) {
208 HILOGE("[SaServerAdapter][transactionId:%lld]Failed to unload algorithm.", transactionId);
209 return retCode;
210 }
211 RemoveTransaction(transactionId);
212 return RETCODE_SUCCESS;
213 }
214
RemoveTransaction(long long transactionId)215 void SaServerAdapter::RemoveTransaction(long long transactionId)
216 {
217 std::lock_guard<std::mutex> guard(mutex_);
218 transactionIds_.erase(transactionId);
219 }
220
SyncExecute(const ClientInfo & clientInfo,const AlgorithmInfo & algoInfo,const DataInfo & inputInfo,DataInfo & outputInfo)221 int SaServerAdapter::SyncExecute(const ClientInfo &clientInfo, const AlgorithmInfo &algoInfo,
222 const DataInfo &inputInfo, DataInfo &outputInfo)
223 {
224 IRequest *request = nullptr;
225 outputInfo.data = nullptr;
226 outputInfo.length = 0;
227 ConvertToRequest(clientInfo, algoInfo, inputInfo, request);
228 if (request == nullptr) {
229 HILOGE("[SaServer]Fail to ConvertToRequest.");
230 return RETCODE_OUT_OF_MEMORY;
231 }
232 ResGuard<IRequest> guardReq(request);
233 ISyncTaskManager *taskMgr = GetSyncTaskManager();
234 if (taskMgr == nullptr) {
235 HILOGE("[SaServerAdapter]Get task manager failed, ret is %d", RETCODE_OUT_OF_MEMORY);
236 return RETCODE_OUT_OF_MEMORY;
237 }
238 IResponse *response = nullptr;
239 int retCode = taskMgr->SyncExecute(request, response);
240 ResGuard<IResponse> guardRes(response);
241 if ((retCode != RETCODE_SUCCESS) || (response == nullptr)) {
242 HILOGE("[SaServerAdapter]Execute request failed, ret is %d", retCode);
243 return retCode;
244 }
245 outputInfo = response->GetResult();
246 response->Detach();
247
248 return RETCODE_SUCCESS;
249 }
250 } // namespace AI
251 } // namespace OHOS
252