/
auroraos
/
mirror_gn
Обзор
Документация
Войти
/
auroraos
/
mirror_gn
Код
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
main
src/util/msg_loop.cc
83 строки
2 KB
Andrew Grieve
Fix bug in Grow logic in HashTableBase
18 июн 2025, 15:55
18 июн 2025, 15:55
8734223
Код
Авторство
О чём код?
// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "util/msg_loop.h" #include "base/logging.h" namespace { #if !defined(OS_ZOS) thread_local MsgLoop* g_current; #else // TODO(gabylb) - zos: thread_local not yet supported, use zoslib's impl'n: __tlssim<MsgLoop*> __g_current_impl(nullptr); #define g_current (*__g_current_impl.access()) #endif } // namespace MsgLoop::MsgLoop() { DCHECK(g_current == nullptr); g_current = this; } MsgLoop::~MsgLoop() { DCHECK(g_current == this); g_current = nullptr; } void MsgLoop::Run() { should_quit_ = false; while (!should_quit_) { std::function<void()> task; { std::unique_lock<std::mutex> queue_lock(queue_mutex_); notifier_.wait(queue_lock, [this]() { return (!task_queue_.empty()) || should_quit_; }); if (should_quit_) return; task = std::move(task_queue_.front()); task_queue_.pop(); } task(); } } void MsgLoop::PostQuit() { PostTask([this]() { should_quit_ = true; }); } void MsgLoop::PostTask(std::function<void()> work) { { std::unique_lock<std::mutex> queue_lock(queue_mutex_); task_queue_.emplace(std::move(work)); } notifier_.notify_one(); } void MsgLoop::RunUntilIdleForTesting() { for (bool done = false; !done;) { std::function<void()> task; { std::unique_lock<std::mutex> queue_lock(queue_mutex_); task = std::move(task_queue_.front()); task_queue_.pop(); if (task_queue_.empty()) done = true; } task(); } } MsgLoop* MsgLoop::Current() { return g_current; }