event/IdleEvent: make a special case of DeferEvent

This commit is contained in:
Max Kellermann
2020-12-01 17:04:14 +01:00
parent 990f2dc1cf
commit c58aaf545f
7 changed files with 66 additions and 70 deletions

View File

@@ -47,7 +47,6 @@ namespace Uring { class Queue; class Manager; }
#endif
class TimerEvent;
class IdleEvent;
class DeferEvent;
class InjectEvent;
@@ -58,7 +57,7 @@ class InjectEvent;
* thread that runs it, except where explicitly documented as
* thread-safe.
*
* @see SocketEvent, MultiSocketMonitor, TimerEvent, IdleEvent
* @see SocketEvent, MultiSocketMonitor, TimerEvent, DeferEvent, InjectEvent
*/
class EventLoop final
{
@@ -83,8 +82,10 @@ class EventLoop final
DeferList defer;
using IdleList = IntrusiveList<IdleEvent>;
IdleList idle;
/**
* This is like #defer, but gets invoked when the loop is idle.
*/
DeferList idle;
#ifdef HAVE_THREADED_EVENT_LOOP
Mutex mutex;
@@ -203,14 +204,13 @@ public:
*/
bool AbandonFD(SocketEvent &event) noexcept;
void AddIdle(IdleEvent &i) noexcept;
void AddTimer(TimerEvent &t, Event::Duration d) noexcept;
/**
* Schedule a call to DeferEvent::RunDeferred().
*/
void AddDeferred(DeferEvent &d) noexcept;
void AddIdle(DeferEvent &e) noexcept;
#ifdef HAVE_THREADED_EVENT_LOOP
/**
@@ -238,6 +238,13 @@ public:
private:
void RunDeferred() noexcept;
/**
* Invoke one "idle" #DeferEvent.
*
* @return false if there was no such event
*/
bool RunOneIdle() noexcept;
#ifdef HAVE_THREADED_EVENT_LOOP
/**
* Invoke all pending InjectEvents.