Giter Club home page Giter Club logo

eventcore's People

Contributors

andrejmitrovic avatar benjaminschaaf avatar boris-barboris avatar boriscarvajal avatar calebccff avatar cogitri avatar cschlote avatar dkgroot avatar dlang-bot avatar drug007 avatar geod24 avatar henkkalkwater avatar kubo39 avatar l-kramer avatar marcioapm avatar martinnowak avatar omerfirmak avatar panke avatar pinver avatar rracariu avatar s-ludwig avatar tusanga avatar vladimmi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

eventcore's Issues

Implement RIO based Windows sockets

Starting with Windows 8, RIO is available as a new socket IO mechanism that can provide considerable performance improvements over traditional overlapped I/O. Support for this can be determined at runtime.

UPD broadcast

I've not find a way to turn on the SO_BROADCAST option for UDP sockets: is it possible?

assert error in eventcore #2

I'm not sure, whether the eventcore is the culprit, or something of my program.
But the stack trace does not contain anything of mine, so I post it here, down below.
If you need my code, it is not available yet, but it will be later.

Assertion failure @/Users/alex/.dub/packages/eventcore-0.8.39/eventcore/source/eventcore/drivers/posix/events.d(224): Invalid eventID.
------------------------
??:? object.Throwable.TraceInfo core.runtime.defaultTraceHandler(void*) [0x1092ce52b]
??:? void eventcore.internal.utils.nogc_assert(bool, immutable(char)[], immutable(char)[], int).__lambda5() [0x1091123aa]
??:? nothrow @nogc @trusted void eventcore.internal.utils.nogc_assert(bool, immutable(char)[], immutable(char)[], int) [0x10911233c]
??:? _D9eventcore7drivers5posix6events__T22PosixEventDriverEventsHTCQCjQCcQBx6kqueue15KqueueEventLoopHTCQDtQDmQDh7sockets__T23PosixEventDriverSocketsHTQDgZQBfZQEo4waitMFNbNiNfSQGn6driver__T6HandleVAyaa5_6576656e74TSQIaQBn__TQBjVQBfa2_6664TmVmN1ZQCeVQBjS1N1ZQCqDFNbNfQDnZvZv [0x1090fed6c]
??:? nothrow @nogc @safe eventcore.drivers.posix.dns.EventDriverDNS_GAI!(eventcore.drivers.posix.events.PosixEventDriverEvents!(eventcore.drivers.posix.kqueue.KqueueEventLoop, eventcore.drivers.posix.sockets.PosixEventDriverSockets!(eventcore.drivers.posix.kqueue.KqueueEventLoop).PosixEventDriverSockets).PosixEventDriverEvents, eventcore.drivers.posix.signals.DummyEventDriverSignals!(eventcore.drivers.posix.kqueue.KqueueEventLoop).DummyEventDriverSignals).EventDriverDNS_GAI eventcore.drivers.posix.dns.EventDriverDNS_GAI!(eventcore.drivers.posix.events.PosixEventDriverEvents!(eventcore.drivers.posix.kqueue.KqueueEventLoop, eventcore.drivers.posix.sockets.PosixEventDriverSockets!(eventcore.drivers.posix.kqueue.KqueueEventLoop).PosixEventDriverSockets).PosixEventDriverEvents, eventcore.drivers.posix.signals.DummyEventDriverSignals!(eventcore.drivers.posix.kqueue.KqueueEventLoop).DummyEventDriverSignals).EventDriverDNS_GAI.__ctor(eventcore.drivers.posix.events.PosixEventDriverEvents!(eventcore.drivers.posix.kqueue.KqueueEventLoop, eventcore.drivers.posix.sockets.PosixEventDriverSockets!(eventcore.drivers.posix.kqueue.KqueueEventLoop).PosixEventDriverSockets).PosixEventDriverEvents, eventcore.drivers.posix.signals.DummyEventDriverSignals!(eventcore.drivers.posix.kqueue.KqueueEventLoop).DummyEventDriverSignals) [0x1090fb39a]
??:? nothrow @nogc @trusted eventcore.drivers.posix.dns.EventDriverDNS_GAI!(eventcore.drivers.posix.events.PosixEventDriverEvents!(eventcore.drivers.posix.kqueue.KqueueEventLoop, eventcore.drivers.posix.sockets.PosixEventDriverSockets!(eventcore.drivers.posix.kqueue.KqueueEventLoop).PosixEventDriverSockets).PosixEventDriverEvents, eventcore.drivers.posix.signals.DummyEventDriverSignals!(eventcore.drivers.posix.kqueue.KqueueEventLoop).DummyEventDriverSignals).EventDriverDNS_GAI eventcore.internal.utils.mallocT!(eventcore.drivers.posix.dns.EventDriverDNS_GAI!(eventcore.drivers.posix.events.PosixEventDriverEvents!(eventcore.drivers.posix.kqueue.KqueueEventLoop, eventcore.drivers.posix.sockets.PosixEventDriverSockets!(eventcore.drivers.posix.kqueue.KqueueEventLoop).PosixEventDriverSockets).PosixEventDriverEvents, eventcore.drivers.posix.signals.DummyEventDriverSignals!(eventcore.drivers.posix.kqueue.KqueueEventLoop).DummyEventDriverSignals).EventDriverDNS_GAI, eventcore.drivers.posix.events.PosixEventDriverEvents!(eventcore.drivers.posix.kqueue.KqueueEventLoop, eventcore.drivers.posix.sockets.PosixEventDriverSockets!(eventcore.drivers.posix.kqueue.KqueueEventLoop).PosixEventDriverSockets).PosixEventDriverEvents, eventcore.drivers.posix.signals.DummyEventDriverSignals!(eventcore.drivers.posix.kqueue.KqueueEventLoop).DummyEventDriverSignals).mallocT(eventcore.drivers.posix.events.PosixEventDriverEvents!(eventcore.drivers.posix.kqueue.KqueueEventLoop, eventcore.drivers.posix.sockets.PosixEventDriverSockets!(eventcore
??:? nothrow @nogc @trusted eventcore.drivers.posix.driver.PosixEventDriver!(eventcore.drivers.posix.kqueue.KqueueEventLoop).PosixEventDriver eventcore.drivers.posix.driver.PosixEventDriver!(eventcore.drivers.posix.kqueue.KqueueEventLoop).PosixEventDriver.__ctor() [0x1090fc4ff]
??:? nothrow @nogc @trusted eventcore.drivers.posix.driver.PosixEventDriver!(eventcore.drivers.posix.kqueue.KqueueEventLoop).PosixEventDriver eventcore.internal.utils.mallocT!(eventcore.drivers.posix.driver.PosixEventDriver!(eventcore.drivers.posix.kqueue.KqueueEventLoop).PosixEventDriver).mallocT() [0x1091189d9]
??:? nothrow @property @nogc @safe eventcore.drivers.posix.driver.PosixEventDriver!(eventcore.drivers.posix.kqueue.KqueueEventLoop).PosixEventDriver eventcore.core.eventDriver() [0x1090e816b]
??:? shared nothrow @safe int vibe.core.sync.ManualEvent.doWaitShared!(false).doWaitShared(core.time.Duration, int) [0x1090a2bcf]
??:? @safe void vibe.core.sync.TaskCondition.wait() [0x1090a17e0]
??:? bool std.concurrency.MessageBox.get!(void delegate(ulong)).get(scope void delegate(ulong)) [0x108f9f5ae]
??:? thread_entryPoint [0x1092d06f6]
??:? _pthread_body [0x7fff57ee9660]
??:? _pthread_start [0x7fff57ee950c]
Program exited with code -6

Trying to get StreamSocketSlot but have none.

On unknown circumstances, when trying to close a TCPConnection an assert occurs:

core.exception.AssertError@../../.dub/packages/taggedalgebraic-0.10.11/taggedalgebraic/source/taggedalgebraic.d(781): Trying to get StreamSocketSlot but have none.
??:? _d_assert_msg [0xf6ee7bae]
??:? pure nothrow ref @safe inout(eventcore.drivers.posix.sockets.StreamSocketSlot) taggedalgebraic.get!(eventcore.drivers.posix.sockets.StreamSocketSlot, eventcore.internal.utils.AlgebraicChoppedVector!(eventcore.drivers.posix.driver.FDSlot, eventcore.drivers.posix.sockets.StreamSocketSlot, eventcore.drivers.posix.sockets.StreamListenSocketSlot, eventcore.drivers.posix.sockets.DgramSocketSlot, eventcore.drivers.posix.dns.DNSSlot, eventcore.drivers.posix.watchers.WatcherSlot, eventcore.drivers.posix.events.EventSlot, eventcore.drivers.posix.signals.SignalSlot).AlgebraicChoppedVector.U).get(ref inout(taggedalgebraic.TaggedAlgebraic!(eventcore.internal.utils.AlgebraicChoppedVector!(eventcore.drivers.posix.driver.FDSlot, eventcore.drivers.posix.sockets.StreamSocketSlot, eventcore.drivers.posix.sockets.StreamListenSocketSlot, eventcore.drivers.posix.sockets.DgramSocketSlot, eventcore.drivers.posix.dns.DNSSlot, eventcore.drivers.posix.watchers.WatcherSlot, eventcore.drivers.posix.events.EventSlot, eventcore.drivers.posix.signals.SignalSlot).AlgebraicChoppedVector.U).TaggedAlgebraic)) [0x55c88dae]
??:? pure nothrow ref @property @safe eventcore.drivers.posix.sockets.StreamSocketSlot eventcore.internal.utils.AlgebraicChoppedVector!(eventcore.drivers.posix.driver.FDSlot, eventcore.drivers.posix.sockets.StreamSocketSlot, eventcore.drivers.posix.sockets.StreamListenSocketSlot, eventcore.drivers.posix.sockets.DgramSocketSlot, eventcore.drivers.posix.dns.DNSSlot, eventcore.drivers.posix.watchers.WatcherSlot, eventcore.drivers.posix.events.EventSlot, eventcore.drivers.posix.signals.SignalSlot).AlgebraicChoppedVector.FullField.streamSocket() [0x55c85eef]
??:? _D9eventcore7drivers5posix7sockets__T23PosixEventDriverSocketsHTCQClQCeQBz5epoll14EpollEventLoopZQCi8shutdownMFNbNfSQEk6driver__T6HandleVAyaa12_73747265616d536f636b6574TSQGmQCc__TQByVQBua6_736f636b6574TSQHtQDj__TQDfVQDba2_6664TmVmN1ZQEaVQBjS1N1ZQEmVQDcS1S1N1ZQFabbZv [0x55c7d575]
??:? nothrow @safe void vibe.core.net.TCPConnection.close() [0x55c41dcd]
??:? void myprogram.method(shared(MyObject), bool).__lambda3() [0x55b17373]
??:? nothrow @trusted void vibe.core.core.setTimer(core.time.Duration, void delegate(), bool).__lambda4() [0x55c39d3c]
??:? @safe void vibe.core.core.createTimer(void delegate() nothrow @safe).__lambda2(void delegate() nothrow @safe, vibe.core.core.Timer) [0x55c39f75]
??:? void vibe.core.task.TaskFuncInfo.set!(void function(void delegate() nothrow @safe, vibe.core.core.Timer) @safe*, void delegate() nothrow @safe, vibe.core.core.Timer).set(ref void function(void delegate() nothrow @safe, vibe.core.core.Timer) @safe*, ref void delegate() nothrow @safe, ref vibe.core.core.Timer).callDelegate(ref vibe.core.task.TaskFuncInfo) [0x55c568f1]
??:? void vibe.core.task.TaskFuncInfo.call() [0x55c55299]
??:? nothrow void vibe.core.task.TaskFiber.run() [0x55c548a1]
??:? void core.thread.Fiber.run() [0xf6eec65b]
??:? fiber_entryPoint [0xf6eeba26]
??:? [0xffffffff]

TCPConnection is not closed from anywhere else in the code.

LNK4255 warning when compiling examples under Windows 7 x86-64

> dub build --arch=x86_64 --single http-server.d
Performing "debug" build using dmd for x86_64.
taggedalgebraic 0.10.7: building configuration "library"...
eventcore 0.8.21: building configuration "winapi"...
http-server-example ~master: building configuration "application"...
Linking...
eventcore.lib(driver.obj) : warning LNK4255: library contain multiple objects of the same name; linking object as if no debug info

This is stripping all debug info and making it impossible to have proper stack traces, which is aggravating. If I pass the --combined flag to dub, it doesn't output the warning; x86 builds are fine too.

EPoll register

Hi,
in posix/epoll.d on line 72 you have 2 times EPOLLRDHUP

if (mask & EventMask.status) ev.events |= EPOLLERR|EPOLLRDHUP|EPOLLRDHUP;

shouldn't it be EPOLLRDHUP | EPOLLHUP ?

Compile errors on FreeBSD 11.1

See log:

[majestio@freebsd ~/Projects/webapp]$ dub
Performing "debug" build using /usr/local/bin/dmd for x86_64.
taggedalgebraic 0.10.11: target for configuration "library" is up to date.
eventcore 0.8.34: building configuration "kqueue"...
/home/majestio/.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/kqueue.d(43,46): Error: function 'eventcore.drivers.posix.kqueue.KqueueEventLoop.this.__lambda1' is not nothrow
/home/majestio/.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/kqueue.d(41,2): Error: nothrow constructor 'eventcore.drivers.posix.kqueue.KqueueEventLoop.this' may throw
/home/majestio/.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/kqueue.d(60,20): Error: function 'core.sys.freebsd.sys.event.kevent' is not nothrow
/home/majestio/.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/kqueue.d(48,16): Error: nothrow function 'eventcore.drivers.posix.kqueue.KqueueEventLoop.doProcessEvents' may throw
/usr/local/bin/dmd failed with exit code 1.

:(

Loop between epoll_wait and accept4

When accept4 returns -1, eventcore doesn't check any errno value, and when it returns errno 24 (too many files), an infinite loop occurs.

A loop somewhere between epoll_wait and accept4 occurs when trying to connect to vibe.d webpage when worker then attempts lots of connections to other servers:

#0  0x00007f02e7476ff7 in accept4 (fd=21, addr=..., addr_len=0x7ffc4d279388,    flags=526336) at ../sysdeps/unix/sysv/linux/accept4.c:40
#1  0x000056425a54e756 in _D9eventcore7drivers5posix7sockets__T23PosixEventDriverSocketsHTCQClQCeQBz5epoll14EpollEventLoopZQCi8onAcceptMFNbNfSQEk6driver__T6HandleVAyaa2_6664TmVmN1ZQzZ9__lambda2MFNbNiNeZv (this=0x7ffc4d279400)    at ../../.dub/packages/eventcore-0.8.27/eventcore/source/eventcore/drivers/posix/sockets.d:244
#2  0x000056425a54e551 in _D9eventcore7drivers5posix7sockets__T23PosixEventDriverSocketsHTCQClQCeQBz5epoll14EpollEventLoopZQCi8onAcceptMFNbNfSQEk6driver__T6HandleVAyaa2_6664TmVmN1ZQzZv (this=0x7f02e966f000, listenfd=...)    at ../../.dub/packages/eventcore-0.8.27/eventcore/source/eventcore/drivers/posix/sockets.d:244
#3  0x000056425a5605fa in _D9eventcore7drivers5posix6driver14PosixEventLoop__T6notifyVEQChQCaQBvQBs9EventTypei0ZQBiMFNbNfSQDqQCv__T6HandleVAyaa2_6664TmVmN1ZQzZv (    this=0x7f02e966d080, fd=...)    at ../../.dub/packages/eventcore-0.8.27/eventcore/source/eventcore/drivers/posix/driver.d:230
#4  0x000056425a54c43a in eventcore.drivers.posix.epoll.EpollEventLoop.doProcessEvents(core.time.Duration) (this=0x7f02e966d080, timeout=...)    at ../../.dub/packages/eventcore-0.8.27/eventcore/source/eventcore/drivers/posix/epoll.d:55
#5  0x000056425a54bf20 in _D9eventcore7drivers5posix6driver__T20PosixEventDriverCoreHTCQChQCaQBv5epoll14EpollEventLoopHTCQDpQDi5timer22LoopTimeoutTimerDriverHTCQFcQEvQEq6events__T22PosixEventDriverEventsHTQEpHTCQHbQGuQGp7sockets__T23PosixEventDriverSocketsHTQGqZQBfZQDjZQIa13processEventsMFNbNfS4core4time8DurationZEQLcQKh10ExitReason (    this=0x7f02e9670040, timeout=...)    at ../../.dub/packages/eventcore-0.8.27/eventcore/source/eventcore/drivers/posix/driver.d:141
#6  0x000056425a525eeb in vibe.core.task.TaskScheduler.process() (this=...)    at ../../.dub/packages/vibe-core-1.4.0-alpha.1/vibe-core/source/vibe/core/task.d:675
#7  0x000056425a525fcd in vibe.core.task.TaskScheduler.waitAndProcess() (this=...)    at ../../.dub/packages/vibe-core-1.4.0-alpha.1/vibe-core/source/vibe/core/task.d:713
#8  0x000056425a50a76c in _D4vibe4coreQf12runEventLoopFNbNfZi ()    at ../../.dub/packages/vibe-core-1.4.0-alpha.1/vibe-core/source/vibe/core/core.d:218
#9  0x000056425a50a5f2 in _D4vibe4coreQf14runApplicationFNfPAAyaZi (args_out=0x0)    at ../../.dub/packages/vibe-core-1.4.0-alpha.1/vibe-core/source/vibe/core/core.d:111
#10 0x000056425a289c44 in D main () at source/app.d:65
#0  0x00007f02e74760f3 in epoll_wait () at ../sysdeps/unix/syscall-template.S:84
#1  0x000056425a54c378 in eventcore.drivers.posix.epoll.EpollEventLoop.doProcessEvents(core.time.Duration) (this=0x7f02e966d080, timeout=...)    at ../../.dub/packages/eventcore-0.8.27/eventcore/source/eventcore/drivers/posix/epoll.d:47
#2  0x000056425a54bf20 in _D9eventcore7drivers5posix6driver__T20PosixEventDriverCoreHTCQChQCaQBv5epoll14EpollEventLoopHTCQDpQDi5timer22LoopTimeoutTimerDriverHTCQFcQEvQEq6events__T22PosixEventDriverEventsHTQEpHTCQHbQGuQGp7sockets__T23PosixEventDriverSocketsHTQGqZQBfZQDjZQIa13processEventsMFNbNfS4core4time8DurationZEQLcQKh10ExitReason (    this=0x7f02e9670040, timeout=...)    at ../../.dub/packages/eventcore-0.8.27/eventcore/source/eventcore/drivers/posix/driver.d:141
#3  0x000056425a525eeb in vibe.core.task.TaskScheduler.process() (this=...)    at ../../.dub/packages/vibe-core-1.4.0-alpha.1/vibe-core/source/vibe/core/task.d:675
#4  0x000056425a525fcd in vibe.core.task.TaskScheduler.waitAndProcess() (this=...)    at ../../.dub/packages/vibe-core-1.4.0-alpha.1/vibe-core/source/vibe/core/task.d:713
#5  0x000056425a50a76c in _D4vibe4coreQf12runEventLoopFNbNfZi ()    at ../../.dub/packages/vibe-core-1.4.0-alpha.1/vibe-core/source/vibe/core/core.d:218
#6  0x000056425a50a5f2 in _D4vibe4coreQf14runApplicationFNfPAAyaZi (args_out=0x0)    at ../../.dub/packages/vibe-core-1.4.0-alpha.1/vibe-core/source/vibe/core/core.d:111
#7  0x000056425a289c44 in D main () at source/app.d:65

Worker thread function normally. Connections to webpage from client hang going from Established state to FIN wait 2. Single connection may exit loop after a long time (timeout seems random, connection can terminate on client side, but still left hanging on the server) and throw this on vibe.d server:

[main(f5+f) dbg] Accept TLS connection: server
[main(f5+f) ERR] HTTP connection handler has thrown: Accepting SSL tunnel:  (0)
[main(f5+f) dbg] Full error: object.Exception@../../.dub/packages/vibe-d-0.8.3-alpha.4/vibe-d/tls/vibe/stream/openssl.d(378): Accepting SSL tunnel:  (0)
[main(f5+f) dbg] ----------------
[main(f5+f) dbg] ??:? @safe int vibe.stream.openssl.OpenSSLStream.enforceSSL(int, immutable(char)[]) [0x5a4ee504]
[main(f5+f) dbg] ??:? @safe int vibe.stream.openssl.OpenSSLStream.checkSSLRet(int, immutable(char)[]) [0x5a4edff0]
[main(f5+f) dbg] ??:? @safe vibe.stream.openssl.OpenSSLStream vibe.stream.openssl.OpenSSLStream.__ctor(vibe.internal.interfaceproxy.InterfaceProxy!(vibe.core.stream.Stream).InterfaceProxy, vibe.stream.openssl.OpenSSLContext, vibe.stream.tls.TLSStreamState, immutable(char)[], vibe.core.net.NetworkAddress, immutable(char)[][]) [0x5a4ed0f0]
[main(f5+f) dbg] ??:? @safe vibe.stream.openssl.OpenSSLStream vibe.internal.freelistref.internalEmplace!(vibe.stream.openssl.OpenSSLStream, vibe.internal.interfaceproxy.InterfaceProxy!(vibe.core.stream.Stream).InterfaceProxy, vibe.stream.openssl.OpenSSLContext, vibe.stream.tls.TLSStreamState, immutable(char)[], vibe.core.net.NetworkAddress).internalEmplace(void[], ref vibe.internal.interfaceproxy.InterfaceProxy!(vibe.core.stream.Stream).InterfaceProxy, ref vibe.stream.openssl.OpenSSLContext, ref vibe.stream.tls.TLSStreamState, ref immutable(char)[], ref vibe.core.net.NetworkAddress) [0x5a4bdb26]
[main(f5+f) dbg] ??:? @safe vibe.stream.openssl.OpenSSLStream vibe.internal.freelistref.FreeListObjectAlloc!(vibe.stream.openssl.OpenSSLStream, true, true, int).FreeListObjectAlloc.alloc!(vibe.internal.interfaceproxy.InterfaceProxy!(vibe.core.stream.Stream).InterfaceProxy, vibe.stream.openssl.OpenSSLContext, vibe.stream.tls.TLSStreamState, immutable(char)[], vibe.core.net.NetworkAddress).alloc(vibe.internal.interfaceproxy.InterfaceProxy!(vibe.core.stream.Stream).InterfaceProxy, vibe.stream.openssl.OpenSSLContext, vibe.stream.tls.TLSStreamState, immutable(char)[], vibe.core.net.NetworkAddress) [0x5a4bd877]
[main(f5+f) dbg] ??:? @safe vibe.internal.freelistref.FreeListRef!(vibe.stream.openssl.OpenSSLStream, true).FreeListRef vibe.internal.freelistref.FreeListRef!(vibe.stream.openssl.OpenSSLStream, true).FreeListRef.opCall!(vibe.internal.interfaceproxy.InterfaceProxy!(vibe.core.stream.Stream).InterfaceProxy, vibe.stream.openssl.OpenSSLContext, vibe.stream.tls.TLSStreamState, immutable(char)[], vibe.core.net.NetworkAddress).opCall(vibe.internal.interfaceproxy.InterfaceProxy!(vibe.core.stream.Stream).InterfaceProxy, vibe.stream.openssl.OpenSSLContext, vibe.stream.tls.TLSStreamState, immutable(char)[], vibe.core.net.NetworkAddress) [0x5a4bd697]
[main(f5+f) dbg] ??:? @safe vibe.internal.freelistref.FreeListRef!(vibe.stream.openssl.OpenSSLStream, true).FreeListRef vibe.stream.tls.createTLSStreamFL!(vibe.internal.interfaceernal.interfaceproxy.InterfaceProxy!(vibe.core.stream.Stream).InterfaceProxy, vibe.stream.tls.TLSContext, vibe.stream.tls.TLSStreamState, immutable(char)[], vibe.core.net.NetworkAddress) [0x5a4b9b90]
[main(f5+f) dbg] ??:? @safe void vibe.http.server.handleHTTPConnection(vibe.core.net.TCPConnection, vibe.http.server.HTTPServerContext) [0x5a499cbf]
[main(f5+f) dbg] ??:? nothrow @safe void vibe.http.server.listenHTTPPlain(vibe.http.server.HTTPServerSettings, void delegate(vibe.http.server.HTTPServerRequest, vibe.http.server.HTTPServerResponse) @safe).doListen(vibe.http.server.HTTPServerContext, bool, bool).__lambda4(vibe.core.net.TCPConnection) [0x5a46b861]
[main(f5+f) dbg] ??:? void vibe.core.task.TaskFuncInfo.set!(void delegate(vibe.core.net.TCPConnection) @safe, vibe.core.net.TCPConnection).set(ref void delegate(vibe.core.net.TCPConnection) @safe, ref vibe.core.net.TCPConnection).callDelegate(ref vibe.core.task.TaskFuncInfo) [0x5a5442bc]
[main(f5+f) dbg] ??:? void vibe.core.task.TaskFuncInfo.call() [0x5a525d15]
[main(f5+f) dbg] ??:? nothrow void vibe.core.task.TaskFiber.run() [0x5a52532d]
[main(f5+f) dbg] ??:? void core.thread.Fiber.run() [0xe868f65b]
[main(f5+f) dbg] ??:? fiber_entryPoint [0xe868ea26]
[main(f5+f) dbg] ??:? [0xffffffff]

While at least one connection is hung, main thread always uses 100% CPU (about 55% usermode, 45% kernelmode).

Another symptom when I noticed when the server was malfunctioning is that vibe.d server couldn't serve static files (404 error):

[main(Oumu) dbg] Failed to open file public/css/dataTables.bootstrap.css: object.Exception@../../.dub/packages/vibe-core-1.4.0-alpha.1/vibe-core/source/vibe/core/file.d(41): Failed to open file 'public/css/dataTables.bootstrap.css'

"libasync" config build is broken

Tried to workaround #77 and found that "libasync" config build is broken

eventcore 0.8.39: building configuration "libasync"...
../../.dub/packages/eventcore-0.8.39/eventcore/source/eventcore/drivers/libasync.d(36,45): Error: function nothrow @property @safe LibasyncEventDriverCore eventcore.drivers.libasync.LibasyncEventDriver.core() does not override any function, did you mean to override inout nothrow @property @safe inout(EventDriverCore) eventcore.driver.EventDriver.core()?
../../.dub/packages/eventcore-0.8.39/eventcore/source/eventcore/drivers/libasync.d(37,46): Error: function nothrow @property @safe LibasyncEventDriverFiles eventcore.drivers.libasync.LibasyncEventDriver.files() does not override any function, did you mean to override inout nothrow @property @safe inout(EventDriverFiles) eventcore.driver.EventDriver.files()?
../../.dub/packages/eventcore-0.8.39/eventcore/source/eventcore/drivers/libasync.d(38,48): Error: function nothrow @property @safe LibasyncEventDriverSockets eventcore.drivers.libasync.LibasyncEventDriver.sockets() does not override any function, did you mean to override inout nothrow @property @safe inout(EventDriverSockets) eventcore.driver.EventDriver.sockets()?
../../.dub/packages/eventcore-0.8.39/eventcore/source/eventcore/drivers/libasync.d(39,44): Error: function nothrow @property @safe LibasyncEventDriverDNS eventcore.drivers.libasync.LibasyncEventDriver.dns() does not override any function, did you mean to override inout nothrow @property @safe inout(EventDriverDNS) eventcore.driver.EventDriver.dns()?
../../.dub/packages/eventcore-0.8.39/eventcore/source/eventcore/drivers/libasync.d(370,16): Error: function nothrow @safe void eventcore.drivers.libasync.LibasyncEventDriverTimers.wait(Handle!("timer", ulong, 18446744073709551615LU) timer, void delegate(Handle!("timer", ulong, 18446744073709551615LU)) nothrow @safe callback) does not override any function, did you mean to override nothrow @safe void eventcore.driver.EventDriverTimers.wait(Handle!("timer", ulong, 18446744073709551615LU) timer, void delegate(Handle!("timer", ulong, 18446744073709551615LU)) nothrow @safe callback)?
../../.dub/packages/eventcore-0.8.39/eventcore/source/eventcore/drivers/libasync.d(370,16): Error: function `eventcore.drivers.libasync.LibasyncEventDriverTimers.wait` cannot override final function EventDriverTimers.eventcore.driver.EventDriverTimers.wait
../../.dub/packages/eventcore-0.8.39/eventcore/source/eventcore/drivers/libasync.d(40,47): Error: function nothrow @property @safe LibasyncEventDriverTimers eventcore.drivers.libasync.LibasyncEventDriver.timers() does not override any function, did you mean to override inout nothrow @property @safe inout(EventDriverTimers) eventcore.driver.EventDriver.timers()?
../../.dub/packages/eventcore-0.8.39/eventcore/source/eventcore/drivers/libasync.d(41,47): Error: function nothrow @property @safe LibasyncEventDriverEvents eventcore.drivers.libasync.LibasyncEventDriver.events() does not override any function, did you mean to override inout nothrow @property @safe inout(EventDriverEvents) eventcore.driver.EventDriver.events()?
../../.dub/packages/eventcore-0.8.39/eventcore/source/eventcore/drivers/libasync.d(42,55): Error: function shared nothrow @property @safe shared(LibasyncEventDriverEvents) eventcore.drivers.libasync.LibasyncEventDriver.events() does not override any function, did you mean to override inout nothrow @property @safe inout(EventDriverEvents) eventcore.driver.EventDriver.events()?
../../.dub/packages/eventcore-0.8.39/eventcore/source/eventcore/drivers/libasync.d(43,48): Error: function nothrow @property @safe LibasyncEventDriverSignals eventcore.drivers.libasync.LibasyncEventDriver.signals() does not override any function, did you mean to override inout nothrow @property @safe inout(EventDriverSignals) eventcore.driver.EventDriver.signals()?
../../.dub/packages/eventcore-0.8.39/eventcore/source/eventcore/drivers/libasync.d(44,49): Error: function nothrow @property @safe LibasyncEventDriverWatchers eventcore.drivers.libasync.LibasyncEventDriver.watchers() does not override any function, did you mean to override inout nothrow @property @safe inout(EventDriverWatchers) eventcore.driver.EventDriver.watchers()?
../../.dub/packages/eventcore-0.8.39/eventcore/source/eventcore/drivers/libasync.d(46,16): Error: function nothrow @safe void eventcore.drivers.libasync.LibasyncEventDriver.dispose() does not override any function, did you mean to override nothrow @safe bool eventcore.driver.EventDriver.dispose()?
/usr/bin/dmd failed with exit code 1.

Timeouts

How to set :

  • connection timeout
  • read timeout
  • write timeout

Fails to compile on Arch Linux due to missing import.

When compiling a dub project that depends on eventcore I get the following error. It is fixed by adding:

import std.stdint;

to eventcore/source/eventcore/drivers/posix/processes.d

eventcore 0.8.44: building configuration "epoll"...
/home/caleb/.dub/packages/eventcore-0.8.44/eventcore/source/eventcore/drivers/posix/processes.d(305,25): Error: undefined identifier intptr_t
/home/caleb/.dub/packages/eventcore-0.8.44/eventcore/source/eventcore/drivers/posix/driver.d(58,41): Error: template instance `eventcore.drivers.posix.processes.SignalEventDriverProcesses!(SelectEventLoop)` error instantiating
/home/caleb/.dub/packages/eventcore-0.8.44/eventcore/source/eventcore/drivers/posix/select.d(26,27):        instantiated from here: PosixEventDriver!(SelectEventLoop)
/home/caleb/.dub/packages/eventcore-0.8.44/eventcore/source/eventcore/drivers/posix/processes.d(305,25): Error: undefined identifier intptr_t
/home/caleb/.dub/packages/eventcore-0.8.44/eventcore/source/eventcore/drivers/posix/driver.d(58,41): Error: template instance `eventcore.drivers.posix.processes.SignalEventDriverProcesses!(EpollEventLoop)` error instantiating
/home/caleb/.dub/packages/eventcore-0.8.44/eventcore/source/eventcore/drivers/posix/epoll.d(19,26):        instantiated from here: PosixEventDriver!(EpollEventLoop)
/usr/bin/dmd failed with exit code 1.

See this fix: #120

SIGPIPE on send

in posix/sockets.d: send is used for sending data over a socket, with 0 being passed as flags. However for stream-oriented sockets the EPIPE error results in a SIGPIPE being raised, exiting the process. The MSG_NOSIGNAL flag should be used to prevent this.

Using GC to allocate event driver results in trailing segfault

Ever since I upgraded to vibe.d v 0.8.4, I get a lingering segfault when my app is shutting down. I've traced it down to mysqlnative trying to close a TCPConnection, and the TCPConnection's context pointer being invalid memory.

Looking at TCPConnection, the only way it could have this happen is if the context data is deallocated underneath it. I think the issue is that because the event driver is allocated using "new", and therefore by the GC, the order of destruction could be the event driver first and then sockets inside other classes second. In this case, the event driver's context is freed before the TCPConnection can use it to figure out how to release the resources it has.

The reason it's coming from mysqlnative is because it allocates connections using the GC.

In order to do this correctly, the event driver has to be allocated by C malloc, and must be freed only after all shutdown happens (including the GC). This is a tough one, and perhaps the only fix really is to allocate it and never free it.

Failed to run benchmark test on windows 10

The http-server has no respond when running the benchmark command at second.
In fact, you can't open the link http://127.0.0.1:8080/ from different browers.
Everything seems ok on linux.

OS: windows 10 x64
Compiler: dmd v2.078.3

Build command:

  1. dub build --config=winapi-optlink --arch=x86 --build=debug --compiler=dmd
  2. dub build --config=winapi --arch=x86_64 --build=debug --compiler=dmd

Test code: examples/http-server.d (changed to listen on 0.0.0.0:8080)

Benchmark tool: ApacheBench
ab -n 2 -c 1 -k -v 5 http://127.0.0.1:8080/

Examples do not work on Windows 10.

All builds are passed. The http-server has no any response when browsing http://127.0.0.1:8080.
They work well on Linux.

OS: Windows 10 x64
Compiler: DMD v2.076.0

Build command line:
dub build --config=winapi --arch=x86_64 --build=debug --compiler=dmd

AssertError: eventcore/drivers/posix/driver.d(243): Overwriting notification callback

I received a bug report over at mysql-native that I've tracked down to an assert failure in eventcore. It wasn't clear at first because there's another mysql-native issue that was covering up this assert failure during stack unwinding.

To reproduce:

  1. Use the test case provided in the original post here

  2. Edit mysql-native's source/mysql/protocol/sockets.d and comment out line 121: assert(!!socket); (I think it was supposed to be assert(socket !is null); but I'm getting a weird compile error from that - still figuring that one out) This change will allow the original AssertError to propagate to the top without being hijacked by mysql-native freaking out.

  3. Run dub and receive this:

core.exception.AssertError@../../../.dub/packages/eventcore-0.8.29/eventcore/source/eventcore/drivers/posix/driver.d(243): Overwriting notification callback.
----------------
??:? _d_assert_msg [0x4cbb24ba]
??:? nothrow @nogc @safe void eventcore.drivers.posix.driver.PosixEventLoop.setNotifyCallback!(0).setNotifyCallback(eventcore.driver.Handle!("fd", ulong, -1uL).Handle, void delegate(eventcore.driver.Handle!("fd", ulong, -1uL).Handle) nothrow @safe) [0x4cb85b15]
??:? _D9eventcore7drivers5posix7sockets__T23PosixEventDriverSocketsHTCQClQCeQBz5epoll14EpollEventLoopZQCi4readMFNbNfSQEg6driver__T6HandleVAyaa12_73747265616d536f636b6574TSQGiQCc__TQByVQBua6_736f636b6574TSQHpQDj__TQDfVQDba2_6664TmVmN1ZQEaVQBjS1N1ZQEmVQDcS1S1N1ZQFaAhEQJzQFt6IOModeDFNbNfQGnEQKwQGq8IOStatusmZvZv [0x4cb73e01]
??:? _D4vibe4core3net13TCPConnection11waitForDataMFNfSQBq4time8DurationZ__T9__lambda2TDFNbNfS9eventcore6driver__T6HandleVAyaa12_73747265616d536f636b6574TSQCjQCc__TQByVQBua6_736f636b6574TSQDqQDj__TQDfVQDba2_6664TmVmN1ZQEaVQBjS1N1ZQEmVQDcS1S1N1ZQFaEQFyQFr8IOStatusmZvZQHjMFNbNfQHhZv [0x4cb679ae]
??:? _D4vibe8internal5async__T13asyncAwaitAnyVbi1SQBrQBpQBj__T8WaitableTDFNbNfS9eventcore6driver__T6HandleVAyaa12_73747265616d536f636b6574TSQCjQCc__TQByVQBua6_736f636b6574TSQDqQDj__TQDfVQDba2_6664TmVmN1ZQEaVQBjS1N1ZQEmVQDcS1S1N1ZQFaEQFyQFr8IOStatusmZvSQJl4core3net13TCPConnection11waitForDataMFNfSQBq4time8DurationZ9__lambda2SQMhQCwQCuQCtQChMFNfQBxZ9__lambda3SQNpQEeQEcQEbQDpMFNfQDfZ9__lambda4ZZQObMFNfQLjZv [0x4cb3913d]
??:? _D4vibe8internal5async__T13asyncAwaitAnyVbi1SQBrQBpQBj__T8WaitableTDFNbNfS9eventcore6driver__T6HandleVAyaa12_73747265616d536f636b6574TSQCjQCc__TQByVQBua6_736f636b6574TSQDqQDj__TQDfVQDba2_6664TmVmN1ZQEaVQBjS1N1ZQEmVQDcS1S1N1ZQFaEQFyQFr8IOStatusmZvSQJl4core3net13TCPConnection11waitForDataMFNfSQBq4time8DurationZ9__lambda2SQMhQCwQCuQCtQChMFNfQBxZ9__lambda3SQNpQEeQEcQEbQDpMFNfQDfZ9__lambda4ZZQObMFNfQEcQLmZv [0x4cb38fbd]
??:? @safe bool vibe.core.net.TCPConnection.waitForData(core.time.Duration) [0x4cb3804d]
??:? @safe bool vibe.core.net.TCPConnection.read(scope ubyte[], eventcore.driver.IOMode).__lambda3!(core.time.Duration).__lambda3(core.time.Duration) [0x4cb397b9]
??:? @safe void vibe.core.net.loopWithTimeout!(vibe.core.net.TCPConnection.read(scope ubyte[], eventcore.driver.IOMode).__lambda3, Exception).loopWithTimeout(core.time.Duration) [0x4cb3965e]
??:? @safe ulong vibe.core.net.TCPConnection.read(scope ubyte[], eventcore.driver.IOMode) [0x4cb3825a]
??:? @safe void vibe.core.net.TCPConnection.read(scope ubyte[]) [0x4cb38298]
??:? void mysql.protocol.sockets.MySQLSocketVibeD.read(ubyte[]) [0x4c985228]
??:? ubyte[] mysql.protocol.comms.getPacket(mysql.connection.Connection) [0x4c98013e]
??:? bool mysql.protocol.comms.execQueryImpl(mysql.connection.Connection, mysql.protocol.comms.ExecQueryImplInfo, out ulong) [0x4c97fdaa]
??:? mysql.result.ResultRange mysql.commands.queryImpl(mysql.commands.ColumnSpecialization[], mysql.connection.Connection, mysql.protocol.comms.ExecQueryImplInfo) [0x4c97b46a]
??:? mysql.result.ResultRange mysql.commands.query(mysql.connection.Connection, const(char[]), mysql.commands.ColumnSpecialization[]) [0x4c97b3ed]
??:? void app.WebInterface.index(vibe.http.server.HTTPServerResponse) [0x4c960492]
??:? void vibe.web.web.handleRequest!("index", app.WebInterface.index(vibe.http.server.HTTPServerResponse), app.WebInterface).handleRequest(vibe.http.server.HTTPServerRequest, vibe.http.server.HTTPServerResponse, app.WebInterface, vibe.web.web.WebInterfaceSettings) [0x4c96b111]
??:? @trusted void vibe.web.web.registerWebInterface!(app.WebInterface, 5).registerWebInterface(vibe.http.router.URLRouter, app.WebInterface, vibe.web.web.WebInterfaceSettings).__lambda4(vibe.http.server.HTTPServerRequest, vibe.http.server.HTTPServerResponse) [0x4c96a608]
??:? @safe bool vibe.http.router.URLRouter.handleRequest(vibe.http.server.HTTPServerRequest, vibe.http.server.HTTPServerResponse).__lambda4!(ulong, immutable(char)[][]).__lambda4(ulong, scope immutable(char)[][]) [0x4ca4a4a7]
??:? const @safe bool vibe.http.router.MatchTree!(vibe.http.router.Route).MatchTree.doMatch(immutable(char)[], scope bool delegate(ulong, scope immutable(char)[][]) @safe) [0x4ca4cbd5]
??:? @safe bool vibe.http.router.MatchTree!(vibe.http.router.Route).MatchTree.match(immutable(char)[], scope bool delegate(ulong, scope immutable(char)[][]) @safe) [0x4ca4c4d7]
??:? @safe void vibe.http.router.URLRouter.handleRequest(vibe.http.server.HTTPServerRequest, vibe.http.server.HTTPServerResponse) [0x4ca4a168]
??:? @safe bool vibe.http.server.handleRequest(vibe.internal.interfaceproxy.InterfaceProxy!(vibe.core.stream.Stream).InterfaceProxy, vibe.core.net.TCPConnection, vibe.http.server.HTTPServerContext, ref vibe.http.server.HTTPServerSettings, ref bool, scope stdx.allocator.IAllocator) [0x4cad024d]
??:? @trusted void vibe.http.server.handleHTTPConnection(vibe.core.net.TCPConnection, vibe.http.server.HTTPServerContext).__lambda3() [0x4cace7d0]
??:? @safe void vibe.http.server.handleHTTPConnection(vibe.core.net.TCPConnection, vibe.http.server.HTTPServerContext) [0x4cace57b]
??:? nothrow @safe void vibe.http.server.listenHTTPPlain(vibe.http.server.HTTPServerSettings, void delegate(vibe.http.server.HTTPServerRequest, vibe.http.server.HTTPServerResponse) @safe).doListen(vibe.http.server.HTTPServerContext, bool, bool).__lambda4(vibe.core.net.TCPConnection) [0x4ca56771]
??:? void vibe.core.task.TaskFuncInfo.set!(void delegate(vibe.core.net.TCPConnection) @safe, vibe.core.net.TCPConnection).set(ref void delegate(vibe.core.net.TCPConnection) @safe, ref vibe.core.net.TCPConnection).callDelegate(ref vibe.core.task.TaskFuncInfo) [0x4cb69a64]
??:? void vibe.core.task.TaskFuncInfo.call() [0x4cb4b3d9]
??:? nothrow void vibe.core.task.TaskFiber.run() [0x4cb4a9e1]
??:? void core.thread.Fiber.run() [0x4cc041c3]
??:? fiber_entryPoint [0x4cc04092]
??:? [0xffffffff]
Program exited with code -6

Missing O_CLOEXEC for Solaris

Moved from: vibe-d/vibe.d#2196


in eventcore/sockets.d

static if (!is(typeof(O_CLOEXEC)))
{
version (linux) enum O_CLOEXEC = 0x80000;
else version (FreeBSD) enum O_CLOEXEC = 0x100000;
else version (Solaris) enum O_CLOEXEC = 0x800000; // line missing
else version (DragonFlyBSD) enum O_CLOEXEC = 0x0020000;
else version (NetBSD) enum O_CLOEXEC = 0x400000;
else version (OpenBSD) enum O_CLOEXEC = 0x10000;
else version (OSX) enum O_CLOEXEC = 0x1000000;
}


Overwriting notification callback.

Ref

auto sockFd = eventDriver.sockets.connectStream(addr, null, (fd,  status) @safe nothrow {
    if (fd != StreamSocketFD.invalid) eventDriver.sockets.addRef(fd);
    //_isAttached = status == ConnectStatus.connected;
    if (fd != StreamSocketFD.invalid) eventDriver.sockets.releaseRef(fd);
});

eventDriver.sockets.addRef(sockFd);

eventDriver.sockets.write(sockFd, msg.pack, IOMode.all, (fd, status, nbytes) @safe nothrow {
    // ...
});

Exception:

core.exception.AssertError@../../../.dub/packages/eventcore-0.8.3/eventcore/source/eventcore/drivers/posix/driver.d(241): Overwriting notification callback.
----------------
??:? nothrow @nogc @safe void eventcore.drivers.posix.driver.PosixEventLoop.setNotifyCallback!(1).setNotifyCallback(eventcore.driver.Handle!("fd", ulong, -1uL).Handle, nothrow @safe void delegate(eventcore.driver.Handle!("fd", ulong, -1uL).Handle)) [0xed733506]

dub produces error on FreeBSD 12.1-RELEASE-p10

$dub --override-config vibe-d:tls/openssl-1.1

Performing "debug" build using /usr/local/bin/ldc2 for x86_64.
taggedalgebraic 0.11.18: building configuration "library"...
eventcore 0.9.9: building configuration "kqueue"...
/home/x/.dub/packages/eventcore-0.9.9/eventcore/source/eventcore/drivers/posix/processes.d(341,10): Error: module core.sys.posix.sys.wait import idtype_t not found
/home/x/.dub/packages/eventcore-0.9.9/eventcore/source/eventcore/drivers/posix/processes.d(341,10): Error: module core.sys.posix.sys.wait import WEXITED not found, did you mean function core.sys.posix.sys.wait.WIFEXITED?

Client impl

How to impl Client using eventcore?

For example using epoll:
1.connect to some addr
2. add socket handle to epoll
3. loop for epoll events

Periodic timers hinder single-shot timers from firing

From vibe-d/vibe-core#36:

Timers armed as timer.rearm(duration, true) spoil other timers, sleep, receiveTimeout and so on.

Let's create the following program:

import vibe.core.core;
import vibe.core.concurrency;
import vibe.core.log;

import std.datetime;

void producer() @safe
{
	logInfo("start producer");
	sleep(10.seconds);
	logInfo("end producer");
	exitEventLoop();
}

void consumer() @trusted
{
	logInfo("start consumer");
	bool ret = false;
	loopWithTimeout(5.seconds, (remaining) {
		const delay = remaining > 1.seconds ? 1.seconds : remaining;
		logInfo("receiveTimeout %s", delay);
		ret = receiveTimeout(delay, //
			(int a) { logInfo("Got int %s", a); });
		return true;
	});
	logInfo("end consumer gotSomething:%s", ret);
}

void loopWithTimeout(in Duration dur, bool delegate(in Duration left) code)
{
	immutable startTime = Clock.currTime;
	immutable deadline = startTime + dur;
	auto left = deadline - startTime;
	while (left > Duration.zero)
	{
		if (!code(left))
			break;
		left = deadline - Clock.currTime;
	}
}

void main()
{
	runTask({ producer(); });
	runTask({ consumer(); });
	runEventLoop();
}

The output is:

Running ./simple
[main(0AKN) INF] start producer
[main(CaiG) INF] start consumer
[main(CaiG) INF] receiveTimeout 1 sec
[main(CaiG) INF] receiveTimeout 1 sec
[main(CaiG) INF] receiveTimeout 1 sec
[main(CaiG) INF] receiveTimeout 1 sec
[main(CaiG) INF] receiveTimeout 994 ms, 988 μs, and 5 hnsecs
[main(CaiG) INF] end consumer gotSomething:false
[main(0AKN) INF] end producer

Let's add the timer into main function:

void main()
{
	Timer timer;
	timer = createTimer({ logInfo("Timer!"); timer.rearm(1.seconds); });
	timer.rearm(1.seconds);

	runTask({ producer(); });
	runTask({ consumer(); });
	runEventLoop();
}

Still works as expected:

Running ./simple
[main(jCZ2) INF] start producer
[main(4e8g) INF] start consumer
[main(4e8g) INF] receiveTimeout 1 sec
[main(TtoJ) INF] Timer!
[main(4e8g) INF] receiveTimeout 1 sec
[main(TtoJ) INF] Timer!
[main(4e8g) INF] receiveTimeout 1 sec
[main(TtoJ) INF] Timer!
[main(4e8g) INF] receiveTimeout 1 sec
[main(TtoJ) INF] Timer!
[main(4e8g) INF] receiveTimeout 994 ms and 868 μs
[main(4e8g) INF] end consumer gotSomething:false
[main(TtoJ) INF] Timer!
[main(TtoJ) INF] Timer!
[main(TtoJ) INF] Timer!
[main(TtoJ) INF] Timer!
[main(TtoJ) INF] Timer!
[main(jCZ2) INF] end producer

But with the timer armed with periodic=true:

void main()
{
	Timer timer;
	timer = createTimer({ logInfo("Timer!"); });
	timer.rearm(1.seconds, true);

	runTask({ producer(); });
	runTask({ consumer(); });
	runEventLoop();
}

sleep lasts forever and receiveTimeout ignores duration. The output is:

Running ./simple
[main(TfW8) INF] start producer
[main(MN4a) INF] start consumer
[main(MN4a) INF] receiveTimeout 1 sec
[main(jte9) INF] Timer!
[main(jte9) INF] Timer!
[main(jte9) INF] Timer!
[main(jte9) INF] Timer!
[main(jte9) INF] Timer!
[main(jte9) INF] Timer!
[main(jte9) INF] Timer!
[main(jte9) INF] Timer!
[main(jte9) INF] Timer!
[main(jte9) INF] Timer!
^C[main(----) INF] Received signal 2. Shutting down.

forever, until I've pressed Ctrl-C.

Looks like peridic timers has some bug.

dub.sdl:

name "simple"
dependency "vibe-core" version="~>1.1.0"

Building:

dub build
Performing "debug" build using dmd for x86_64.
taggedalgebraic 0.10.7: target for configuration "library" is up to date.
eventcore 0.8.19: target for configuration "epoll" is up to date.
vibe-core 1.1.1: target for configuration "epoll" is up to date.
simple ~master: building configuration "application"...
Linking...
To force a rebuild of up-to-date targets, run again with --force.

What's the validation counter used for?

I am reading the eventcore code and have a hard time figuring out, what the validation counter (embedded in almost all 'slots'/FileInfo) etc. is used for. What do we try to validate with it?

lld-link: error: undefined symbol: fstat

I create a new vibe.d example with
dub init vibetest --type vibe.d

and then try to build it with dub build

Fetching botan-math 1.0.3 (getting selected version)...
Fetching vibe-core 1.4.4 (getting selected version)...
Fetching memutils 0.4.13 (getting selected version)...
Fetching taggedalgebraic 0.10.12 (getting selected version)...
Fetching vibe-d 0.8.4 (getting selected version)...
Fetching stdx-allocator 2.77.4 (getting selected version)...
Fetching botan 1.12.10 (getting selected version)...
Fetching diet-ng 1.5.0 (getting selected version)...
Fetching openssl 1.1.6+1.0.1g (getting selected version)...
Fetching eventcore 0.8.39 (getting selected version)...
Fetching mir-linux-kernel 1.0.1 (getting selected version)...
Fetching libevent 2.0.2+2.0.16 (getting selected version)...
Fetching libasync 0.8.3 (getting selected version)...
Performing "debug" build using C:\D\ldc2-1.13.0-beta1-windows-multilib\bin\ldc2.exe for x86_64.
taggedalgebraic 0.10.12: building configuration "library"...
eventcore 0.8.39: building configuration "winapi"...
stdx-allocator 2.77.4: building configuration "library"...
vibe-core 1.4.4: building configuration "winapi"...
vibe-d:utils 0.8.4: building configuration "library"...
vibe-d:data 0.8.4: building configuration "library"...
mir-linux-kernel 1.0.1: building configuration "library"...
vibe-d:crypto 0.8.4: building configuration "library"...
diet-ng 1.5.0: building configuration "library"...
vibe-d:stream 0.8.4: building configuration "library"...
vibe-d:textfilter 0.8.4: building configuration "library"...
vibe-d:inet 0.8.4: building configuration "library"...
vibe-d:tls 0.8.4: building configuration "openssl-mscoff"...
vibe-d:http 0.8.4: building configuration "library"...
vibe-d:mail 0.8.4: building configuration "library"...
vibe-d:mongodb 0.8.4: building configuration "library"...
C:\Users\pc\AppData\Local\dub\packages\vibe-d-0.8.4\vibe-d\mongodb\vibe\db\mongo\settings.d(16,8): Deprecation: alias `std.digest.digest.toHexString` is deprecated - import std.digest instead of std.digest.digest. std.digest.digest will be removed in 2.084
C:\Users\pc\AppData\Local\dub\packages\vibe-d-0.8.4\vibe-d\mongodb\vibe\db\mongo\settings.d(16,8): Deprecation: alias `std.digest.digest.toHexString` is deprecated - import std.digest instead of std.digest.digest. std.digest.digest will be removed in 2.084
vibe-d:redis 0.8.4: building configuration "library"...
vibe-d:web 0.8.4: building configuration "library"...
vibe-d 0.8.4: building configuration "vibe-core"...
vibetest ~master: building configuration "application"...
lld-link: error: undefined symbol: fstat
>>> referenced by C:\Users\pc\AppData\Local\dub\packages\eventcore-0.8.39\eventcore\source\eventcore\drivers\threadedfile.d:194
>>>               eventcore.lib(eventcore.drivers.threadedfile.obj):(_D9eventcore7drivers12threadedfile__T23ThreadedFileEventDriverHTCQClQCe5posix6events__T22PosixEventDriverEventsHTCQEiQEbQBx6select15SelectEventLoopHTCQFsQFlQDh7sockets__T23PosixEventDriverSocketsHTQDgZQBfZQEoZQGq7getSizeMFNbNfSQIr6driver__T6HandleVAyaa4_66696c65TSQKcQBl__TQBhVQBda2_6664TmVmN1ZQCcVQBjS1N1ZQCoZ9__lambda2MFNbNiNeZv)

Error: linking with LLD failed
C:\D\ldc2-1.13.0-beta1-windows-multilib\bin\ldc2.exe failed with exit code 1.

Compiler is ldc2-1.13.0-beta1-windows-multilib with LLD and architecture is set to x86_64

Error: safe function cannot call system function

Pull request #1415 fails due to this error. The test relies on /test/test_registry.d which
causes following error while build:

[INFO] Running /home/travis/build/dlang/dub/test/issue1416-maven-repo-pkg-supplier.sh...
Fetching libevent 2.0.2+2.0.16 (getting selected version)...
Fetching diet-ng 1.4.5 (getting selected version)...
Fetching taggedalgebraic 0.10.11 (getting selected version)...
Fetching openssl 1.1.6+1.0.1g (getting selected version)...
Fetching botan 1.12.9 (getting selected version)...
Fetching stdx-allocator 2.77.0 (getting selected version)...
Fetching vibe-d 0.8.3 (getting selected version)...
Fetching memutils 0.4.10 (getting selected version)...
Fetching vibe-core 1.4.0 (getting selected version)...
Fetching libasync 0.8.3 (getting selected version)...
Fetching botan-math 1.0.3 (getting selected version)...
Fetching eventcore 0.8.34 (getting selected version)...
Performing "debug" build using dmd for x86_64.
taggedalgebraic 0.10.11: building configuration "library"...
eventcore 0.8.34: building configuration "epoll"...
../../../.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/driver.d(145,14): Error: safe function 'eventcore.drivers.posix.driver.PosixEventDriverCore!(SelectEventLoop, LoopTimeoutTimerDriver, PosixEventDriverEvents!(SelectEventLoop, PosixEventDriverSockets!(SelectEventLoop))).PosixEventDriverCore.dispose' cannot call system function 'core.atomic.atomicStore!(cast(MemoryOrder)3, Mutex, typeof(null)).atomicStore'
../../../.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/select.d(26,27): Error: template instance eventcore.drivers.posix.driver.PosixEventDriver!(SelectEventLoop) error instantiating
../../../.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/driver.d(210,22): Error: safe function 'eventcore.drivers.posix.driver.PosixEventDriverCore!(SelectEventLoop, LoopTimeoutTimerDriver, PosixEventDriverEvents!(SelectEventLoop, PosixEventDriverSockets!(SelectEventLoop))).PosixEventDriverCore.runInOwnerThread' cannot call system function 'core.atomic.atomicLoad!(cast(MemoryOrder)3, Mutex).atomicLoad'
../../../.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/driver.d(211,24): Error: safe function 'eventcore.drivers.posix.driver.PosixEventDriverCore!(SelectEventLoop, LoopTimeoutTimerDriver, PosixEventDriverEvents!(SelectEventLoop, PosixEventDriverSockets!(SelectEventLoop))).PosixEventDriverCore.runInOwnerThread' cannot call system function 'core.atomic.atomicLoad!(cast(MemoryOrder)3, Handle!("event", Handle!("fd", ulong, 18446744073709551615LU), Handle(18446744073709551615LU))).atomicLoad'
../../../.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/driver.d(41,22): Error: template instance eventcore.drivers.posix.driver.PosixEventDriverCore!(SelectEventLoop, LoopTimeoutTimerDriver, PosixEventDriverEvents!(SelectEventLoop, PosixEventDriverSockets!(SelectEventLoop))) error instantiating
../../../.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/select.d(26,27):        instantiated from here: PosixEventDriver!(SelectEventLoop)
../../../.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/driver.d(145,14): Error: safe function 'eventcore.drivers.posix.driver.PosixEventDriverCore!(EpollEventLoop, LoopTimeoutTimerDriver, PosixEventDriverEvents!(EpollEventLoop, PosixEventDriverSockets!(EpollEventLoop))).PosixEventDriverCore.dispose' cannot call system function 'core.atomic.atomicStore!(cast(MemoryOrder)3, Mutex, typeof(null)).atomicStore'
../../../.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/epoll.d(19,26): Error: template instance eventcore.drivers.posix.driver.PosixEventDriver!(EpollEventLoop) error instantiating
../../../.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/driver.d(210,22): Error: safe function 'eventcore.drivers.posix.driver.PosixEventDriverCore!(EpollEventLoop, LoopTimeoutTimerDriver, PosixEventDriverEvents!(EpollEventLoop, PosixEventDriverSockets!(EpollEventLoop))).PosixEventDriverCore.runInOwnerThread' cannot call system function 'core.atomic.atomicLoad!(cast(MemoryOrder)3, Mutex).atomicLoad'
../../../.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/driver.d(211,24): Error: safe function 'eventcore.drivers.posix.driver.PosixEventDriverCore!(EpollEventLoop, LoopTimeoutTimerDriver, PosixEventDriverEvents!(EpollEventLoop, PosixEventDriverSockets!(EpollEventLoop))).PosixEventDriverCore.runInOwnerThread' cannot call system function 'core.atomic.atomicLoad!(cast(MemoryOrder)3, Handle!("event", Handle!("fd", ulong, 18446744073709551615LU), Handle(18446744073709551615LU))).atomicLoad'
../../../.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/driver.d(41,22): Error: template instance eventcore.drivers.posix.driver.PosixEventDriverCore!(EpollEventLoop, LoopTimeoutTimerDriver, PosixEventDriverEvents!(EpollEventLoop, PosixEventDriverSockets!(EpollEventLoop))) error instantiating
../../../.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/epoll.d(19,26):        instantiated from here: PosixEventDriver!(EpollEventLoop)
dmd failed with exit code 1.
[ERROR] :10 command failed
[ERROR] Script failure.

TCP Keepalive parameters not exposed

tcp_keepalive_time, tcp_keepalive_intvl, tcp_keepalive_probes and their Windows\OSX counterparts are currently unavailable. Default OS keepalive timeout of 2 hours is not very helpful in the task of handling dead peers, so it would be nice to expose those options.

Feature request.

Introduce a per-FD counter to be able to detect invalid handle values

The counter would be incremented whenever the FD becomes invalid (i.e. gets closed). Storing the counter together with the FD in each handle would enabled safe close() of the FD, discarding all existing handle references that still exist. Using such a handle would return an error due to the incremented counter instead of silently attempting to reuse the file descriptor (and mess with its reference count).

Strange assert when using HTTPS on REST API service

This is a backtrace from the GDB:

#0  0x0000000001382444 in _d_assert_msg ()
#1  0x00000000012742de in _D9eventcore7drivers5posix7sockets__T23PosixEventDriverSocketsHTCQClQCeQBz5epoll14EpollEventLoopZQCi10releaseRefMFNbNfSQEn6driver__T6HandleVAyaa6_736f636b6574TSQGcQBp__TQBlVQBha2_6664TmVmN1ZQCgVQBjS1N1ZQCsZb (this=0x7ffff7ef3b40, fd=...) at /home/tomas/.dub/packages/eventcore-0.8.22/eventcore/source/eventcore/drivers/posix/sockets.d:776
#2  0x0000000001237005 in vibe.core.net.TCPConnection.~this() (this=...) at /home/tomas/.dub/packages/vibe-core-1.3.0-rc.1/vibe-core/source/vibe/core/net.d:491
#3  0x00000000011bfc95 in _D6object__T16_destructRecurseTS4vibe4core3net13TCPConnectionZQByFNbNfKQBoZv (s=...) at /usr/include/dmd/druntime/import/object.d:2489
#4  0x00000000011bfbf1 in _D6object__T7destroyTS4vibe4core3net13TCPConnectionZQBoFNbNfKQBoZv (obj=...) at /usr/include/dmd/druntime/import/object.d:2860
#5  0x0000000001186d3c in _D4vibe8internal14interfaceproxy__T14InterfaceProxyTCQBz4core6stream6StreamZQBp__T9ProxyImplTSQDoQBp3net13TCPConnectionZQBm8_destroyMFNbNeAvZv (this=0x7fffcf062cc0, stor=...) at /home/tomas/.dub/packages/vibe-core-1.3.0-rc.1/vibe-core/source/vibe/internal/interfaceproxy.d:244
#6  0x000000000117ac91 in _D4vibe8internal14interfaceproxy__T14InterfaceProxyTCQBz4core6stream6StreamZQBp5clearMFNbNfZv (this=...) at /home/tomas/.dub/packages/vibe-core-1.3.0-rc.1/vibe-core/source/vibe/internal/interfaceproxy.d:123
#7  0x000000000117ac21 in _D4vibe8internal14interfaceproxy__T14InterfaceProxyTCQBz4core6stream6StreamZQBp6__dtorMFNbNfZv (this=...) at /home/tomas/.dub/packages/vibe-core-1.3.0-rc.1/vibe-core/source/vibe/internal/interfaceproxy.d:112
#8  0x0000000001210619 in vibe.stream.openssl.OpenSSLStream.__fieldDtor() (this=0x7fffcf049c00) at /home/tomas/.dub/packages/vibe-d-0.8.2-rc.1/vibe-d/tls/vibe/stream/openssl.d:230
#9  0x000000000121063a in vibe.stream.openssl.OpenSSLStream.__aggrDtor() (this=0x7fffcf049c00) at /home/tomas/.dub/packages/vibe-d-0.8.2-rc.1/vibe-d/tls/vibe/stream/openssl.d:230
#10 0x000000000138b50b in rt_finalize2 ()
#11 0x00000000013e17a2 in rt_finalizeFromGC ()
#12 0x00000000013db94e in _D2gc4impl12conservativeQw3Gcx5sweepMFNbZm ()
#13 0x00000000013dc29d in _D2gc4impl12conservativeQw3Gcx11fullcollectMFNbbZm ()
#14 0x00000000013da07e in _D2gc4impl12conservativeQw3Gcx10smallAllocMFNbhKmkZPv ()
#15 0x00000000013de0fd in _D2gc4impl12conservativeQw14ConservativeGC__T9runLockedS_DQCeQCeQCcQCnQBs12mallocNoSyncMFNbmkKmxC8TypeInfoZPvS_DQEgQEgQEeQEp10mallocTimelS_DQFiQFiQFgQFr10numMallocslTmTkTmTxQCzZQFcMFNbKmKkKmKxQDsZQDl ()
#16 0x00000000013d7be3 in _D2gc4impl12conservativeQw14ConservativeGC6qallocMFNbmkxC8TypeInfoZS4core6memory8BlkInfo_ ()
#17 0x00000000013874a7 in gc_qalloc ()
#18 0x00000000013e1384 in _D2rt8lifetime12__arrayAllocFNaNbmxC8TypeInfoxQlZS4core6memory8BlkInfo_ ()
#19 0x000000000138aed2 in _d_newarrayU ()
#20 0x0000000000da27eb in _D6object__T4_dupTaTyaZQlFNaNbAaZAya (a=...) at /usr/include/dmd/druntime/import/object.d:3890
#21 0x0000000000da27c4 in _D6object__T11_trustedDupTaTyaZQtFNaNbNeAaZAya (a=...) at /usr/include/dmd/druntime/import/object.d:3870
#22 0x0000000000da27a0 in _D6object__T4idupTaZQiFNaNbNdNfAaZAya (a=...) at /usr/include/dmd/druntime/import/object.d:3857
#23 0x0000000000fbd794 in _D3std4conv__T6toImplTAyaTAaZQpFNaNbNfQmZQt (value=...) at /usr/include/dmd/phobos/std/conv.d:891
#24 0x00000000010d2d0f in _D3std4conv__T6toImplTAyaTPxaZQqFQhZ9__lambda2MFNaNbZQBf (this=0x7fffd8fee090) at /usr/include/dmd/phobos/std/conv.d:941

It happens while reading from the DB. It seems that GC has run during the reading and tries to clean something it shouldn't.
Using latest vibe-0.8.2-rc1, with vibe-core-1.3.0-rc1 on Ubuntu Linux 16.04.03 x86_64

Release v0.8.49 broke dlang's Buildkite CI

Seeing persistent failures to vibe.d since today. I'm pretty certain it comes from v0.8.49.
Failures example: https://buildkite.com/dlang/dmd/builds/12112

Config vibe.d+libevent-test

+ cd tests/vibe.web.web.auth
  | + dub --compiler=dmd --build-mode=separate
[...]
  | eventcore 0.8.49: target for configuration "epoll" is up to date.
[...]
  | vibe-d:web 0.9.0-alpha.2: target for configuration "library" is up to date.
  | tests ~master: building configuration "application"...
[...]
  | Running ./tests
  | [main(----) INF] Listening for requests on http://127.0.0.1:37378/
  | core.exception.AssertError@source/app.d(39): Error writing data to socket.
  | ----------------
  | ??:? _d_assert_msg [0x9fabd6]
  | source/app.d:39 nothrow @safe void app._sharedStaticCtor_L17_C1().__lambda1().test(immutable(char)[], immutable(char)[], vibe.http.status.HTTPStatus) [0x7b27d7]
  | source/app.d:45 nothrow @safe void app._sharedStaticCtor_L17_C1().__lambda1() [0x7b23bc]
  | ../../../.dub/packages/vibe-core-1.8.1/vibe-core/source/vibe/core/task.d:653 void vibe.core.task.TaskFuncInfo.set!(void delegate() @safe).set(ref void delegate() @safe).callDelegate(ref vibe.core.task.TaskFuncInfo) [0x7cee5b]
  | ../../../.dub/packages/vibe-core-1.8.1/vibe-core/source/vibe/core/task.d:674 void vibe.core.task.TaskFuncInfo.call() [0x964941]
  | ../../../.dub/packages/vibe-core-1.8.1/vibe-core/source/vibe/core/task.d:400 nothrow void vibe.core.task.TaskFiber.run() [0x963b64]
  | ??:? void core.thread.fiber.Fiber.run() [0xa5f325]
  | ??:? fiber_entryPoint [0xa5f20a]
  | Program exited with code -6
  | 🚨 Error: The command exited with status 2

Same test failing with vibe.d+vibe-core.

Assert error in eventcore

I noticed my app crashes sometimes. Here's a related part of journalctl log:

Apr 11 13:26:33 server radio[26291]: core.exception.AssertError@../../.dub/packages/eventcore-0.8.34/eventcore/source/eventcore/drivers/posix/driver.d(333): Clearing referenced file descriptor slot.
Apr 11 13:26:33 server radio[26291]: ----------------
Apr 11 13:26:33 server radio[26291]: ??:? _d_assert_msg [0xe3ad88c6]
Apr 11 13:26:33 server radio[26291]: ??:? nothrow @safe void eventcore.drivers.posix.driver.PosixEventLoop.clearFD!(eventcore.drivers.posix.sockets.StreamSocketSlot).clearFD(eventcore.driver.Handle!("fd", ulong, -1uL).Handle) [0xe3aaa7c8]
Apr 11 13:26:33 server radio[26291]: ??:? _D9eventcore7drivers5posix7sockets__T23PosixEventDriverSocketsHTCQClQCeQBz5epoll14EpollEventLoopZQCi13connectStreamMFNbNfMC3std6socket7AddressMQvDFNbNfSQFu6driver__T6HandleVAyaa12_73747265616d536f636b6574TSQHwQCc__TQByVQBua6_736f636b6574TSQJdQDj__TQDfVQDba2_6664TmVmN1ZQEaVQBjS1N1ZQEmVQDcS1S1N1ZQFaEQLlQFr13ConnectStatusZvZQGq [0xe3a952da]
Apr 11 13:26:33 server systemd[1]: dubradio.service: Main process exited, code=killed, status=6/ABRT

Using vibe-d 0.8.3

Is it problem with my app or a library? I can provide the source code if it's needed. I recently ported it from vibe 0.7.*, so could make something wrong.

Compilation fails on FreeBSD 12.0

Hi.
I have FreeBSD 12.0, ldc2 from packages and dmd2 from dlang.org.
I have created simple dub project with vibe.d in dependencies.

$ dub build
Running pre-generate commands for vibe-d:tls...
Performing "debug" build using /usr/local/bin/ldc2 for x86_64.
...
eventcore 0.8.48: building configuration "kqueue"...
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/processes.d(316,10): Error: module core.sys.posix.sys.wait import idtype_t not found
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/processes.d(316,10): Error: module core.sys.posix.sys.wait import WEXITED not found, did you mean function core.sys.posix.sys.wait.WIFEXITED?
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/processes.d(316,10): Error: module core.sys.posix.sys.wait import waitid not found, did you mean function core.sys.posix.sys.wait.waitpid?
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/driver.d(58,41): Error: template instance eventcore.drivers.posix.processes.PosixEventDriverProcesses!(SelectEventLoop) error instantiating
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/select.d(26,27): instantiated from here: PosixEventDriver!(SelectEventLoop)
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/processes.d(316,10): Error: module core.sys.posix.sys.wait import idtype_t not found
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/processes.d(316,10): Error: module core.sys.posix.sys.wait import WEXITED not found, did you mean function core.sys.posix.sys.wait.WIFEXITED?
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/processes.d(316,10): Error: module core.sys.posix.sys.wait import waitid not found, did you mean function core.sys.posix.sys.wait.waitpid?
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/driver.d(58,41): Error: template instance eventcore.drivers.posix.processes.PosixEventDriverProcesses!(KqueueEventLoop) error instantiating
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/kqueue.d(32,27): instantiated from here: PosixEventDriver!(KqueueEventLoop)
/usr/local/bin/ldc2 failed with exit code 1.

Building with dmd2 produces the same:

$ dub build --compiler=dmd
Running pre-generate commands for vibe-d:tls...
Performing "debug" build using dmd for x86_64.
...
eventcore 0.8.48: building configuration "kqueue"...
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/processes.d(316,10): Error: module core.sys.posix.sys.wait import idtype_t not found
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/processes.d(316,10): Error: module core.sys.posix.sys.wait import WEXITED not found, did you mean function core.sys.posix.sys.wait.WIFEXITED?
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/processes.d(316,10): Error: module core.sys.posix.sys.wait import waitid not found, did you mean function core.sys.posix.sys.wait.waitpid?
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/driver.d(58,41): Error: template instance eventcore.drivers.posix.processes.PosixEventDriverProcesses!(SelectEventLoop) error instantiating
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/select.d(26,27): instantiated from here: PosixEventDriver!(SelectEventLoop)
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/processes.d(316,10): Error: module core.sys.posix.sys.wait import idtype_t not found
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/processes.d(316,10): Error: module core.sys.posix.sys.wait import WEXITED not found, did you mean function core.sys.posix.sys.wait.WIFEXITED?
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/processes.d(316,10): Error: module core.sys.posix.sys.wait import waitid not found, did you mean function core.sys.posix.sys.wait.waitpid?
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/driver.d(58,41): Error: template instance eventcore.drivers.posix.processes.PosixEventDriverProcesses!(KqueueEventLoop) error instantiating
/home/s/.dub/packages/eventcore-0.8.48/eventcore/source/eventcore/drivers/posix/kqueue.d(32,27): instantiated from here: PosixEventDriver!(KqueueEventLoop)
dmd failed with exit code 1.

If I add missing definitions to the wait.d everything compiles ok.
So should I report it here or should I report it the dlang team and maybe the port maintainer?

android pie compile error

os android pie arm64, nokia 8
just may be not a priority..
tag future for this

LDC - the LLVM D compiler (1.13.0):
  based on DMD v2.083.1 and LLVM 7.0.1
  built with LDC - the LLVM D compiler (1.13.0)
  Default target: aarch64--linux-android
  Host CPU: cortex-a73
  http://dlang.org - http://wiki.dlang.org/LDC
Fetching vibe-core 1.6.2 (getting selected version)...
Fetching taggedalgebraic 0.11.3 (getting selected version)...
Fetching vibe-d 0.8.5 (getting selected version)...
Fetching stdx-allocator 2.77.5 (getting selected version)...
Fetching eventcore 0.8.42 (getting selected version)...
Fetching libasync 0.8.4 (getting selected version)...
Running pre-generate commands for vibe-d:tls...
Performing "debug" build using /data/data/com.termux/files/usr/bin/ldc2 for aarch64, arm_hardfloat.
taggedalgebraic 0.11.3: building configuration "library"...
eventcore 0.8.42: building configuration "epoll"...
../../.dub/packages/eventcore-0.8.42/eventcore/source/eventcore/drivers/posix/sockets.d(705,9): Error: no property ipv6mr_interface for type ipv6_mreq
../../.dub/packages/eventcore-0.8.42/eventcore/source/eventcore/drivers/posix/driver.d(48,25): Error: template instance `eventcore.drivers.posix.sockets.PosixEventDriverSockets!(SelectEventLoop)` error instantiating
../../.dub/packages/eventcore-0.8.42/eventcore/source/eventcore/drivers/posix/select.d(26,27):        instantiated from here: PosixEventDriver!(SelectEventLoop)
../../.dub/packages/eventcore-0.8.42/eventcore/source/eventcore/drivers/posix/sockets.d(705,9): Error: no property ipv6mr_interface for type ipv6_mreq
../../.dub/packages/eventcore-0.8.42/eventcore/source/eventcore/drivers/posix/driver.d(48,25): Error: template instance `eventcore.drivers.posix.sockets.PosixEventDriverSockets!(EpollEventLoop)` error instantiating
../../.dub/packages/eventcore-0.8.42/eventcore/source/eventcore/drivers/posix/epoll.d(19,26):        instantiated from here: PosixEventDriver!(EpollEventLoop)
/data/data/com.termux/files/usr/bin/ldc2 failed with exit code 1.

Posix processes driver causes zombie processes

With this test:

#!/usr/bin/env dub
/+ dub.sdl:
	name "zombie"
	dependency "vibe-core" version="~>1.7.0-beta.2"
+/

import std.stdio;
import vibe.core.process;

void main(string[] args)
{
	if (args.length == 2) writeln("Child: ", args[1]);
	else	{
		writeln("Main process start");
		auto res = execute(["./zombie", "hello"]);
		writeln("Child exited with status ", res.status, ", output: ", res.output);
		readln();
	}
}

I've got expected output:

Main process start
Child exited with status 0, output: Child: hello

But when still running, processes looks like this:

$ ps -aux | grep zombie
tcha     11767  0.0  0.0  29960  5388 pts/12   S+   10:39   0:00 ./zombie
tcha     11768  0.0  0.0      0     0 pts/12   Z+   10:39   0:00 [zombie] <defunct>

Waiter count starts at non-zero?

Hi, I was interested in taking this out for a spin, but that the following code outputs 5 and then waits in the event loop seems strange:

#! /usr/bin/env dub
/++ dub.sdl:
        name "waiter-count-non-zero"
        description "Waitercount non-zero"
        dependency "eventcore" version="~>0.8"
+/
module waiter_count_non_zero;

void main()
{
        print("%s", eventDriver.core.waiterCount);
        while (eventDriver.core.waiterCount)
                eventDriver.core.processEvents(Duration.max);
}

import eventcore.core : eventDriver;
import eventcore.internal.utils : print;
import core.time : Duration;

I would expect waiterCount to be 0, seeing as I have not registered anything with the event loop, and the program to terminate (the event loop should not block if I have no handles/requests with it.

(This happens on Linux with version 0.8.8)

Access signalfd_siginfo from signal handler

Posix signal handlers come with a lot of useful information, but the only thing currently made available is the signal that was raised. I'm currently dealing with processes and using SIGCHLD to catch when a process has terminated, but I can't get the process ID from the signal handler through the current api.

A quick fix would be just replacing the int with a signalfd_siginfo in the callback, but I'm not sure how that fits with the current design philosophy. Can't test but it shouldn't break Windows builds considering signals aren't implemented there.

0.8.44: broken compilation

Trying to build vibe.d:

$ dub build --combined -b release --compiler=dmd --config=vibe-core
Running pre-generate commands for vibe-d:tls...
Performing "release" build using dmd for x86_64.
vibe-d 0.8.6-beta.1+commit.23.g756f6645: building configuration "vibe-core"...
../../.dub/packages/eventcore-0.8.44/eventcore/source/eventcore/drivers/posix/processes.d(305,25): Error: undefined identifier intptr_t
../../.dub/packages/eventcore-0.8.44/eventcore/source/eventcore/drivers/posix/driver.d(58,41): Error: template instance `eventcore.drivers.posix.processes.SignalEventDriverProcesses!(SelectEventLoop)` error instantiating
../../.dub/packages/eventcore-0.8.44/eventcore/source/eventcore/drivers/posix/select.d(26,27):        instantiated from here: PosixEventDriver!(SelectEventLoop)
../../.dub/packages/eventcore-0.8.44/eventcore/source/eventcore/drivers/posix/processes.d(305,25): Error: undefined identifier intptr_t
../../.dub/packages/eventcore-0.8.44/eventcore/source/eventcore/drivers/posix/driver.d(58,41): Error: template instance `eventcore.drivers.posix.processes.SignalEventDriverProcesses!(EpollEventLoop)` error instantiating
../../.dub/packages/eventcore-0.8.44/eventcore/source/eventcore/drivers/posix/epoll.d(19,26):        instantiated from here: PosixEventDriver!(EpollEventLoop)
dmd failed with exit code 1.

RefAddress & getLocalAddress

Need get iface where client connected to

Trying:

    scope tmp = new RefAddress;

    if (eventDriver.sockets.getLocalAddress(client, tmp))
    {
        
    }

Got assert:

eventcore-0.8.12/eventcore/source/eventcore/driver.d(495): Cannot grow size of a RefAddress.

Works, but ...

    version (Posix)   import core.sys.posix.sys.socket: sockaddr, socklen_t;
    version (Windows) import core.sys.windows.winsock2: sockaddr, socklen_t;

    sockaddr sa;
    scope tmp = new RefAddress(&sa, sa.sizeof);

    if (eventDriver.sockets.getLocalAddress(client, tmp))
    {
        
    }

Any crossplatform way?

Processes don't work with multiple event loops

In the processes constructor we create a signalfd to listen for SIGCHLD. Since we have a EventDriverProcesses per thread that means each thread will have a separate fd for SIGCHLD and its a race condition for who handles it.

Signals

It's Posix Signals? Any example?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.