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 #include "internal_message.h"
16 #include "securec.h"
17 #include "wifi_log.h"
18
19 #undef LOG_TAG
20 #define LOG_TAG "OHWIFI_INTERNAL_MESSAGE"
21
22 namespace OHOS {
23 namespace Wifi {
SaveIntData(int data)24 void MessageBody::SaveIntData(int data)
25 {
26 intArray_.push_back(data);
27 return;
28 }
29
SaveStringData(std::string data)30 void MessageBody::SaveStringData(std::string data)
31 {
32 stringArray_.push_back(data);
33 return;
34 }
35
GetIntData()36 int MessageBody::GetIntData()
37 {
38 if (intArray_.empty()) {
39 LOGE("intArray is null.");
40 return 0;
41 }
42
43 int tmp = intArray_.front();
44 intArray_.pop_front();
45 return tmp;
46 }
47
GetStringData()48 std::string MessageBody::GetStringData()
49 {
50 std::string tmp;
51 if (stringArray_.empty()) {
52 LOGE("stringArray is null.");
53 return tmp;
54 }
55
56 tmp = stringArray_.front();
57 stringArray_.pop_front();
58 return tmp;
59 }
60
ClearAllData()61 void MessageBody::ClearAllData()
62 {
63 intArray_.clear();
64 stringArray_.clear();
65 return;
66 }
67
CopyMessageBody(const MessageBody & origBody)68 void MessageBody::CopyMessageBody(const MessageBody &origBody)
69 {
70 intArray_.assign(origBody.intArray_.begin(), origBody.intArray_.end());
71 stringArray_.assign(origBody.stringArray_.begin(), origBody.stringArray_.end());
72
73 return;
74 }
75
InternalMessage()76 InternalMessage::InternalMessage()
77 : mMsgName(0),
78 mParam1(0),
79 mParam2(0),
80 pNextMsg(nullptr),
81 mHandleTime(0)
82 {}
83
~InternalMessage()84 InternalMessage::~InternalMessage()
85 {
86 }
87
GetMessageName() const88 int InternalMessage::GetMessageName() const
89 {
90 return mMsgName;
91 }
92
GetParam1() const93 int InternalMessage::GetParam1() const
94 {
95 return mParam1;
96 }
97
GetParam2() const98 int InternalMessage::GetParam2() const
99 {
100 return mParam2;
101 }
102
GetIntFromMessage()103 int InternalMessage::GetIntFromMessage()
104 {
105 return mMessageBody.GetIntData();
106 }
107
GetStringFromMessage()108 std::string InternalMessage::GetStringFromMessage()
109 {
110 return mMessageBody.GetStringData();
111 }
112
GetMessageBody() const113 const MessageBody &InternalMessage::GetMessageBody() const
114 {
115 return mMessageBody;
116 }
117
CopyMessageBody(const MessageBody & origBody)118 void InternalMessage::CopyMessageBody(const MessageBody &origBody)
119 {
120 mMessageBody.CopyMessageBody(origBody);
121 return;
122 }
123
GetNextMsg() const124 InternalMessage *InternalMessage::GetNextMsg() const
125 {
126 return pNextMsg;
127 }
128
GetHandleTime() const129 int64_t InternalMessage::GetHandleTime() const
130 {
131 return mHandleTime;
132 }
133
SetMessageName(int msgName)134 void InternalMessage::SetMessageName(int msgName)
135 {
136 mMsgName = msgName;
137 return;
138 }
139
SetParam1(int param1)140 void InternalMessage::SetParam1(int param1)
141 {
142 mParam1 = param1;
143 return;
144 }
145
SetParam2(int param2)146 void InternalMessage::SetParam2(int param2)
147 {
148 mParam2 = param2;
149 return;
150 }
151
ReleaseMessageObj()152 void InternalMessage::ReleaseMessageObj()
153 {
154 mMessageObj.reset();
155 return;
156 }
157
AddIntMessageBody(int data)158 void InternalMessage::AddIntMessageBody(int data)
159 {
160 mMessageBody.SaveIntData(data);
161 return;
162 }
163
AddStringMessageBody(std::string data)164 void InternalMessage::AddStringMessageBody(std::string data)
165 {
166 mMessageBody.SaveStringData(data);
167 return;
168 }
169
ClearMessageBody()170 void InternalMessage::ClearMessageBody()
171 {
172 mMessageBody.ClearAllData();
173 return;
174 }
175
SetNextMsg(InternalMessage * nextMsg)176 void InternalMessage::SetNextMsg(InternalMessage *nextMsg)
177 {
178 pNextMsg = nextMsg;
179 return;
180 }
181
SetHandleTime(int64_t time)182 void InternalMessage::SetHandleTime(int64_t time)
183 {
184 mHandleTime = time;
185 return;
186 }
187
188 std::unique_ptr<MessageManage> MessageManage::msgManage;
189
GetInstance()190 MessageManage &MessageManage::GetInstance()
191 {
192 if (msgManage.get() == nullptr) {
193 msgManage = std::make_unique<MessageManage>();
194 }
195 return *msgManage;
196 }
197
MessageManage()198 MessageManage::MessageManage() : pMsgPool(nullptr), mMsgPoolSize(0)
199 {}
200
~MessageManage()201 MessageManage::~MessageManage()
202 {
203 ReleasePool();
204 return;
205 }
206
CreateMessage()207 InternalMessage *MessageManage::CreateMessage()
208 {
209 {
210 std::unique_lock<std::mutex> lock(mPoolMutex);
211 if (pMsgPool != nullptr) {
212 InternalMessage *m = pMsgPool;
213 pMsgPool = m->GetNextMsg();
214 m->SetNextMsg(nullptr);
215 mMsgPoolSize--;
216 return m;
217 }
218 }
219
220 auto pMessage = new (std::nothrow) InternalMessage();
221 return pMessage;
222 }
223
CreateMessage(const InternalMessage * orig)224 InternalMessage *MessageManage::CreateMessage(const InternalMessage *orig)
225 {
226 InternalMessage *m = CreateMessage();
227 if (m == nullptr) {
228 return nullptr;
229 }
230
231 m->SetMessageName(orig->GetMessageName());
232 m->SetParam1(orig->GetParam1());
233 m->SetParam2(orig->GetParam2());
234 m->SetMessageObj(orig->GetMessageObj());
235 m->CopyMessageBody(orig->GetMessageBody());
236
237 return m;
238 }
239
CreateMessage(int messageName)240 InternalMessage *MessageManage::CreateMessage(int messageName)
241 {
242 InternalMessage *m = CreateMessage();
243 if (m == nullptr) {
244 return nullptr;
245 }
246
247 m->SetMessageName(messageName);
248 return m;
249 }
250
CreateMessage(int messageName,const std::any & messageObj)251 InternalMessage *MessageManage::CreateMessage(int messageName, const std::any &messageObj)
252 {
253 InternalMessage *m = CreateMessage();
254 if (m == nullptr) {
255 return nullptr;
256 }
257
258 m->SetMessageName(messageName);
259
260 m->SetMessageObj(messageObj);
261 return m;
262 }
263
CreateMessage(int messageName,int param1,int param2)264 InternalMessage *MessageManage::CreateMessage(int messageName, int param1, int param2)
265 {
266 InternalMessage *m = CreateMessage();
267 if (m == nullptr) {
268 return nullptr;
269 }
270
271 m->SetMessageName(messageName);
272 m->SetParam1(param1);
273 m->SetParam2(param2);
274 return m;
275 }
276
CreateMessage(int messageName,int param1,int param2,const std::any & messageObj)277 InternalMessage *MessageManage::CreateMessage(int messageName, int param1, int param2, const std::any &messageObj)
278 {
279 InternalMessage *m = CreateMessage();
280 if (m == nullptr) {
281 return nullptr;
282 }
283
284 m->SetMessageName(messageName);
285 m->SetParam1(param1);
286 m->SetParam2(param2);
287 m->SetMessageObj(messageObj);
288 return m;
289 }
290
ReclaimMsg(InternalMessage * m)291 void MessageManage::ReclaimMsg(InternalMessage *m)
292 {
293 if (m == nullptr) {
294 return;
295 }
296
297 m->SetMessageName(0);
298 m->SetParam1(0);
299 m->SetParam2(0);
300 m->ReleaseMessageObj();
301 m->ClearMessageBody();
302
303 {
304 std::unique_lock<std::mutex> lock(mPoolMutex);
305 if (mMsgPoolSize < MAX_MSG_NUM_IN_POOL) {
306 m->SetNextMsg(pMsgPool);
307 pMsgPool = m;
308 mMsgPoolSize++;
309 return;
310 }
311 }
312
313 delete m;
314 m = nullptr;
315 return;
316 }
317
ReleasePool()318 void MessageManage::ReleasePool()
319 {
320 std::unique_lock<std::mutex> lock(mPoolMutex);
321 InternalMessage *current = pMsgPool;
322 InternalMessage *next = nullptr;
323 while (current != nullptr) {
324 next = current->GetNextMsg();
325 delete current;
326 current = next;
327 }
328
329 return;
330 }
331 } // namespace Wifi
332 } // namespace OHOS