Use NoDestructor in a couple obvious places.
Use NoDestructor for some deliberately leaked timer maps. Fix some nits
to slightly simplify the code, and remove time vs. timer naming
confusion.
Change-Id: I57db73e50891dc58f5bae2666a3618699d3a76bf
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/64450
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcrt/cfx_timer.cpp b/core/fxcrt/cfx_timer.cpp
index 057cda6..6ffb625 100644
--- a/core/fxcrt/cfx_timer.cpp
+++ b/core/fxcrt/cfx_timer.cpp
@@ -8,12 +8,14 @@
#include <map>
+#include "third_party/base/no_destructor.h"
+
namespace {
-std::map<int32_t, CFX_Timer*>& GetPWLTimeMap() {
- // Leak the object at shutdown.
- static auto* timeMap = new std::map<int32_t, CFX_Timer*>;
- return *timeMap;
+using TimerMap = std::map<int32_t, CFX_Timer*>;
+TimerMap& GetPWLTimerMap() {
+ static pdfium::base::NoDestructor<TimerMap> timer_map;
+ return *timer_map;
}
} // namespace
@@ -26,19 +28,19 @@
m_pCallbackIface(pCallbackIface) {
ASSERT(m_pCallbackIface);
if (HasValidID())
- GetPWLTimeMap()[m_nTimerID] = this;
+ GetPWLTimerMap()[m_nTimerID] = this;
}
CFX_Timer::~CFX_Timer() {
if (HasValidID()) {
m_pTimerHandler->KillTimer(m_nTimerID);
- GetPWLTimeMap().erase(m_nTimerID);
+ GetPWLTimerMap().erase(m_nTimerID);
}
}
// static
void CFX_Timer::TimerProc(int32_t idEvent) {
- auto it = GetPWLTimeMap().find(idEvent);
- if (it != GetPWLTimeMap().end())
+ auto it = GetPWLTimerMap().find(idEvent);
+ if (it != GetPWLTimerMap().end())
it->second->m_pCallbackIface->OnTimerFired();
}
diff --git a/fxjs/global_timer.cpp b/fxjs/global_timer.cpp
index b3049a0..b837508 100644
--- a/fxjs/global_timer.cpp
+++ b/fxjs/global_timer.cpp
@@ -10,14 +10,14 @@
#include "core/fxcrt/timerhandler_iface.h"
#include "fxjs/cjs_app.h"
+#include "third_party/base/no_destructor.h"
namespace {
using TimerMap = std::map<int32_t, GlobalTimer*>;
-TimerMap* GetGlobalTimerMap() {
- // Leak the timer array at shutdown.
- static auto* s_TimerMap = new TimerMap;
- return s_TimerMap;
+TimerMap& GetGlobalTimerMap() {
+ static pdfium::base::NoDestructor<TimerMap> timer_map;
+ return *timer_map;
}
} // namespace
@@ -35,7 +35,7 @@
m_pRuntime(pRuntime),
m_pEmbedApp(pObj) {
if (HasValidID())
- (*GetGlobalTimerMap())[m_nTimerID] = this;
+ GetGlobalTimerMap()[m_nTimerID] = this;
}
GlobalTimer::~GlobalTimer() {
@@ -45,13 +45,13 @@
if (m_pRuntime && m_pRuntime->GetTimerHandler())
m_pRuntime->GetTimerHandler()->KillTimer(m_nTimerID);
- GetGlobalTimerMap()->erase(m_nTimerID);
+ GetGlobalTimerMap().erase(m_nTimerID);
}
// static
void GlobalTimer::Trigger(int32_t nTimerID) {
- auto it = GetGlobalTimerMap()->find(nTimerID);
- if (it == GetGlobalTimerMap()->end())
+ auto it = GetGlobalTimerMap().find(nTimerID);
+ if (it == GetGlobalTimerMap().end())
return;
GlobalTimer* pTimer = it->second;
@@ -63,8 +63,8 @@
pTimer->m_pEmbedApp->TimerProc(pTimer);
// Timer proc may have destroyed timer, find it again.
- it = GetGlobalTimerMap()->find(nTimerID);
- if (it == GetGlobalTimerMap()->end())
+ it = GetGlobalTimerMap().find(nTimerID);
+ if (it == GetGlobalTimerMap().end())
return;
pTimer = it->second;
@@ -75,8 +75,8 @@
// static
void GlobalTimer::Cancel(int32_t nTimerID) {
- auto it = GetGlobalTimerMap()->find(nTimerID);
- if (it == GetGlobalTimerMap()->end())
+ auto it = GetGlobalTimerMap().find(nTimerID);
+ if (it == GetGlobalTimerMap().end())
return;
GlobalTimer* pTimer = it->second;