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