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