1#ifndef YAZE_UTIL_UI_THREAD_QUEUE_H_
2#define YAZE_UTIL_UI_THREAD_QUEUE_H_
5#include <condition_variable>
16#include "absl/status/status.h"
17#include "absl/status/statusor.h"
79 void SetWaker(std::function<
void()> waker);
83 bool Post(std::function<
void()> task);
110 template <
typename Fn,
typename R = std::invoke_result_t<Fn&>>
113 "RunOnUiThread requires a callable returning absl::Status "
114 "or absl::StatusOr<T>");
117 auto result = std::make_shared<std::optional<R>>();
118 auto shared_fn = std::make_shared<Fn>(std::move(fn));
120 [result, shared_fn]() { result->emplace((*shared_fn)()); }, timeout);
121 if (!wait_status.ok()) {
122 return R(wait_status);
124 if (!result->has_value()) {
125 return R(absl::InternalError(
"UI thread task produced no result"));
127 return std::move(**result);
131 template <
typename T>
133 template <
typename T>
140 std::condition_variable
cv;
150 absl::Status
RunAndWait(std::function<
void()> body,
151 std::chrono::milliseconds timeout);
Moves work from service threads (gRPC, HTTP) onto the UI thread.
std::thread::id ui_thread_id_
void BindToCurrentThread()
R RunOnUiThread(Fn fn, std::chrono::milliseconds timeout=kDefaultTimeout)
Runs fn on the UI thread and returns its result.
std::deque< Entry > queue_
UiThreadQueue(const UiThreadQueue &)=delete
bool Post(std::function< void()> task)
bool Enqueue(Entry entry)
UiThreadQueue & operator=(const UiThreadQueue &)=delete
std::function< void()> waker_
static UiThreadQueue & Get()
bool HasPendingTasks() const
absl::Status RunAndWait(std::function< void()> body, std::chrono::milliseconds timeout)
static constexpr std::chrono::milliseconds kDefaultTimeout
void SetWaker(std::function< void()> waker)
constexpr int kMainLoopHiddenWaitMs
int MainLoopEventWaitMs(const MainLoopIdleState &state)
Returns how long the frame loop may block waiting for an event.
constexpr std::chrono::milliseconds kMainLoopIdleAfter
constexpr int kMainLoopIdleWaitMs
Inputs for the frame loop's idle decision.
std::chrono::steady_clock::duration quiet_for
std::condition_variable cv
std::shared_ptr< Call > call
std::function< void()> task