Modify ANR Monitor 45/314145/2
authorHwankyu Jhun <h.jhun@samsung.com>
Mon, 8 Jul 2024 00:44:57 +0000 (09:44 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Mon, 8 Jul 2024 00:54:56 +0000 (09:54 +0900)
To prevent OOM, this patch adds only one idle source to the loop of
the main thread.

Change-Id: Ief73a5b48145c4f15786862170ad91a5e555c8b6
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/aul/anr_monitor.cc

index 13cce835d362a287edc26ebc1aa111725cf7b8c5..be74b960c09f8dd48b5c09fcbc66032c2abf0a31 100644 (file)
@@ -53,7 +53,7 @@ class AnrMonitor {
   bool disposed_ = true;
   GMainContext* context_ = nullptr;
   GMainLoop* loop_ = nullptr;
-  GSource* source_ = nullptr;
+  GSource* timer_source_ = nullptr;
   GSource* idle_source_ = nullptr;
   std::thread thread_;
   mutable std::recursive_mutex rec_mutex_;
@@ -75,7 +75,9 @@ void AnrMonitor::Dispose() {
   if (promise_) promise_->set_value();
 
   thread_.join();
-  g_source_unref(source_);
+  if (timer_source_ && !g_source_is_destroyed(timer_source_))
+    g_source_destroy(timer_source_);
+
   g_main_loop_unref(loop_);
   g_main_context_unref(context_);
   disposed_ = true;
@@ -136,10 +138,7 @@ gboolean AnrMonitor::NotifyCb(gpointer user_data) {
 
 gboolean AnrMonitor::IdleCb(gpointer user_data) {
   std::lock_guard<std::recursive_mutex> lock(anr_monitor.GetRecMutex());
-  GSource* source = static_cast<GSource*>(user_data);
-  GSource* idle_source = anr_monitor.GetIdleSource();
-  if (source == idle_source) anr_monitor.SetIdleSource(nullptr);
-
+  anr_monitor.SetIdleSource(nullptr);
   return G_SOURCE_REMOVE;
 }
 
@@ -150,9 +149,10 @@ gboolean AnrMonitor::TimeoutCb(gpointer user_data) {
     _E("[ANR] The main thread is unable to enter idle state.");
     _E("[ANR] Please modify the implementation so that the main loop does not "
        "create a block state.");
+  } else {
+    anr_monitor.AddIdlerToDefaultContext();
   }
 
-  anr_monitor.AddIdlerToDefaultContext();
   return G_SOURCE_CONTINUE;
 }
 
@@ -161,10 +161,10 @@ void AnrMonitor::RunThread() {
   pthread_setname_np(pthread_self(), "ANRMonitor+");
 
   AddIdlerToDefaultContext();
-  source_ = g_timeout_source_new(5000);
-  g_source_set_callback(source_, TimeoutCb, this, nullptr);
-  g_source_attach(source_, context_);
-  g_source_unref(source_);
+  timer_source_ = g_timeout_source_new(5000);
+  g_source_set_callback(timer_source_, TimeoutCb, this, nullptr);
+  g_source_attach(timer_source_, context_);
+  g_source_unref(timer_source_);
 
   g_main_context_push_thread_default(context_);
   g_main_loop_run(loop_);