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