@@ -14,6 +14,7 @@ import eventcore.drivers.posix.sockets;
1414import eventcore.drivers.posix.watchers;
1515import eventcore.drivers.posix.processes;
1616import eventcore.drivers.posix.pipes;
17+ import eventcore.drivers.posix.uring;
1718import eventcore.drivers.timer;
1819import eventcore.drivers.threadedfile;
1920import eventcore.internal.consumablequeue : ConsumableQueue;
@@ -37,10 +38,13 @@ private long currStdTime()
3738 return Clock .currStdTime;
3839}
3940
41+ version (EventcoreEpollUsesUring) {
42+ version (EventcoreEpollDriver) {}
43+ else { static assert (false , " uring only supported together with epoll for now" ); }
44+ }
45+
4046final class PosixEventDriver (Loop : PosixEventLoop) : EventDriver {
4147@safe : /* @nogc:*/ nothrow :
42-
43-
4448 private {
4549 alias CoreDriver = PosixEventDriverCore! (Loop, TimerDriver, EventsDriver, ProcessDriver);
4650 alias EventsDriver = PosixEventDriverEvents! (Loop, SocketsDriver);
@@ -51,7 +55,8 @@ final class PosixEventDriver(Loop : PosixEventLoop) : EventDriver {
5155 version (Windows ) alias DNSDriver = EventDriverDNS_GHBN! (EventsDriver, SignalsDriver);
5256 else version (EventcoreUseGAIA) alias DNSDriver = EventDriverDNS_GAIA! (EventsDriver, SignalsDriver);
5357 else alias DNSDriver = EventDriverDNS_GAI! (EventsDriver, SignalsDriver);
54- alias FileDriver = ThreadedFileEventDriver! (EventsDriver, CoreDriver);
58+ version (EventcoreEpollUsesUring) alias FileDriver = UringDriverFiles;
59+ else alias FileDriver = ThreadedFileEventDriver! (EventsDriver, CoreDriver);
5560 version (Posix ) alias PipeDriver = PosixEventDriverPipes! Loop;
5661 else alias PipeDriver = DummyEventDriverPipes! Loop;
5762 version (linux ) alias WatcherDriver = InotifyEventDriverWatchers! EventsDriver;
@@ -78,6 +83,8 @@ final class PosixEventDriver(Loop : PosixEventLoop) : EventDriver {
7883 this ()
7984 @nogc @trusted {
8085 m_loop = mallocT! Loop;
86+ version (EventcoreEpollUsesUring)
87+ m_uring = mallocT! UringCore;
8188 m_sockets = mallocT! SocketsDriver(m_loop);
8289 m_events = mallocT! EventsDriver(m_loop, m_sockets);
8390 m_signals = mallocT! SignalsDriver(m_loop);
@@ -86,7 +93,8 @@ final class PosixEventDriver(Loop : PosixEventLoop) : EventDriver {
8693 m_processes = mallocT! ProcessDriver(m_loop, this );
8794 m_core = mallocT! CoreDriver(m_loop, m_timers, m_events, m_processes);
8895 m_dns = mallocT! DNSDriver(m_events, m_signals);
89- m_files = mallocT! FileDriver(m_events, m_core);
96+ version (EventcoreEpollUsesUring) m_files = mallocT! FileDriver(m_uring);
97+ else m_files = mallocT! FileDriver(m_events, m_core);
9098 m_watchers = mallocT! WatcherDriver(m_events);
9199 }
92100
@@ -174,7 +182,8 @@ final class PosixEventDriver(Loop : PosixEventLoop) : EventDriver {
174182}
175183
176184
177- final class PosixEventDriverCore (Loop : PosixEventLoop, Timers : EventDriverTimers, Events : EventDriverEvents, Processes : EventDriverProcesses) : EventDriverCore {
185+ final class PosixEventDriverCore (Loop : PosixEventLoop, Timers : EventDriverTimers, Events : EventDriverEvents, Processes : EventDriverProcesses)
186+ : EventDriverCore {
178187@safe nothrow :
179188 import core.atomic : atomicLoad, atomicStore;
180189 import core.sync.mutex : Mutex ;
@@ -208,6 +217,7 @@ final class PosixEventDriverCore(Loop : PosixEventLoop, Timers : EventDriverTime
208217 m_threadCallbackMutex = mallocT! (shared (Mutex ));
209218 m_threadCallbacks = mallocT! (ConsumableQueue! ThreadCallbackEntry);
210219 m_threadCallbacks.reserve (1000 );
220+ // m_loop.registerEventID(m_wakeupEvent);
211221 }
212222
213223 final void dispose ()
@@ -221,7 +231,9 @@ final class PosixEventDriverCore(Loop : PosixEventLoop, Timers : EventDriverTime
221231 } catch (Exception e) assert (false , e.msg);
222232 }
223233
224- @property size_t waiterCount() const { return m_loop.m_waiterCount + m_timers.pendingCount + m_processes.pendingCount; }
234+ @property size_t waiterCount() const {
235+ return m_loop.m_waiterCount + m_timers.pendingCount + m_processes.pendingCount;
236+ }
225237
226238 @property Loop loop() { return m_loop; }
227239
@@ -239,12 +251,11 @@ final class PosixEventDriverCore(Loop : PosixEventLoop, Timers : EventDriverTime
239251 if (! waiterCount) {
240252 return ExitReason.outOfWaiters;
241253 }
242-
243254 bool got_events;
244-
245255 if (timeout <= 0. seconds) {
246256 got_events = m_loop.doProcessEvents(0. seconds);
247257 m_timers.process(MonoTime.currTime);
258+ version (EventcoreEpollUsesUring) got_events |= m_uring.doProcessEvents(0. seconds);
248259 } else {
249260 auto now = MonoTime.currTime;
250261 do {
@@ -253,6 +264,7 @@ final class PosixEventDriverCore(Loop : PosixEventLoop, Timers : EventDriverTime
253264 auto prev_step = now;
254265 now = MonoTime.currTime;
255266 got_events |= m_timers.process(now);
267+ version (EventcoreEpollUsesUring) got_events |= m_uring.doProcessEvents(0. seconds);
256268 if (timeout != Duration.max)
257269 timeout -= now - prev_step;
258270 } while (timeout > 0. seconds && ! m_exit && ! got_events);
@@ -343,7 +355,7 @@ package class PosixEventLoop {
343355 import core.time : Duration;
344356
345357 package {
346- AlgebraicChoppedVector! (FDSlot, StreamSocketSlot, StreamListenSocketSlot, DgramSocketSlot, DNSSlot, WatcherSlot, EventSlot, SignalSlot, PipeSlot) m_fds;
358+ AlgebraicChoppedVector! (FDSlot, StreamSocketSlot, StreamListenSocketSlot, DgramSocketSlot, DNSSlot, WatcherSlot, EventSlot, SignalSlot, PipeSlot, UringSlot ) m_fds;
347359 size_t m_handleCount = 0 ;
348360 size_t m_waiterCount = 0 ;
349361 }
@@ -385,8 +397,8 @@ package class PosixEventLoop {
385397 del(FD (i, m_fds[i].common.validationCounter));
386398 }
387399
388- package (eventcore.drivers) final void addWaiter() { m_waiterCount++ ; }
389- package (eventcore.drivers) final void removeWaiter() { m_waiterCount-- ; }
400+ package (eventcore.drivers) final void addWaiter() @nogc { m_waiterCount++ ; }
401+ package (eventcore.drivers) final void removeWaiter() @nogc { m_waiterCount-- ; }
390402
391403 package void setNotifyCallback(EventType evt)(FD fd, FDSlotCallback callback)
392404 {
0 commit comments