• 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 "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