mirror of
https://github.com/openharmony/notification_distributed_notification_service.git
synced 2026-08-24 07:03:05 -04:00
dfb21d3fcf
DelayedSingleton<AnsNotification>::GetInstance() returns different
singleton objects in different shared libraries because the template's
static members (instance_, mutex_) have vague linkage (COMDAT) and are
hidden per-SO by -fvisibility=hidden + version scripts.
Solution:
1. Add AnsNotification::GetInstance() using function-local static
(C++11 thread-safe, defined out-of-line in ans_notification.cpp
within libans_innerkits, symbol exported via *Ans* in .map)
2. Replace ALL callers (NAPI/ANI/Tools/Tests/CJ FFI) from
DelayedSingleton<AnsNotification>::GetInstance() to
AnsNotification::GetInstance()
3. Fix singleton.h include hygiene:
- Add #include singleton.h to 34 files that use Singleton<>,
DelayedSingleton<>, DECLARE_SINGLETON etc. but relied on
transitive includes
- Add #include nocopyable.h to 7 files that use
DISALLOW_COPY_AND_MOVE but relied on transitive includes
- Remove #include singleton.h from 70 files that no longer use
any singleton.h symbols after the DelayedSingleton replacement
The function-local static in ans_notification.cpp lives in
libans_innerkits.so's data segment. AnsNotification::GetInstance() is
a non-inline member function compiled only in libans_innerkits.so and
exported via *Ans* pattern in libans_innerkits.map. All SOs call this
exported function through dynamic linking, sharing the single instance.
Co-Authored-By: Agent
Signed-off-by: CheerfulRicky <yuegang7@h-partners.com>
Change-Id: I1089cfa5bb010daf37c68333a1e71c55fc1f16f3