• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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