1 /*
2  * Copyright (c) 2021-2023 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 #ifndef BASE_EVENTHANDLER_INTERFACES_INNER_API_INNER_EVENT_H
17 #define BASE_EVENTHANDLER_INTERFACES_INNER_API_INNER_EVENT_H
18 
19 #include <cstdint>
20 #include <chrono>
21 #include <functional>
22 #include <memory>
23 #include <string>
24 #include <typeinfo>
25 #include <variant>
26 
27 #include "nocopyable.h"
28 
29 namespace OHOS {
30 namespace HiviewDFX {
31 class HiTraceId;
32 }
33 
34 namespace AppExecFwk {
35 constexpr static uint32_t TYPE_U32_INDEX = 0u;
36 using HiTraceId = OHOS::HiviewDFX::HiTraceId;
37 
38 class EventHandler;
39 
40 constexpr const char* LINE_SEPARATOR = "\n";
41 
42 struct Caller {
43     std::string file_ {""};
44     int         line_ {0};
45     std::string func_ {""};
46     std::string dfxName_ {""};
47 #if __has_builtin(__builtin_FILE)
48     Caller(std::string file = __builtin_FILE(), int line = __builtin_LINE(),
49            std::string func = __builtin_FUNCTION())
50         : file_(file), line_(line), func_(func) {}
51 #else
CallerCaller52     Caller() {}
53 #endif
ToStringCaller54     std::string ToString() const
55     {
56         if (file_.empty()) {
57             return std::string("[ ]");
58         }
59         size_t split = file_.find_last_of("/\\");
60         if (split == std::string::npos) {
61             split = 0;
62         }
63         std::string caller("[" + file_.substr(split + 1) + "(" + func_ + ":" + std::to_string(line_) +
64             dfxName_ + ")]");
65         return caller;
66     }
67 
ClearCallerCaller68     void ClearCaller()
69     {
70         file_ = "";
71         func_ = "";
72         line_ = 0;
73     }
74 };
75 
76 class InnerEvent final {
77 public:
78     using Clock = std::chrono::steady_clock;
79     using TimePoint = std::chrono::time_point<Clock>;
80     using Callback = std::function<void()>;
81     using Pointer = std::unique_ptr<InnerEvent, void (*)(InnerEvent *)>;
82     using EventId = std::variant<uint32_t, std::string>;
83     class Waiter {
84     public:
85         Waiter() = default;
86         virtual ~Waiter() = default;
87         DISALLOW_COPY_AND_MOVE(Waiter);
88 
89         virtual void Wait() = 0;
90         virtual void Notify() = 0;
91     };
92 
93     DISALLOW_COPY_AND_MOVE(InnerEvent);
94 
95     /**
96      * Get InnerEvent instance from pool.
97      *
98      * @param innerEventId The id of the event.
99      * @param param Basic parameter of the event, default is 0.
100      * @param caller Caller info of the event, default is caller's file, func and line.
101      * @return Returns the pointer of InnerEvent instance.
102      */
103     static Pointer Get(uint32_t innerEventId, int64_t param = 0, const Caller &caller = {});
104 
105     /**
106      * Get InnerEvent instance from pool.
107      *
108      * @param innerEventId The id of the event.
109      * @param param Basic parameter of the event, default is 0.
110      * @param caller Caller info of the event, default is caller's file, func and line.
111      * @return Returns the pointer of InnerEvent instance.
112      */
113     static Pointer Get(const EventId &innerEventId, int64_t param = 0, const Caller &caller = {});
114 
115     /**
116      * Get InnerEvent instance from pool.
117      *
118      * @param innerEventId The id of the event.
119      * @param object Shared pointer of the object.
120      * @param param Basic parameter of the event, default is 0.
121      * @param caller Caller info of the event, default is caller's file, func and line.
122      * @return Returns the pointer of InnerEvent instance.
123      */
124     template<typename T>
125     static inline Pointer Get(uint32_t innerEventId, const std::shared_ptr<T> &object,
126                               int64_t param = 0, const Caller &caller = {})
127     {
128         auto event = Get(innerEventId, param, caller);
129         event->SaveSharedPtr(object);
130         return event;
131     }
132 
133     /**
134      * Get InnerEvent instance from pool.
135      *
136      * @param innerEventId The id of the event.
137      * @param object Shared pointer of the object.
138      * @param param Basic parameter of the event, default is 0.
139      * @param caller Caller info of the event, default is caller's file, func and line.
140      * @return Returns the pointer of InnerEvent instance.
141      */
142     template<typename T>
143     static inline Pointer Get(const EventId &innerEventId, const std::shared_ptr<T> &object,
144                               int64_t param = 0, const Caller &caller = {})
145     {
146         auto event = Get(innerEventId, param, caller);
147         event->SaveSharedPtr(object);
148         return event;
149     }
150 
151     /**
152      * Get InnerEvent instance from pool.
153      *
154      * @param innerEventId The id of the event.
155      * @param object Weak pointer of the object.
156      * @param param Basic parameter of the event, default is 0.
157      * @param caller Caller info of the event, default is caller's file, func and line.
158      * @return Returns the pointer of InnerEvent instance.
159      */
160     template<typename T>
161     static inline Pointer Get(uint32_t innerEventId, const std::weak_ptr<T> &object,
162                               int64_t param = 0, const Caller &caller = {})
163     {
164         auto event = Get(innerEventId, param, caller);
165         event->SaveSharedPtr(object);
166         return event;
167     }
168 
169     /**
170      * Get InnerEvent instance from pool.
171      *
172      * @param innerEventId The id of the event.
173      * @param object Weak pointer of the object.
174      * @param param Basic parameter of the event, default is 0.
175      * @param caller Caller info of the event, default is caller's file, func and line.
176      * @return Returns the pointer of InnerEvent instance.
177      */
178     template<typename T>
179     static inline Pointer Get(const EventId &innerEventId, const std::weak_ptr<T> &object,
180                               int64_t param = 0, const Caller &caller = {})
181     {
182         auto event = Get(innerEventId, param, caller);
183         event->SaveSharedPtr(object);
184         return event;
185     }
186 
187     /**
188      * Get InnerEvent instance from pool.
189      *
190      * @param innerEventId The id of the event.
191      * @param object Unique pointer of the object.
192      * @param param Basic parameter of the event, default is 0.
193      * @param caller Caller info of the event, default is caller's file, func and line.
194      * @return Returns the pointer of InnerEvent instance.
195      */
196     template<typename T, typename D>
197     static inline Pointer Get(uint32_t innerEventId, std::unique_ptr<T, D> &&object,
198                               int64_t param = 0, const Caller &caller = {})
199     {
200         auto event = Get(innerEventId, param, caller);
201         event->SaveUniquePtr(object);
202         return event;
203     }
204 
205     /**
206      * Get InnerEvent instance from pool.
207      *
208      * @param innerEventId The id of the event.
209      * @param object Unique pointer of the object.
210      * @param param Basic parameter of the event, default is 0.
211      * @param caller Caller info of the event, default is caller's file, func and line.
212      * @return Returns the pointer of InnerEvent instance.
213      */
214     template<typename T, typename D>
215     static inline Pointer Get(const EventId &innerEventId, std::unique_ptr<T, D> &&object,
216                               int64_t param = 0, const Caller &caller = {})
217     {
218         auto event = Get(innerEventId, param, caller);
219         event->SaveUniquePtr(object);
220         return event;
221     }
222 
223     /**
224      * Get InnerEvent instance from pool.
225      *
226      * @param innerEventId The id of the event.
227      * @param object Unique pointer of the object.
228      * @param param Basic parameter of the event, default is 0.
229      * @param caller Caller info of the event, default is caller's file, func and line.
230      * @return Returns the pointer of InnerEvent instance.
231      */
232     template<typename T, typename D>
233     static inline Pointer Get(uint32_t innerEventId, std::unique_ptr<T, D> &object,
234                               int64_t param = 0, const Caller &caller = {})
235     {
236         auto event = Get(innerEventId, param, caller);
237         event->SaveUniquePtr(object);
238         return event;
239     }
240 
241     /**
242      * Get InnerEvent instance from pool.
243      *
244      * @param innerEventId The id of the event.
245      * @param object Unique pointer of the object.
246      * @param param Basic parameter of the event, default is 0.
247      * @param caller Caller info of the event, default is caller's file, func and line.
248      * @return Returns the pointer of InnerEvent instance.
249      */
250     template<typename T, typename D>
251     static inline Pointer Get(const EventId &innerEventId, std::unique_ptr<T, D> &object,
252                               int64_t param = 0, const Caller &caller = {})
253     {
254         auto event = Get(innerEventId, param, caller);
255         event->SaveUniquePtr(object);
256         return event;
257     }
258 
259     /**
260      * Get InnerEvent instance from pool.
261      *
262      * @param innerEventId The id of the event.
263      * @param param Basic parameter of the event.
264      * @param object Shared pointer of the object.
265      * @param caller Caller info of the event, default is caller's file, func and line.
266      * @return Returns the pointer of InnerEvent instance.
267      */
268     template<typename T>
269     static inline Pointer Get(uint32_t innerEventId, int64_t param, const std::shared_ptr<T> &object,
270                               const Caller &caller = {})
271     {
272         auto event = Get(innerEventId, param, caller);
273         event->SaveSharedPtr(object);
274         return event;
275     }
276 
277     /**
278      * Get InnerEvent instance from pool.
279      *
280      * @param innerEventId The id of the event.
281      * @param param Basic parameter of the event.
282      * @param object Shared pointer of the object.
283      * @param caller Caller info of the event, default is caller's file, func and line.
284      * @return Returns the pointer of InnerEvent instance.
285      */
286     template<typename T>
287     static inline Pointer Get(const EventId &innerEventId, int64_t param, const std::shared_ptr<T> &object,
288                               const Caller &caller = {})
289     {
290         auto event = Get(innerEventId, param, caller);
291         event->SaveSharedPtr(object);
292         return event;
293     }
294 
295     /**
296      * Get InnerEvent instance from pool.
297      *
298      * @param innerEventId The id of the event.
299      * @param param Basic parameter of the event.
300      * @param object Weak pointer of the object.
301      * @param caller Caller info of the event, default is caller's file, func and line.
302      * @return Returns the pointer of InnerEvent instance.
303      */
304     template<typename T>
305     static inline Pointer Get(uint32_t innerEventId, int64_t param, const std::weak_ptr<T> &object,
306                               const Caller &caller = {})
307     {
308         auto event = Get(innerEventId, param, caller);
309         event->SaveSharedPtr(object);
310         return event;
311     }
312 
313     /**
314      * Get InnerEvent instance from pool.
315      *
316      * @param innerEventId The id of the event.
317      * @param param Basic parameter of the event.
318      * @param object Weak pointer of the object.
319      * @param caller Caller info of the event, default is caller's file, func and line.
320      * @return Returns the pointer of InnerEvent instance.
321      */
322     template<typename T>
323     static inline Pointer Get(const EventId &innerEventId, int64_t param, const std::weak_ptr<T> &object,
324                               const Caller &caller = {})
325     {
326         auto event = Get(innerEventId, param, caller);
327         event->SaveSharedPtr(object);
328         return event;
329     }
330 
331     /**
332      * Get InnerEvent instance from pool.
333      *
334      * @param innerEventId The id of the event.
335      * @param param Basic parameter of the event.
336      * @param object Unique pointer of the object.
337      * @param caller Caller info of the event, default is caller's file, func and line.
338      * @return Returns the pointer of InnerEvent instance.
339      */
340     template<typename T, typename D>
341     static inline Pointer Get(uint32_t innerEventId, int64_t param, std::unique_ptr<T, D> &&object,
342                               const Caller &caller = {})
343     {
344         auto event = Get(innerEventId, param, caller);
345         event->SaveUniquePtr(object);
346         return event;
347     }
348 
349     /**
350      * Get InnerEvent instance from pool.
351      *
352      * @param innerEventId The id of the event.
353      * @param param Basic parameter of the event.
354      * @param object Unique pointer of the object.
355      * @param caller Caller info of the event, default is caller's file, func and line.
356      * @return Returns the pointer of InnerEvent instance.
357      */
358     template<typename T, typename D>
359     static inline Pointer Get(const EventId &innerEventId, int64_t param, std::unique_ptr<T, D> &&object,
360                               const Caller &caller = {})
361     {
362         auto event = Get(innerEventId, param, caller);
363         event->SaveUniquePtr(object);
364         return event;
365     }
366 
367     /**
368      * Get InnerEvent instance from pool.
369      *
370      * @param innerEventId The id of the event.
371      * @param param Basic parameter of the event.
372      * @param object Unique pointer of the object.
373      * @param caller Caller info of the event, default is caller's file, func and line.
374      * @return Returns the pointer of InnerEvent instance.
375      */
376     template<typename T, typename D>
377     static inline Pointer Get(uint32_t innerEventId, int64_t param, std::unique_ptr<T, D> &object,
378                               const Caller &caller = {})
379     {
380         auto event = Get(innerEventId, param, caller);
381         event->SaveUniquePtr(object);
382         return event;
383     }
384 
385     /**
386      * Get InnerEvent instance from pool.
387      *
388      * @param innerEventId The id of the event.
389      * @param param Basic parameter of the event.
390      * @param object Unique pointer of the object.
391      * @param caller Caller info of the event, default is caller's file, func and line.
392      * @return Returns the pointer of InnerEvent instance.
393      */
394     template<typename T, typename D>
395     static inline Pointer Get(const EventId &innerEventId, int64_t param, std::unique_ptr<T, D> &object,
396                               const Caller &caller = {})
397     {
398         auto event = Get(innerEventId, param, caller);
399         event->SaveUniquePtr(object);
400         return event;
401     }
402 
403     /**
404      * Get InnerEvent instance from pool.
405      *
406      * @param callback Callback for task.
407      * @param name Name of task.
408      * @param caller Caller info of the event, default is caller's file, func and line.
409      * @return Returns the pointer of InnerEvent instance, if callback is invalid, returns nullptr object.
410      */
411     static Pointer Get(const Callback &callback, const std::string &name = std::string(),
412                        const Caller &caller = {});
413 
414     /**
415      * Get InnerEvent instance from pool.
416      *
417      * @return Returns the pointer of InnerEvent instance
418      */
419     static Pointer Get();
420 
421     /**
422      * Get owner of the event.
423      *
424      * @return Returns owner of the event after it has been sent.
425      */
GetOwner()426     inline std::shared_ptr<EventHandler> GetOwner() const
427     {
428         return owner_.lock();
429     }
430 
431     /**
432      * Get weak owner of the event.
433      *
434      * @return Returns owner of the event after it has been sent.
435      */
GetWeakOwner()436     inline std::weak_ptr<EventHandler> GetWeakOwner() const
437     {
438         return owner_;
439     }
440 
441     /**
442      * Set owner of the event.
443      *
444      * @param owner Owner for the event.
445      */
SetOwner(const std::shared_ptr<EventHandler> & owner)446     inline void SetOwner(const std::shared_ptr<EventHandler> &owner)
447     {
448         owner_ = owner;
449     }
450 
451     /**
452      * Get handle time of the event.
453      *
454      * @return Returns handle time of the event after it has been sent.
455      */
GetHandleTime()456     inline const TimePoint &GetHandleTime() const
457     {
458         return handleTime_;
459     }
460 
461     /**
462      * Set handle time of the event.
463      *
464      * @param handleTime Handle time of the event.
465      */
SetHandleTime(const TimePoint & handleTime)466     inline void SetHandleTime(const TimePoint &handleTime)
467     {
468         handleTime_ = handleTime;
469     }
470 
471     /**
472      * Get send time of the event.
473      *
474      * @return Returns send time of the event after it has been sent.
475      */
GetSendTime()476     inline const TimePoint &GetSendTime() const
477     {
478         return sendTime_;
479     }
480 
481     /**
482      * Set send time of the event.
483      *
484      * @param sendTime Send time of the event.
485      */
SetSendTime(const TimePoint & sendTime)486     inline void SetSendTime(const TimePoint &sendTime)
487     {
488         sendTime_ = sendTime;
489     }
490 
491     /**
492      * Set send kernel thread id of the event.
493      *
494      * @param senderKernelThreadId Send kernel thread id of the event
495      */
SetSenderKernelThreadId(uint64_t senderKernelThreadId)496     inline void SetSenderKernelThreadId(uint64_t senderKernelThreadId)
497     {
498         senderKernelThreadId_ = senderKernelThreadId;
499     }
500 
501     /**
502      * Get the kernel thread id of the event.
503      *
504      * @return Returns kernel thread id of the event after it has been sent.
505      */
GetSenderKernelThreadId()506     inline uint64_t GetSenderKernelThreadId()
507     {
508         return senderKernelThreadId_;
509     }
510 
511     /**
512      * Get id of the event.
513      * Make sure {@link #hasTask} returns false.
514      *
515      * @return Returns id of the event after it has been sent.
516      */
GetInnerEventId()517     inline uint32_t GetInnerEventId() const
518     {
519         if (innerEventId_.index() != TYPE_U32_INDEX) {
520             return 0u;
521         }
522         return std::get<uint32_t>(innerEventId_);
523     }
524 
525     /**
526      * Get id of the event.
527      * Make sure {@link #hasTask} returns false.
528      *
529      * @return Returns id of the event after it has been sent.
530      */
GetInnerEventIdEx()531     inline EventId GetInnerEventIdEx() const
532     {
533         return innerEventId_;
534     }
535 
536     /**
537      * Get basic param of the event.
538      * Make sure {@link #hasTask} returns false.
539      *
540      * @return Returns basic param of the event after it has been sent.
541      */
GetParam()542     inline int64_t GetParam() const
543     {
544         return param_;
545     }
546 
547     /**
548      * Get saved object.
549      *
550      * @return Returns shared pointer of saved object.
551      */
552     template<typename T>
GetSharedObject()553     std::shared_ptr<T> GetSharedObject() const
554     {
555         const std::shared_ptr<T> &sharedObject = *reinterpret_cast<const std::shared_ptr<T> *>(smartPtr_);
556         if (CalculateSmartPtrTypeId(sharedObject) == smartPtrTypeId_) {
557             return sharedObject;
558         }
559 
560         const std::weak_ptr<T> &weakObject = *reinterpret_cast<const std::weak_ptr<T> *>(smartPtr_);
561         if (CalculateSmartPtrTypeId(weakObject) == smartPtrTypeId_) {
562             return weakObject.lock();
563         }
564 
565         WarnSmartPtrCastMismatch();
566         return nullptr;
567     }
568 
569     /**
570      * Get saved object.
571      *
572      * @return Returns unique pointer of saved object.
573      */
574     template<typename T>
GetUniqueObject()575     std::unique_ptr<T> GetUniqueObject() const
576     {
577         std::unique_ptr<T> &object = *reinterpret_cast<std::unique_ptr<T> *>(smartPtr_);
578         if (CalculateSmartPtrTypeId(object) == smartPtrTypeId_) {
579             return std::move(object);
580         }
581 
582         WarnSmartPtrCastMismatch();
583         return nullptr;
584     }
585 
586     /**
587      * Get saved object.
588      *
589      * @return Returns unique pointer of saved object.
590      */
591     template<typename T, typename D>
GetUniqueObject()592     std::unique_ptr<T, D> GetUniqueObject() const
593     {
594         std::unique_ptr<T, D> &object = *reinterpret_cast<std::unique_ptr<T, D> *>(smartPtr_);
595         if (CalculateSmartPtrTypeId(object) == smartPtrTypeId_) {
596             return std::move(object);
597         }
598 
599         WarnSmartPtrCastMismatch();
600         return std::unique_ptr<T, D>(nullptr, nullptr);
601     }
602 
603     /**
604      * Get task name.
605      * Make sure {@link #hasTask} returns true.
606      *
607      * @return Returns the task name.
608      */
GetTaskName()609     inline const std::string &GetTaskName() const
610     {
611         return taskName_;
612     }
613 
614     /**
615      * Get task callback.
616      * Make sure {@link #hasTask} returns true.
617      *
618      * @return Returns the callback of the task.
619      */
GetTaskCallback()620     inline const Callback &GetTaskCallback() const
621     {
622         return taskCallback_;
623     }
624 
625     /**
626      * Get task caller info.
627      *
628      * @return Returns the caller info of the task.
629      */
GetCaller()630     inline Caller &GetCaller()
631     {
632         return caller_;
633     }
634 
635     /**
636      * Obtains the Runnable task that will be executed when this InnerEvent is handled.
637      *
638      * @return Returns the callback of the task.
639      */
GetTask()640     inline const Callback &GetTask() const
641     {
642         return GetTaskCallback();
643     }
644 
645     /**
646      * Check whether it takes a task callback in event.
647      *
648      * @return Returns true if it takes a task callback.
649      */
HasTask()650     inline bool HasTask() const
651     {
652         return static_cast<bool>(taskCallback_);
653     }
654 
655     /**
656      * Convert TimePoint to human readable string.
657      *
658      * @param time object represent time
659      */
660     static std::string DumpTimeToString(const TimePoint &time);
661 
662     /**
663      * Convert std::chrono::system_clock::time_point to human readable string.
664      *
665      * @param time object represent time
666      */
667     static std::string DumpTimeToString(const std::chrono::system_clock::time_point &time);
668 
669     /**
670      * Prints out the internal information about an object in the specified format,
671      * helping you diagnose internal errors of the object.
672      *
673      * @param return The content of the event.
674      */
675     std::string Dump();
676 
677     /**
678      * Prints out the internal information about an object in the specified format,
679      * helping you diagnose internal errors of the object.
680      *
681      * @param return The content of the event for trace.
682      */
683     std::string TraceInfo();
684 
685     /**
686      * Set uniqueId in event.
687      */
688     void SetEventUniqueId();
689 
690     /**
691      * Get uniqueId for event.
692      *
693      * @return Returns uniqueId for event.
694      */
GetEventUniqueId()695     inline std::string GetEventUniqueId()
696     {
697         return eventId;
698     }
699 
700     /**
701      * Get event priority.
702      *
703      * @return Returns uniqueId for event.
704      */
GetEventPriority()705     inline int32_t GetEventPriority()
706     {
707         return priority;
708     }
709 
710     /**
711      * Set event priority.
712      */
SetEventPriority(int32_t prio)713     inline void SetEventPriority(int32_t prio)
714     {
715         priority = prio;
716     }
717 
718     /**
719      * Set ownerId.
720      */
SetOwnerId(std::string ownerId)721     inline void SetOwnerId(std::string ownerId)
722     {
723         ownerId_ = ownerId;
724     }
725 
726     /**
727      * Get ownerId.
728      */
GetOwnerId()729     inline std::string GetOwnerId()
730     {
731         return ownerId_;
732     }
733 
734     /**
735      * Set delayTime.
736      */
SetDelayTime(int64_t delayTime)737     inline void SetDelayTime(int64_t delayTime)
738     {
739         delayTime_ = delayTime;
740     }
741 
742     /**
743      * Get delayTime.
744      */
GetDelayTime()745     inline int64_t GetDelayTime()
746     {
747         return delayTime_;
748     }
749 
750 private:
751     using SmartPtrDestructor = void (*)(void *);
752 
753     InnerEvent() = default;
754     ~InnerEvent() = default;
755 
756     void ClearEvent();
757 
758     static void WarnSmartPtrCastMismatch();
759 
760     template<typename T>
ReleaseSmartPtr(void * smartPtr)761     static void ReleaseSmartPtr(void *smartPtr)
762     {
763         if (smartPtr != nullptr) {
764             delete reinterpret_cast<T *>(smartPtr);
765         }
766     }
767 
768     template<typename T>
SaveSharedPtr(const T & object)769     inline void SaveSharedPtr(const T &object)
770     {
771         smartPtrDtor_ = ReleaseSmartPtr<T>;
772         smartPtrTypeId_ = CalculateSmartPtrTypeId(object);
773         smartPtr_ = new (std::nothrow) T(object);
774         if (smartPtr_ == nullptr) {
775             return;
776         }
777     }
778 
779     template<typename T>
SaveUniquePtr(T & object)780     inline void SaveUniquePtr(T &object)
781     {
782         smartPtrDtor_ = ReleaseSmartPtr<T>;
783         smartPtrTypeId_ = CalculateSmartPtrTypeId(object);
784         smartPtr_ = new (std::nothrow) T(std::move(object));
785         if (smartPtr_ == nullptr) {
786             return;
787         }
788     }
789 
790     /**
791      * if event has trace id ,return trace id, else create span id,
792      * store it in event and return.
793      *
794      * @return return hiTrace Id.
795      */
796     const std::shared_ptr<HiTraceId> GetOrCreateTraceId();
797 
798     /**
799      * return trace id.
800      *
801      * @return return hiTrace Id.
802      */
803     const std::shared_ptr<HiTraceId> GetTraceId();
804 
805     /*
806      * Calculate the type id for different smart pointers.
807      */
808 #ifdef __GXX_RTTI
809     // If RTTI(Run-Time Type Info) is enabled, use hash code of type info.
810     template<typename T>
CalculateSmartPtrTypeId(const T &)811     static inline size_t CalculateSmartPtrTypeId(const T &)
812     {
813         return typeid(T).hash_code();
814     }
815 #else   // #ifdef __GXX_RTTI
816     // Otherwise, generate type id using smart pointer type and the size of the elements they contain.
817     static const size_t SHARED_PTR_TYPE = 0x10000000;
818     static const size_t WEAK_PTR_TYPE = 0x20000000;
819     static const size_t UNIQUE_PTR_TYPE = 0x30000000;
820     static const size_t UNIQUE_PTR_ARRAY_TYPE = 0x40000000;
821 
822     template<typename T>
CalculateSmartPtrTypeId(const std::shared_ptr<T> &)823     static inline size_t CalculateSmartPtrTypeId(const std::shared_ptr<T> &)
824     {
825         return (sizeof(T) | SHARED_PTR_TYPE);
826     }
827 
828     template<typename T>
CalculateSmartPtrTypeId(const std::weak_ptr<T> &)829     static inline size_t CalculateSmartPtrTypeId(const std::weak_ptr<T> &)
830     {
831         return (sizeof(T) | WEAK_PTR_TYPE);
832     }
833 
834     template<typename T, typename D>
CalculateSmartPtrTypeId(const std::unique_ptr<T,D> &)835     static inline size_t CalculateSmartPtrTypeId(const std::unique_ptr<T, D> &)
836     {
837         return (sizeof(T) | (sizeof(D) - 1) | UNIQUE_PTR_TYPE);
838     }
839 
840     template<typename T, typename D>
CalculateSmartPtrTypeId(const std::unique_ptr<T[],D> &)841     static inline size_t CalculateSmartPtrTypeId(const std::unique_ptr<T[], D> &)
842     {
843         return (sizeof(T) | (sizeof(D) - 1) | UNIQUE_PTR_ARRAY_TYPE);
844     }
845 #endif  // #ifdef __GXX_RTTI
846 
847     // Used by event handler to create waiter.
848     const std::shared_ptr<Waiter> &CreateWaiter();
849 
850     // Used by event handler to tell whether event has waiter.
851     bool HasWaiter() const;
852 
853     // Let event pool to create instance of events.
854     friend class InnerEventPool;
855     // Let event handler to access private interface.
856     friend class EventHandler;
857 
858     std::weak_ptr<EventHandler> owner_;
859     TimePoint handleTime_;
860     TimePoint sendTime_;
861     uint64_t senderKernelThreadId_{0};
862 
863     // Event id of the event, if it is not a task object
864     EventId innerEventId_ = 0u;
865 
866     // Simple parameter for the event.
867     int64_t param_{0};
868 
869     // Using to save smart pointer
870     size_t smartPtrTypeId_{0};
871     void *smartPtr_{nullptr};
872     SmartPtrDestructor smartPtrDtor_{nullptr};
873 
874     // Task callback and its name.
875     Callback taskCallback_;
876     std::string taskName_;
877 
878     // Task event caller info
879     Caller caller_;
880 
881     // Used for synchronized event.
882     std::shared_ptr<Waiter> waiter_;
883 
884     // use to store hitrace Id
885     std::shared_ptr<HiTraceId> hiTraceId_;
886 
887     // use to store event unique Id
888     std::string eventId;
889 
890     int32_t priority = -1;
891 
892     std::string ownerId_;
893 
894     int64_t delayTime_ = 0;
895 };
896 }  // namespace AppExecFwk
897 }  // namespace OHOS
898 
899 #endif  // #ifndef BASE_EVENTHANDLER_INTERFACES_INNER_API_INNER_EVENT_H
900