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_;
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;
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;
}
_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;
}
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_);