llarp/ev/io_uring.hpp
Namespaces
| Name |
|---|
| llarp [crypto.hpp] |
| llarp::io_uring |
Classes
| Name | |
|---|---|
| class | llarp::io_uring::Loop |
Source code
#pragma once
#include "ev.hpp"
#include <llarp/util/thread/queue.hpp>
#include <liburing.h>
namespace llarp::io_uring
{
class Resource;
class Loop : public llarp::EventLoop, public std::enable_shared_from_this<Loop>
{
::io_uring m_Ring;
std::optional<std::thread::id> m_EventLoopThreadID;
using AtomicQueue_t = llarp::thread::Queue<std::function<void(void)>>;
AtomicQueue_t m_LogicCalls;
AtomicQueue_t m_DiskCalls;
AtomicQueue_t m_WorkCalls;
using Thread_ptr = std::shared_ptr<std::thread>;
Thread_ptr m_DiskThread;
std::vector<Thread_ptr> m_WorkerThreads;
std::vector<std::shared_ptr<Resource>> m_Handles;
std::vector<std::shared_ptr<Resource>> m_Timers;
llarp_time_t m_Now;
std::shared_ptr<EventLoopWakeup> m_LogicWaker;
std::shared_ptr<EventLoopWakeup> m_TickerWaker;
std::vector<std::function<void()>> m_Tickers;
std::atomic<bool> m_Run;
void
flush_logic();
public:
constexpr ::io_uring*
ring()
{
return &m_Ring;
};
Loop(size_t queue_size, size_t worker_threads);
~Loop() override = default;
template <typename Visit>
void
remove_handles_where(Visit v)
{
std::remove_if(m_Handles.begin(), m_Handles.end(), v);
}
void
run() override;
bool
running() const override;
llarp_time_t
time_now() const override;
void
call_later(llarp_time_t delay_ms, std::function<void(void)> callback) override;
void
stop() override;
bool
add_ticker(std::function<void(void)> ticker) override;
std::shared_ptr<EventLoopPoller>
add_poller(int fd, std::function<void(void)> callback) override;
bool
add_network_interface(
std::shared_ptr<llarp::vpn::NetworkInterface> netif,
std::function<void(llarp::net::IPPacket)> handler) override;
void
call_soon(std::function<void(void)> f) override;
std::shared_ptr<llarp::EventLoopWakeup>
make_waker(std::function<void()> callback) override;
std::shared_ptr<EventLoopRepeater>
make_repeater() override;
std::shared_ptr<llarp::UDPHandle>
make_udp(UDPReceiveFunc on_recv) override;
std::shared_ptr<uvw::Loop>
MaybeGetUVWLoop() override
{
return nullptr;
}
void
wakeup() override;
void
io_wakeup() const;
bool
inEventLoop() const override;
void
queue_work(std::unique_ptr<EventLoopWork> work) override;
void
queue_slow_work(std::unique_ptr<EventLoopWork> work) override;
size_t
num_worker_threads() const override;
};
} // namespace llarp::io_uring
Updated on 2026-01-10 at 22:49:45 +0000