#include "base/include/fml/message_loop.h"
#include <utility>
#include "base/include/fml/memory/ref_counted.h"
#include "base/include/fml/memory/ref_ptr.h"
#include "base/include/fml/message_loop_impl.h"
#include "base/include/fml/task_runner.h"
namespace lynx {
namespace fml {
namespace {
std::unique_ptr<MessageLoop>& GetThreadLocalLooper() {
thread_local std::unique_ptr<MessageLoop> tls_message_loop_instance;
return tls_message_loop_instance;
}
}
MessageLoop& MessageLoop::GetCurrent() {
auto* loop = GetThreadLocalLooper().get();
LYNX_BASE_CHECK(loop != nullptr);
return *loop;
}
MessageLoop& MessageLoop::EnsureInitializedForCurrentThread(
void* platform_loop) {
auto& looper_storage = GetThreadLocalLooper();
if (looper_storage == nullptr) {
looper_storage.reset(new MessageLoop(platform_loop));
}
return *looper_storage;
}
MessageLoop* MessageLoop::IsInitializedForCurrentThread() {
return GetThreadLocalLooper().get();
}
MessageLoop::MessageLoop(void* platform_loop)
: loop_(MessageLoopImpl::Create(platform_loop)),
task_runner_(fml::MakeRefCounted<fml::TaskRunner>(loop_)) {
LYNX_BASE_CHECK(loop_);
LYNX_BASE_CHECK(task_runner_);
loop_->Bind(task_runner_->GetTaskQueueId());
}
MessageLoop::~MessageLoop() = default;
void MessageLoop::Run() { loop_->DoRun(); }
void MessageLoop::Terminate() { loop_->DoTerminate(); }
const fml::RefPtr<fml::TaskRunner>& MessageLoop::GetTaskRunner() const {
return task_runner_;
}
const fml::RefPtr<MessageLoopImpl>& MessageLoop::GetLoopImpl() const {
return loop_;
}
void MessageLoop::AddTaskObserver(intptr_t key, base::closure callback) {
loop_->AddTaskObserver(key, std::move(callback));
}
void MessageLoop::RemoveTaskObserver(intptr_t key) {
loop_->RemoveTaskObserver(key);
}
void MessageLoop::RunExpiredTasksNow() { loop_->RunExpiredTasksNow(); }
void MessageLoop::SetMessageLoopRestrictionDuration(
fml::TimeDelta restriction_duration) {
loop_->SetRestrictionDuration(restriction_duration);
}
TaskQueueId MessageLoop::GetCurrentTaskQueueId() {
auto* loop = GetThreadLocalLooper().get();
LYNX_BASE_CHECK(loop != nullptr);
return loop->GetTaskRunner()->GetTaskQueueId();
}
void MessageLoop::Bind(const TaskQueueId& queue_id) {
if (queue_id == task_runner_->GetTaskQueueId()) {
return;
}
loop_->Bind(queue_id);
}
void MessageLoop::UnBind(const TaskQueueId& queue_id) {
LYNX_BASE_CHECK(queue_id != task_runner_->GetTaskQueueId());
loop_->UnBind(queue_id);
}
}
}