mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2025-12-16 01:48:56 +08:00
Remove pthread dependency
Some checks are pending
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (cl, cl, windows-latest) (push) Waiting to run
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (clang, clang++, macos-latest) (push) Waiting to run
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (clang, clang++, ubuntu-latest) (push) Waiting to run
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (gcc, g++, macos-latest) (push) Waiting to run
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (gcc, g++, ubuntu-latest) (push) Waiting to run
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (cl, Windows MSVC, windows-latest) (push) Waiting to run
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, Linux GCC, ubuntu-latest) (push) Waiting to run
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Waiting to run
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, MacOS clang, macos-latest) (push) Waiting to run
Build / Test modules (llvm, ubuntu-latest) (push) Waiting to run
Documentation / documentation (push) Waiting to run
Some checks are pending
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (cl, cl, windows-latest) (push) Waiting to run
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (clang, clang++, macos-latest) (push) Waiting to run
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (clang, clang++, ubuntu-latest) (push) Waiting to run
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (gcc, g++, macos-latest) (push) Waiting to run
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (gcc, g++, ubuntu-latest) (push) Waiting to run
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (cl, Windows MSVC, windows-latest) (push) Waiting to run
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, Linux GCC, ubuntu-latest) (push) Waiting to run
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Waiting to run
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, MacOS clang, macos-latest) (push) Waiting to run
Build / Test modules (llvm, ubuntu-latest) (push) Waiting to run
Documentation / documentation (push) Waiting to run
This commit is contained in:
77
src/ftxui/component/task_runner.cpp
Normal file
77
src/ftxui/component/task_runner.cpp
Normal file
@@ -0,0 +1,77 @@
|
||||
// Copyright 2024 Arthur Sonzogni. All rights reserved.
|
||||
// Use of this source code is governed by the MIT license that can be found in
|
||||
// the LICENSE file.
|
||||
#include "ftxui/component/task_runner.hpp"
|
||||
|
||||
#include <cassert>
|
||||
#include <thread>
|
||||
|
||||
namespace ftxui::task {
|
||||
|
||||
static thread_local TaskRunner* current_task_runner = nullptr; // NOLINT
|
||||
|
||||
TaskRunner::TaskRunner() {
|
||||
assert(!previous_task_runner_);
|
||||
previous_task_runner_ = current_task_runner;
|
||||
current_task_runner = this;
|
||||
}
|
||||
|
||||
TaskRunner::~TaskRunner() {
|
||||
current_task_runner = previous_task_runner_;
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
auto TaskRunner::Current() -> TaskRunner* {
|
||||
assert(current_task_runner);
|
||||
return current_task_runner;
|
||||
}
|
||||
|
||||
auto TaskRunner::PostTask(Task task) -> void {
|
||||
queue_.PostTask(PendingTask{std::move(task)});
|
||||
}
|
||||
|
||||
auto TaskRunner::PostDelayedTask(Task task,
|
||||
std::chrono::steady_clock::duration duration)
|
||||
-> void {
|
||||
queue_.PostTask(PendingTask{std::move(task), duration});
|
||||
}
|
||||
|
||||
/// Runs the tasks in the queue.
|
||||
auto TaskRunner::RunUntilIdle()
|
||||
-> std::optional<std::chrono::steady_clock::duration> {
|
||||
while (true) {
|
||||
auto maybe_task = queue_.Get();
|
||||
if (std::holds_alternative<std::monostate>(maybe_task)) {
|
||||
// No more tasks to execute, exit the loop.
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
if (std::holds_alternative<Task>(maybe_task)) {
|
||||
executed_tasks_++;
|
||||
std::get<Task>(maybe_task)();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (std::holds_alternative<std::chrono::steady_clock::duration>(
|
||||
maybe_task)) {
|
||||
return std::get<std::chrono::steady_clock::duration>(maybe_task);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto TaskRunner::Run() -> void {
|
||||
while (true) {
|
||||
auto duration = RunUntilIdle();
|
||||
if (!duration) {
|
||||
// No more tasks to execute, exit the loop.
|
||||
return;
|
||||
}
|
||||
|
||||
// Sleep for the duration until the next task can be executed.
|
||||
std::this_thread::sleep_for(duration.value());
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace ftxui::task
|
||||
|
||||
Reference in New Issue
Block a user