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