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