• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 "common_event_control_manager.h"
17 
18 #include <cinttypes>
19 
20 #include "access_token_helper.h"
21 #include "bundle_manager_helper.h"
22 #include "common_event_constant.h"
23 #include "event_log_wrapper.h"
24 #include "event_trace_wrapper.h"
25 #include "event_report.h"
26 #include "hitrace_meter_adapter.h"
27 #include "ievent_receive.h"
28 #include "system_time.h"
29 #include "xcollie/watchdog.h"
30 namespace OHOS {
31 namespace EventFwk {
32 constexpr int32_t LENGTH = 80;
33 constexpr int32_t DOUBLE = 2;
34 static const int32_t TIME_UNIT_SIZE = 1000;
35 
CommonEventControlManager()36 CommonEventControlManager::CommonEventControlManager()
37     : handler_(nullptr), handlerOrdered_(nullptr), pendingTimeoutMessage_(false), scheduled_(false)
38 {
39     EVENT_LOGD("enter");
40 }
41 
~CommonEventControlManager()42 CommonEventControlManager::~CommonEventControlManager()
43 {
44     EVENT_LOGD("enter");
45 }
46 
PublishCommonEvent(const CommonEventRecord & eventRecord,const sptr<IRemoteObject> & commonEventListener)47 bool CommonEventControlManager::PublishCommonEvent(
48     const CommonEventRecord &eventRecord, const sptr<IRemoteObject> &commonEventListener)
49 {
50     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
51     EVENT_LOGD("enter");
52 
53     bool ret = false;
54 
55     if (!eventRecord.publishInfo->IsOrdered()) {
56         ret = ProcessUnorderedEvent(eventRecord);
57     } else {
58         ret = ProcessOrderedEvent(eventRecord, commonEventListener);
59     }
60 
61     return ret;
62 }
63 
PublishStickyCommonEvent(const CommonEventRecord & eventRecord,const std::shared_ptr<EventSubscriberRecord> & subscriberRecord)64 bool CommonEventControlManager::PublishStickyCommonEvent(
65     const CommonEventRecord &eventRecord, const std::shared_ptr<EventSubscriberRecord> &subscriberRecord)
66 {
67     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
68     EVENT_LOGD("enter");
69 
70     if (!subscriberRecord) {
71         EVENT_LOGE("subscriberRecord is null");
72         return false;
73     }
74     return ProcessUnorderedEvent(eventRecord, subscriberRecord);
75 }
76 
PublishFreezeCommonEvent(const uid_t & uid)77 bool CommonEventControlManager::PublishFreezeCommonEvent(const uid_t &uid)
78 {
79     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
80     EVENT_LOGD("enter");
81 
82     if (!GetUnorderedEventHandler()) {
83         EVENT_LOGE("failed to get eventhandler");
84         return false;
85     }
86     PublishFrozenEventsInner(DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->GetFrozenEvents(uid));
87     return true;
88 }
89 
PublishFreezeCommonEvent(std::set<int> pidList)90 bool CommonEventControlManager::PublishFreezeCommonEvent(std::set<int> pidList)
91 {
92     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
93     EVENT_LOGD("enter");
94 
95     if (!GetUnorderedEventHandler()) {
96         EVENT_LOGE("failed to get eventhandler");
97         return false;
98     }
99     for (auto it = pidList.begin(); it != pidList.end(); it++) {
100         PublishFrozenEventsInner(
101             DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->GetFrozenEventsMapByPid(*it));
102     }
103     return true;
104 }
105 
PublishAllFreezeCommonEvents()106 bool CommonEventControlManager::PublishAllFreezeCommonEvents()
107 {
108     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
109     EVENT_LOGD("enter");
110 
111     if (!GetUnorderedEventHandler()) {
112         EVENT_LOGE("failed to get eventhandler");
113         return false;
114     }
115 
116     std::map<uid_t, FrozenRecords> frozenEventRecords =
117         DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->GetAllFrozenEvents();
118     for (auto record : frozenEventRecords) {
119         PublishFrozenEventsInner(record.second);
120     }
121 
122     std::map<pid_t, FrozenRecords> frozenEventRecordsMap =
123         DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->GetAllFrozenEventsMap();
124     for (auto record : frozenEventRecordsMap) {
125         PublishFrozenEventsInner(record.second);
126     }
127     return true;
128 }
129 
PublishFrozenEventsInner(const FrozenRecords & frozenRecords)130 void CommonEventControlManager::PublishFrozenEventsInner(const FrozenRecords &frozenRecords)
131 {
132     for (auto record : frozenRecords) {
133         for (auto vec : record.second) {
134             if (!vec) {
135                 EVENT_LOGW("failed to find record");
136                 continue;
137             }
138 
139             EventSubscriberRecord subscriberRecord = record.first;
140             CommonEventRecord eventRecord = *vec;
141             std::weak_ptr<CommonEventControlManager> weak = shared_from_this();
142             auto innerCallback = [weak, subscriberRecord, eventRecord]() {
143                 auto control = weak.lock();
144                 if (control == nullptr) {
145                     EVENT_LOGE("CommonEventControlManager is null");
146                     return;
147                 }
148                 control->NotifyFreezeEvents(subscriberRecord, eventRecord);
149             };
150             unorderedImmediateQueue_->submit(innerCallback);
151         }
152     }
153 }
154 
NotifyFreezeEvents(const EventSubscriberRecord & subscriberRecord,const CommonEventRecord & eventRecord)155 bool CommonEventControlManager::NotifyFreezeEvents(
156     const EventSubscriberRecord &subscriberRecord, const CommonEventRecord &eventRecord)
157 {
158     EVENT_LOGD("enter");
159 
160     sptr<IEventReceive> commonEventListenerProxy = iface_cast<IEventReceive>(subscriberRecord.commonEventListener);
161     if (!commonEventListenerProxy) {
162         EVENT_LOGE("Fail to get IEventReceive proxy");
163         return false;
164     }
165 
166     if (eventRecord.commonEventData == nullptr) {
167         EVENT_LOGE("commonEventData == nullptr");
168         return false;
169     }
170     EVENT_LOGI("Send %{public}s to subscriber %{public}s when unfreezed",
171         eventRecord.commonEventData->GetWant().GetAction().c_str(),
172         subscriberRecord.eventRecordInfo.subId.c_str());
173     commonEventListenerProxy->NotifyEvent(*(eventRecord.commonEventData),
174         false, eventRecord.publishInfo->IsSticky());
175     AccessTokenHelper::RecordSensitivePermissionUsage(subscriberRecord.eventRecordInfo.callerToken,
176         eventRecord.commonEventData->GetWant().GetAction());
177     return true;
178 }
179 
GetUnorderedEventHandler()180 bool CommonEventControlManager::GetUnorderedEventHandler()
181 {
182     if (!unorderedQueue_) {
183         unorderedQueue_ = std::make_shared<ffrt::queue>("unordered_common_event");
184     }
185 
186     if (!unorderedImmediateQueue_) {
187         unorderedImmediateQueue_ = std::make_shared<ffrt::queue>("unordered_immediate_common_event",
188             ffrt::queue_attr().qos(ffrt::qos_utility));
189     }
190 
191     return true;
192 }
193 
NotifyUnorderedEventLocked(std::shared_ptr<OrderedEventRecord> & eventRecord)194 void CommonEventControlManager::NotifyUnorderedEventLocked(std::shared_ptr<OrderedEventRecord> &eventRecord)
195 {
196     int32_t succCnt = 0;
197     int32_t failCnt = 0;
198     int32_t freezeCnt = 0;
199     for (auto vec : eventRecord->receivers) {
200         if (vec == nullptr) {
201             EVENT_LOGE("invalid vec");
202             failCnt++;
203             continue;
204         }
205         size_t index = eventRecord->nextReceiver++;
206         if (vec->isFreeze) {
207             eventRecord->deliveryState[index] = OrderedEventRecord::SKIPPED;
208             DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->InsertFrozenEvents(vec, *eventRecord);
209             DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->InsertFrozenEventsMap(
210                 vec, *eventRecord);
211             EVENT_LOGE("Notify %{public}s to freeze subscriber, subId = %{public}s",
212                 eventRecord->commonEventData->GetWant().GetAction().c_str(), vec->eventRecordInfo.subId.c_str());
213             freezeCnt++;
214             continue;
215         }
216         sptr<IEventReceive> commonEventListenerProxy = iface_cast<IEventReceive>(vec->commonEventListener);
217         if (!commonEventListenerProxy) {
218             eventRecord->deliveryState[index] = OrderedEventRecord::SKIPPED;
219             EVENT_LOGE("Notify %{public}s to invalid proxy, subId = %{public}s",
220                 eventRecord->commonEventData->GetWant().GetAction().c_str(), vec->eventRecordInfo.subId.c_str());
221             failCnt++;
222             continue;
223         }
224         eventRecord->deliveryState[index] = OrderedEventRecord::DELIVERED;
225         eventRecord->state = OrderedEventRecord::RECEIVING;
226         int32_t result = commonEventListenerProxy->NotifyEvent(*(eventRecord->commonEventData), false,
227             eventRecord->publishInfo->IsSticky());
228         if (result != ERR_OK) {
229             eventRecord->state = OrderedEventRecord::SKIPPED;
230             failCnt++;
231             EVENT_LOGE("Notify %{public}s fail, subId = %{public}s",
232                 eventRecord->commonEventData->GetWant().GetAction().c_str(), vec->eventRecordInfo.subId.c_str());
233             continue;
234         }
235         eventRecord->state = OrderedEventRecord::RECEIVED;
236         succCnt++;
237         AccessTokenHelper::RecordSensitivePermissionUsage(vec->eventRecordInfo.callerToken,
238             eventRecord->commonEventData->GetWant().GetAction());
239     }
240     EVENT_LOGI("Notify %{public}s end(%{public}zu, %{public}d, %{public}d, %{public}d)",
241         eventRecord->commonEventData->GetWant().GetAction().c_str(),
242         eventRecord->receivers.size(), succCnt, failCnt, freezeCnt);
243 }
244 
NotifyUnorderedEvent(std::shared_ptr<OrderedEventRecord> & eventRecord)245 bool CommonEventControlManager::NotifyUnorderedEvent(std::shared_ptr<OrderedEventRecord> &eventRecord)
246 {
247     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
248     if (!eventRecord) {
249         EVENT_LOGD("Invalid event record.");
250         return false;
251     }
252 
253     NotifyUnorderedEventLocked(eventRecord);
254 
255     std::lock_guard<ffrt::mutex> lock(unorderedMutex_);
256     auto it = std::find(unorderedEventQueue_.begin(), unorderedEventQueue_.end(), eventRecord);
257     if (it != unorderedEventQueue_.end()) {
258         unorderedEventQueue_.erase(it);
259     }
260     return true;
261 }
262 
ProcessUnorderedEvent(const CommonEventRecord & eventRecord,const std::shared_ptr<EventSubscriberRecord> & subscriberRecord)263 bool CommonEventControlManager::ProcessUnorderedEvent(
264     const CommonEventRecord &eventRecord, const std::shared_ptr<EventSubscriberRecord> &subscriberRecord)
265 {
266     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
267     EVENT_LOGD("enter");
268 
269     bool ret = false;
270 
271     if (!GetUnorderedEventHandler()) {
272         EVENT_LOGE("failed to get eventhandler");
273         return ret;
274     }
275 
276     std::shared_ptr<OrderedEventRecord> eventRecordPtr = std::make_shared<OrderedEventRecord>();
277     if (eventRecordPtr == nullptr) {
278         EVENT_LOGE("eventRecordPtr is null");
279         return ret;
280     }
281 
282     std::shared_ptr<CommonEventSubscriberManager> spinstance =
283         DelayedSingleton<CommonEventSubscriberManager>::GetInstance();
284 
285     eventRecordPtr->FillCommonEventRecord(eventRecord);
286     if (subscriberRecord) {
287         eventRecordPtr->receivers.emplace_back(subscriberRecord);
288     } else {
289         eventRecordPtr->receivers = spinstance->GetSubscriberRecords(eventRecord);
290     }
291 
292     for (auto vec : eventRecordPtr->receivers) {
293         eventRecordPtr->deliveryState.emplace_back(OrderedEventRecord::PENDING);
294     }
295 
296     EnqueueUnorderedRecord(eventRecordPtr);
297 
298     std::weak_ptr<CommonEventControlManager> weak = shared_from_this();
299     auto innerCallback = [weak, eventRecordPtr]() {
300         auto manager = weak.lock();
301         if (manager == nullptr) {
302             EVENT_LOGE("CommonEventControlManager is null");
303             return;
304         }
305         std::shared_ptr<OrderedEventRecord> ordered = eventRecordPtr;
306         manager->NotifyUnorderedEvent(ordered);
307     };
308 
309     if (eventRecord.isSystemEvent) {
310         unorderedImmediateQueue_->submit(innerCallback);
311     } else {
312         unorderedQueue_->submit(innerCallback);
313     }
314 
315     return ret;
316 }
317 
GetMatchingOrderedReceiver(const sptr<IRemoteObject> & proxy)318 std::shared_ptr<OrderedEventRecord> CommonEventControlManager::GetMatchingOrderedReceiver(
319     const sptr<IRemoteObject> &proxy)
320 {
321     EVENT_LOGD("enter");
322 
323     std::lock_guard<ffrt::mutex> lock(orderedMutex_);
324 
325     if (!orderedEventQueue_.empty()) {
326         std::shared_ptr<OrderedEventRecord> firstRecord = orderedEventQueue_.front();
327         if ((firstRecord != nullptr) && (firstRecord->curReceiver == proxy)) {
328             return firstRecord;
329         }
330     }
331 
332     return nullptr;
333 }
334 
GetOrderedEventHandler()335 bool CommonEventControlManager::GetOrderedEventHandler()
336 {
337     if (!orderedQueue_) {
338         orderedQueue_ = std::make_shared<ffrt::queue>("ordered_common_event");
339     }
340     return true;
341 }
342 
ProcessOrderedEvent(const CommonEventRecord & eventRecord,const sptr<IRemoteObject> & commonEventListener)343 bool CommonEventControlManager::ProcessOrderedEvent(
344     const CommonEventRecord &eventRecord, const sptr<IRemoteObject> &commonEventListener)
345 {
346     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
347     EVENT_LOGD("enter");
348 
349     bool ret = false;
350 
351     if (!GetOrderedEventHandler()) {
352         EVENT_LOGE("failed to get eventhandler");
353         return ret;
354     }
355 
356     std::shared_ptr<OrderedEventRecord> eventRecordPtr = std::make_shared<OrderedEventRecord>();
357     if (eventRecordPtr == nullptr) {
358         EVENT_LOGE("eventRecordPtr is null");
359         return ret;
360     }
361 
362     std::shared_ptr<CommonEventSubscriberManager> spinstance =
363         DelayedSingleton<CommonEventSubscriberManager>::GetInstance();
364     auto subscribers = spinstance->GetSubscriberRecords(eventRecord);
365     auto OrderedSubscriberCompareFunc = [] (
366         std::shared_ptr<EventSubscriberRecord> fist,
367         std::shared_ptr<EventSubscriberRecord> second) {
368         return fist->eventSubscribeInfo->GetPriority() > second->eventSubscribeInfo->GetPriority();
369     };
370     std::sort(subscribers.begin(), subscribers.end(), OrderedSubscriberCompareFunc);
371     eventRecordPtr->FillCommonEventRecord(eventRecord);
372     eventRecordPtr->resultTo = commonEventListener;
373     eventRecordPtr->state = OrderedEventRecord::IDLE;
374     eventRecordPtr->nextReceiver = 0;
375     eventRecordPtr->receivers = subscribers;
376     for (auto vec : eventRecordPtr->receivers) {
377         eventRecordPtr->deliveryState.emplace_back(OrderedEventRecord::PENDING);
378     }
379 
380     EnqueueOrderedRecord(eventRecordPtr);
381 
382     ret = ScheduleOrderedCommonEvent();
383 
384     return ret;
385 }
386 
EnqueueUnorderedRecord(const std::shared_ptr<OrderedEventRecord> & eventRecordPtr)387 bool CommonEventControlManager::EnqueueUnorderedRecord(const std::shared_ptr<OrderedEventRecord> &eventRecordPtr)
388 {
389     if (eventRecordPtr == nullptr) {
390         EVENT_LOGE("eventRecordPtr is null");
391         return false;
392     }
393 
394     std::lock_guard<ffrt::mutex> lock(unorderedMutex_);
395 
396     unorderedEventQueue_.emplace_back(eventRecordPtr);
397 
398     return true;
399 }
400 
EnqueueOrderedRecord(const std::shared_ptr<OrderedEventRecord> & eventRecordPtr)401 bool CommonEventControlManager::EnqueueOrderedRecord(const std::shared_ptr<OrderedEventRecord> &eventRecordPtr)
402 {
403     if (eventRecordPtr == nullptr) {
404         EVENT_LOGE("eventRecordPtr is null");
405         return false;
406     }
407 
408     std::lock_guard<ffrt::mutex> lock(orderedMutex_);
409 
410     orderedEventQueue_.emplace_back(eventRecordPtr);
411 
412     return true;
413 }
414 
ScheduleOrderedCommonEvent()415 bool CommonEventControlManager::ScheduleOrderedCommonEvent()
416 {
417     EVENT_LOGD("enter");
418 
419     if (scheduled_) {
420         return true;
421     }
422 
423     scheduled_ = true;
424 
425     std::weak_ptr<CommonEventControlManager> weak = shared_from_this();
426     orderedQueue_->submit([weak]() {
427         auto manager = weak.lock();
428         if (manager == nullptr) {
429             EVENT_LOGE("CommonEventControlManager is null");
430             return;
431         }
432         manager->ProcessNextOrderedEvent(true);
433     });
434     return true;
435 }
436 
NotifyOrderedEvent(std::shared_ptr<OrderedEventRecord> & eventRecordPtr,size_t index)437 bool CommonEventControlManager::NotifyOrderedEvent(std::shared_ptr<OrderedEventRecord> &eventRecordPtr, size_t index)
438 {
439     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
440     EVENT_LOGD("enter with index %{public}zu", index);
441     if (eventRecordPtr == nullptr) {
442         EVENT_LOGE("eventRecordPtr = nullptr");
443         return false;
444     }
445     size_t receiverNum = eventRecordPtr->receivers.size();
446     if ((index < 0) || (index >= receiverNum)) {
447         EVENT_LOGE("Invalid index (= %{public}zu)", index);
448         return false;
449     }
450     if (eventRecordPtr->receivers[index]->isFreeze) {
451         EVENT_LOGD("vec isFreeze: %{public}d", eventRecordPtr->receivers[index]->isFreeze);
452         DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->InsertFrozenEvents(
453             eventRecordPtr->receivers[index], *eventRecordPtr);
454         DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->InsertFrozenEventsMap(
455             eventRecordPtr->receivers[index], *eventRecordPtr);
456         eventRecordPtr->deliveryState[index] = OrderedEventRecord::SKIPPED;
457         eventRecordPtr->curReceiver = nullptr;
458         return true;
459     }
460     eventRecordPtr->deliveryState[index] = OrderedEventRecord::DELIVERED;
461     eventRecordPtr->curReceiver = eventRecordPtr->receivers[index]->commonEventListener;
462     eventRecordPtr->state = OrderedEventRecord::RECEIVING;
463     sptr<IEventReceive> receiver = iface_cast<IEventReceive>(eventRecordPtr->curReceiver);
464     if (!receiver) {
465         EVENT_LOGE("Failed to get IEventReceive proxy");
466         eventRecordPtr->curReceiver = nullptr;
467         return false;
468     }
469     eventRecordPtr->state = OrderedEventRecord::RECEIVED;
470     int32_t result = receiver->NotifyEvent(*(eventRecordPtr->commonEventData), true,
471         eventRecordPtr->publishInfo->IsSticky());
472     if (result != ERR_OK) {
473         eventRecordPtr->state = OrderedEventRecord::SKIPPED;
474         EVENT_LOGE("Notify %{public}s fail, subId = %{public}s",
475             eventRecordPtr->commonEventData->GetWant().GetAction().c_str(),
476             eventRecordPtr->receivers[index]->eventRecordInfo.subId.c_str());
477         eventRecordPtr->curReceiver = nullptr;
478         return false;
479     }
480     EVENT_LOGD("NotifyOrderedEvent index = %{public}zu event = %{public}s success, subId = %{public}s", index,
481         eventRecordPtr->commonEventData->GetWant().GetAction().c_str(),
482         eventRecordPtr->receivers[index]->eventRecordInfo.subId.c_str());
483     AccessTokenHelper::RecordSensitivePermissionUsage(
484         eventRecordPtr->receivers[index]->eventRecordInfo.callerToken,
485         eventRecordPtr->commonEventData->GetWant().GetAction());
486     return true;
487 }
488 
ProcessNextOrderedEvent(bool isSendMsg)489 void CommonEventControlManager::ProcessNextOrderedEvent(bool isSendMsg)
490 {
491     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
492     EVENT_LOGD("enter");
493 
494     if (isSendMsg) {
495         scheduled_ = false;
496     }
497 
498     std::shared_ptr<OrderedEventRecord> sp = nullptr;
499     {
500         std::lock_guard<ffrt::mutex> lock(orderedMutex_);
501         do {
502             if (orderedEventQueue_.empty()) {
503                 EVENT_LOGD("orderedEventQueue_ is empty");
504                 return;
505             }
506 
507             sp = orderedEventQueue_.front();
508             bool forceReceive = false;
509             size_t numReceivers = sp->receivers.size();
510             uint64_t nowSysTime = static_cast<uint64_t>(SystemTime::GetNowSysTime());
511 
512             if (sp->dispatchTime > 0) {
513                 if ((numReceivers > 0) && (nowSysTime > static_cast<uint64_t>(sp->dispatchTime) +
514                     (DOUBLE * TIMEOUT * numReceivers))) {
515                     CurrentOrderedEventTimeout(false);
516                     forceReceive = true;
517                     sp->state = OrderedEventRecord::IDLE;
518                 }
519             }
520 
521             if (sp->state != OrderedEventRecord::IDLE) {
522                 return;
523             }
524 
525             if ((sp->receivers.empty()) || (sp->nextReceiver >= numReceivers) || sp->resultAbort || forceReceive) {
526                 // No more receivers for this ordered common event, then process the final result receiver
527                 bool hasLastSubscribe = (sp->resultTo != nullptr) ? true : false;
528                 if (sp->resultTo != nullptr) {
529                     EVENT_LOGD("Process the final subscriber");
530                     sptr<IEventReceive> receiver = iface_cast<IEventReceive>(sp->resultTo);
531                     if (!receiver) {
532                         EVENT_LOGE("Failed to get IEventReceive proxy");
533                         return;
534                     }
535                     receiver->NotifyEvent(*(sp->commonEventData), true, sp->publishInfo->IsSticky());
536                     sp->resultTo = nullptr;
537                 }
538                 EVENT_LOGI("Notify %{public}s end(%{public}zu, %{public}zu)",
539                     sp->commonEventData->GetWant().GetAction().c_str(), numReceivers, sp->nextReceiver);
540                 CancelTimeout();
541 
542                 orderedEventQueue_.erase(orderedEventQueue_.begin());
543 
544                 sp = nullptr;
545             }
546         } while (sp == nullptr);
547     }
548     size_t recIdx = sp->nextReceiver++;
549     SetTime(recIdx, sp, pendingTimeoutMessage_);
550 
551     NotifyOrderedEvent(sp, recIdx);
552     if (sp->curReceiver == nullptr) {
553         sp->state = OrderedEventRecord::IDLE;
554         ScheduleOrderedCommonEvent();
555     }
556 }
557 
SetTime(size_t recIdx,std::shared_ptr<OrderedEventRecord> & sp,bool timeoutMessage)558 void CommonEventControlManager::SetTime(size_t recIdx, std::shared_ptr<OrderedEventRecord> &sp, bool timeoutMessage)
559 {
560     EVENT_LOGD("enter");
561 
562     sp->receiverTime = SystemTime::GetNowSysTime();
563 
564     if (recIdx == 0) {
565         sp->dispatchTime = sp->receiverTime;
566     }
567 
568     if (!timeoutMessage) {
569         SetTimeout();
570     }
571 }
572 
SetTimeout()573 bool CommonEventControlManager::SetTimeout()
574 {
575     EVENT_LOGD("enter");
576 
577     bool ret = true;
578 
579     if (!pendingTimeoutMessage_) {
580         pendingTimeoutMessage_ = true;
581         std::weak_ptr<CommonEventControlManager> weak = shared_from_this();
582         orderedHandler = orderedQueue_->submit_h([weak]() {
583             auto manager = weak.lock();
584             if (manager == nullptr) {
585                 EVENT_LOGE("CommonEventControlManager is null");
586                 return;
587             }
588             manager->CurrentOrderedEventTimeout(true);
589         }, ffrt::task_attr().delay(TIMEOUT * TIME_UNIT_SIZE));
590     }
591 
592     return ret;
593 }
594 
CancelTimeout()595 bool CommonEventControlManager::CancelTimeout()
596 {
597     EVENT_LOGD("enter");
598 
599     if (pendingTimeoutMessage_) {
600         pendingTimeoutMessage_ = false;
601         orderedQueue_->cancel(orderedHandler);
602     }
603 
604     return true;
605 }
606 
CurrentOrderedEventTimeout(bool isFromMsg)607 void CommonEventControlManager::CurrentOrderedEventTimeout(bool isFromMsg)
608 {
609     EVENT_LOGD("enter");
610 
611     if (isFromMsg) {
612         pendingTimeoutMessage_ = false;
613     }
614 
615     if (orderedEventQueue_.empty()) {
616         EVENT_LOGE("empty orderedEventQueue_");
617         return;
618     }
619 
620     int64_t nowSysTime = SystemTime::GetNowSysTime();
621     std::shared_ptr<OrderedEventRecord> sp = orderedEventQueue_.front();
622 
623     if (isFromMsg) {
624         int64_t timeoutTime = sp->receiverTime + TIMEOUT;
625         if (timeoutTime > nowSysTime) {
626             SetTimeout();
627             return;
628         }
629     }
630 
631     // The processing of current receiver has timeout
632     sp->receiverTime = nowSysTime;
633 
634     if (sp->nextReceiver > 0) {
635         std::shared_ptr<EventSubscriberRecord> subscriberRecord = sp->receivers[sp->nextReceiver - 1];
636         EVENT_LOGW("Timeout: When %{public}s process %{public}s", subscriberRecord->eventRecordInfo.subId.c_str(),
637             sp->commonEventData->GetWant().GetAction().c_str());
638         SendOrderedEventProcTimeoutHiSysEvent(subscriberRecord, sp->commonEventData->GetWant().GetAction());
639 
640         sp->deliveryState[sp->nextReceiver - 1] = OrderedEventRecord::TIMEOUT;
641     }
642 
643     // Forced to finish the current receiver to process the next receiver
644     int32_t code = sp->commonEventData->GetCode();
645     const std::string &strRef = sp->commonEventData->GetData();
646     bool abort = sp->resultAbort;
647     FinishReceiver(sp, code, strRef, abort);
648 
649     ScheduleOrderedCommonEvent();
650 
651     return;
652 }
653 
FinishReceiver(std::shared_ptr<OrderedEventRecord> recordPtr,const int32_t & code,const std::string & receiverData,const bool & abortEvent)654 bool CommonEventControlManager::FinishReceiver(std::shared_ptr<OrderedEventRecord> recordPtr, const int32_t &code,
655     const std::string &receiverData, const bool &abortEvent)
656 {
657     EVENT_LOGD("enter");
658 
659     if (recordPtr == nullptr) {
660         EVENT_LOGE("recordPtr is null");
661         return false;
662     }
663 
664     EVENT_LOGD("enter recordPtr->state=%{public}d", recordPtr->state);
665 
666     int8_t state = recordPtr->state;
667     recordPtr->state = OrderedEventRecord::IDLE;
668     recordPtr->curReceiver = nullptr;
669     recordPtr->commonEventData->SetCode(code);
670     recordPtr->commonEventData->SetData(receiverData);
671     recordPtr->resultAbort = abortEvent;
672 
673     return state == OrderedEventRecord::RECEIVED;
674 }
675 
FinishReceiverAction(std::shared_ptr<OrderedEventRecord> recordPtr,const int32_t & code,const std::string & receiverData,const bool & abortEvent)676 bool CommonEventControlManager::FinishReceiverAction(std::shared_ptr<OrderedEventRecord> recordPtr, const int32_t &code,
677     const std::string &receiverData, const bool &abortEvent)
678 {
679     EVENT_LOGD("enter");
680 
681     if (recordPtr == nullptr) {
682         EVENT_LOGE("recordPtr is nullptr");
683         return false;
684     }
685 
686     bool doNext = false;
687     doNext = FinishReceiver(recordPtr, code, receiverData, abortEvent);
688     if (doNext) {
689         ProcessNextOrderedEvent(false);
690     }
691 
692     return true;
693 }
694 
GetUnorderedEventRecords(const std::string & event,const int32_t & userId,std::vector<std::shared_ptr<OrderedEventRecord>> & records)695 void CommonEventControlManager::GetUnorderedEventRecords(
696     const std::string &event, const int32_t &userId, std::vector<std::shared_ptr<OrderedEventRecord>> &records)
697 {
698     EVENT_LOGD("enter");
699     std::lock_guard<ffrt::mutex> unorderedLock(unorderedMutex_);
700     if (event.empty() && userId == ALL_USER) {
701         records = unorderedEventQueue_;
702     } else if (event.empty()) {
703         for (auto vec : unorderedEventQueue_) {
704             if (vec->userId == userId) {
705                 records.emplace_back(vec);
706             }
707         }
708     } else if (userId == ALL_USER) {
709         for (auto vec : unorderedEventQueue_) {
710             if (vec->commonEventData->GetWant().GetAction() == event) {
711                 records.emplace_back(vec);
712             }
713         }
714     } else {
715         for (auto vec : unorderedEventQueue_) {
716             if (vec->commonEventData->GetWant().GetAction() == event && vec->userId == userId) {
717                 records.emplace_back(vec);
718             }
719         }
720     }
721 }
722 
GetOrderedEventRecords(const std::string & event,const int32_t & userId,std::vector<std::shared_ptr<OrderedEventRecord>> & records)723 void CommonEventControlManager::GetOrderedEventRecords(
724     const std::string &event, const int32_t &userId, std::vector<std::shared_ptr<OrderedEventRecord>> &records)
725 {
726     EVENT_LOGD("enter");
727     std::lock_guard<ffrt::mutex> orderedLock(orderedMutex_);
728     if (event.empty() && userId == ALL_USER) {
729         records = orderedEventQueue_;
730     } else if (event.empty()) {
731         for (auto vec : orderedEventQueue_) {
732             if (vec->userId == userId) {
733                 records.emplace_back(vec);
734             }
735         }
736     } else if (userId == ALL_USER) {
737         for (auto vec : orderedEventQueue_) {
738             if (vec->commonEventData->GetWant().GetAction() == event) {
739                 records.emplace_back(vec);
740             }
741         }
742     } else {
743         for (auto vec : orderedEventQueue_) {
744             if (vec->commonEventData->GetWant().GetAction() == event && vec->userId == userId) {
745                 records.emplace_back(vec);
746             }
747         }
748     }
749 }
750 
DumpStateByCommonEventRecord(const std::shared_ptr<OrderedEventRecord> & record,std::string & dumpInfo)751 void CommonEventControlManager::DumpStateByCommonEventRecord(
752     const std::shared_ptr<OrderedEventRecord> &record, std::string &dumpInfo)
753 {
754     EVENT_LOGD("enter");
755 
756     char systime[LENGTH];
757     strftime(systime, sizeof(char) * LENGTH, "%Y%m%d %I:%M %p", &record->recordTime);
758 
759     std::string recordTime = "\tTime: " + std::string(systime) + "\n";
760     std::string pid = "\tPID: " + std::to_string(record->eventRecordInfo.pid) + "\n";
761     std::string uid = "\tUID: " + std::to_string(record->eventRecordInfo.uid) + "\n";
762     std::string userId;
763     switch (record->userId) {
764         case UNDEFINED_USER:
765             userId = "UNDEFINED_USER";
766             break;
767         case ALL_USER:
768             userId = "ALL_USER";
769             break;
770         default:
771             userId = std::to_string(record->userId);
772             break;
773     }
774     userId = "\tUSERID: " + userId + "\n";
775     std::string bundleName = "\tBundleName: " + record->eventRecordInfo.bundleName + "\n";
776 
777     std::string permission = "\tRequiredPermission: ";
778     std::string separator;
779     size_t permissionNum = 0;
780     for (auto permissionVec : record->publishInfo->GetSubscriberPermissions()) {
781         if (permissionNum == 0) {
782             separator = "";
783         } else {
784             separator = ", ";
785         }
786         permission = permission + separator + permissionVec;
787         permissionNum++;
788     }
789     permission = permission + "\n";
790 
791     std::string isSticky;
792     if (record->publishInfo->IsSticky()) {
793         isSticky = "\tIsSticky: true\n";
794     } else {
795         isSticky = "\tIsSticky: false\n";
796     }
797 
798     std::string isOrdered;
799     if (record->publishInfo->IsOrdered()) {
800         isOrdered = "\tIsOrdered: true\n";
801     } else {
802         isOrdered = "\tIsOrdered: false\n";
803     }
804     std::string isSystemApp = record->eventRecordInfo.isSystemApp ? "true" : "false";
805     isSystemApp = "\tIsSystemApp: " + isSystemApp + "\n";
806     std::string isSystemEvent = record->isSystemEvent ? "true" : "false";
807     isSystemEvent = "\tIsSystemEvent: " + isSystemEvent + "\n";
808 
809     std::string action = "\t\tAction: " + record->commonEventData->GetWant().GetAction() + "\n";
810 
811     std::string entities = "\t\tEntity: ";
812     size_t entityNum = 0;
813     for (auto entitiesVec : record->commonEventData->GetWant().GetEntities()) {
814         if (entityNum == 0) {
815             separator = "";
816         } else {
817             separator = ", ";
818         }
819         entities = entities + separator + entitiesVec;
820         entityNum++;
821     }
822     entities = entities + "\n";
823 
824     std::string scheme = "\t\tScheme: " + record->commonEventData->GetWant().GetScheme() + "\n";
825     std::string uri = "\t\tUri: " + record->commonEventData->GetWant().GetUriString() + "\n";
826     std::string flags = "\t\tFlags: " + std::to_string(record->commonEventData->GetWant().GetFlags()) + "\n";
827     std::string type = "\t\tType: " + record->commonEventData->GetWant().GetType() + "\n";
828     std::string bundle = "\t\tBundleName: " + record->commonEventData->GetWant().GetBundle() + "\n";
829     std::string ability = "\t\tAbilityName: " + record->commonEventData->GetWant().GetElement().GetAbilityName() + "\n";
830     std::string deviced = "\t\tDevicedID: " + record->commonEventData->GetWant().GetElement().GetDeviceID() + "\n";
831 
832     std::string want = "\tWant:\n" + action + entities + scheme + uri + flags + type + bundle + ability + deviced;
833     std::string code = "\tCode: " + std::to_string(record->commonEventData->GetCode()) + "\n";
834     std::string data = "\tData: " + record->commonEventData->GetData() + "\n";
835 
836     std::string lastSubscriber;
837     if (record->resultTo) {
838         lastSubscriber = "\tHasLastSubscriber: true\n";
839     } else {
840         lastSubscriber = "\tHasLastSubscriber: false\n";
841     }
842 
843     std::string state;
844     switch (record->state) {
845         case OrderedEventRecord::IDLE:
846             state = "\tEventState: IDLE\n";
847             break;
848         case OrderedEventRecord::RECEIVING:
849             state = "\tEventState: RECEIVING\n";
850             break;
851         case OrderedEventRecord::RECEIVED:
852             state = "\tEventState: RECEIVED\n";
853             break;
854     }
855 
856     std::string dispatchTime = "\tDispatchTime: " + std::to_string(record->dispatchTime) + "\n";
857     std::string receiverTime = "\tReceiverTime: " + std::to_string(record->receiverTime) + "\n";
858     std::string resultAbort = record->resultAbort ? "true" : "false";
859     resultAbort = "\tResultAbort: " + resultAbort + "\n";
860 
861     dumpInfo = recordTime + pid + uid + userId + bundleName + permission + isSticky + isOrdered + isSystemApp +
862                isSystemEvent + want + code + data + lastSubscriber + state + receiverTime + dispatchTime + resultAbort;
863 }
864 
DumpStateBySubscriberRecord(const std::shared_ptr<OrderedEventRecord> & record,std::string & dumpInfo)865 void CommonEventControlManager::DumpStateBySubscriberRecord(
866     const std::shared_ptr<OrderedEventRecord> &record, std::string &dumpInfo)
867 {
868     EVENT_LOGD("enter");
869 
870     if (record->receivers.empty()) {
871         dumpInfo = "\tSubscribers:\tNo information";
872         return;
873     }
874 
875     size_t num = 0;
876     for (auto receiver : record->receivers) {
877         num++;
878 
879         std::string title = std::to_string(num);
880         if (num == 1) {
881             title = "\tSubscribers:\tTotal " + std::to_string(record->receivers.size()) + " subscribers\n\tNO " +
882                     title + "\n";
883         } else {
884             title = "\tNO " + title + "\n";
885         }
886 
887         std::string dumpInfoBySubscriber;
888         DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->DumpDetailed(
889             title, receiver, "\t\t", dumpInfoBySubscriber);
890 
891         std::string deliveryState;
892         switch (record->deliveryState[num - 1]) {
893             case OrderedEventRecord::PENDING:
894                 deliveryState = "\t\tEventState: PENDING\n";
895                 break;
896             case OrderedEventRecord::DELIVERED:
897                 deliveryState = "\t\tEventState: DELIVERED\n";
898                 break;
899             case OrderedEventRecord::SKIPPED:
900                 deliveryState = "\t\tEventState: SKIPPED\n";
901                 break;
902             case OrderedEventRecord::TIMEOUT:
903                 deliveryState = "\t\tEventState: TIMEOUT\n";
904                 break;
905         }
906         dumpInfo = dumpInfo + dumpInfoBySubscriber + deliveryState;
907     }
908 }
909 
DumpState(const std::string & event,const int32_t & userId,std::vector<std::string> & state)910 void CommonEventControlManager::DumpState(
911     const std::string &event, const int32_t &userId, std::vector<std::string> &state)
912 {
913     EVENT_LOGD("enter");
914     std::vector<std::shared_ptr<OrderedEventRecord>> records;
915     std::vector<std::shared_ptr<OrderedEventRecord>> unorderedRecords;
916     std::vector<std::shared_ptr<OrderedEventRecord>> orderedRecords;
917     GetUnorderedEventRecords(event, userId, unorderedRecords);
918     GetOrderedEventRecords(event, userId, orderedRecords);
919     records.insert(records.end(), unorderedRecords.begin(), unorderedRecords.end());
920     records.insert(records.end(), orderedRecords.begin(), orderedRecords.end());
921 
922     if (records.empty()) {
923         state.emplace_back("Pending Events:\tNo information");
924         return;
925     }
926 
927     size_t num = 0;
928     for (auto record : records) {
929         num++;
930 
931         std::string no = std::to_string(num);
932         if (num == 1) {
933             no = "Pending Events:\tTotal " + std::to_string(records.size()) + " information\nNO " + no + "\n";
934         } else {
935             no = "NO " + no + "\n";
936         }
937         std::string commonEventRecord;
938         DumpStateByCommonEventRecord(record, commonEventRecord);
939         std::string subscriberRecord;
940         DumpStateBySubscriberRecord(record, subscriberRecord);
941         std::string stateInfo = no + commonEventRecord + subscriberRecord;
942         state.emplace_back(stateInfo);
943     }
944 }
945 
SendOrderedEventProcTimeoutHiSysEvent(const std::shared_ptr<EventSubscriberRecord> & subscriberRecord,const std::string & eventName)946 void CommonEventControlManager::SendOrderedEventProcTimeoutHiSysEvent(
947     const std::shared_ptr<EventSubscriberRecord> &subscriberRecord, const std::string &eventName)
948 {
949     if (subscriberRecord == nullptr) {
950         return;
951     }
952 
953     EventInfo eventInfo;
954     if (subscriberRecord->eventSubscribeInfo != nullptr) {
955         eventInfo.userId = subscriberRecord->eventSubscribeInfo->GetUserId();
956     }
957     eventInfo.subscriberName = subscriberRecord->eventRecordInfo.bundleName;
958     eventInfo.pid = subscriberRecord->eventRecordInfo.pid;
959     eventInfo.uid = static_cast<int32_t>(subscriberRecord->eventRecordInfo.uid);
960     eventInfo.eventName = eventName;
961     EventReport::SendHiSysEvent(ORDERED_EVENT_PROC_TIMEOUT, eventInfo);
962 }
963 }  // namespace EventFwk
964 }  // namespace OHOS