vibe-d / eventcore Goto Github PK
View Code? Open in Web Editor NEWHigh performance proactor event loop abstraction library
License: MIT License
High performance proactor event loop abstraction library
License: MIT License
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.
I've not find a way to turn on the SO_BROADCAST option for UDP sockets: is it possible?
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
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.
> 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.
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 ?
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.
:(
In the WinAPI diver, a connection does not initially have the state ConnectionState.connected
after calling accept, which causes the wrong connected
state to be reported by vibe-core.
This is the cause for vibe-d/vibe.d#2104
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'
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.
How to set :
Some times we need wait for event without eventloop, any plans to implement asyncAwait utils?
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
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.
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.
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:
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/
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
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:
Use the test case provided in the original post here
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.
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
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;
}
The Posix and Windows drivers behave differently with regard to handling the case where there is no reference to the socket left in the user code. See vibe-d/vibe-core#128.
This is useful to guarntee that a high-level algorithm "start watching" -> "scan directory" -> "read changes in a loop" doesn't lose any changes. The "scan directory" part would then be deferred until the callback gets invoked.
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 --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?
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
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.
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?
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
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_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.
Is there a special reason why there is a custom definition for events enums in https://github.com/vibe-d/eventcore/blob/master/source/eventcore/drivers/posix/events.d#L12 ?
Why not directly using core.sys.linux.sys.eventfd
from druntine?
Currently there is a Linux build dependency on libanl
see https://github.com/vibe-d/eventcore/blob/master/dub.sdl#L8
That library is glibc specific and not present on other libc version (like uClibc).
I tried to version it out with cruntime_glibc
but that doesn't look to be supported by dub.
Can it be removed altogether?
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).
Should use waitpid(-1, ...)
directly to wait for the next exited child instead of going through the full list of known processes. Since this potentially breaks third party code that works with processes, this cannot be the default. See also #122 (comment)
Currently very few symbols have basic documentation.
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
Grep shows that it's not. Learned about this return code the hard way while using std.socket. It definitely breaks synchronous code on long blocking calls, if unhandled.
https://stackoverflow.com/questions/6870158/epoll-wait-fails-due-to-eintr-how-to-remedy-this
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
.
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.
It seems that res_init should be called when getaddrinfo failed.
Link: rust-lang/rust#41570
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: modulecore.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: modulecore.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: modulecore.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 instanceeventcore.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: modulecore.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: modulecore.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: modulecore.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 instanceeventcore.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?
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.
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>
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)
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.
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.
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?
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.
It's Posix Signals? Any example?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.