Ensure async lambdas are templates to fix LDC linker errors. Fixes #65.

If the lambda is a concrete function, two different versions will end up for it in the final binary on macOS when compiled with LDC. Using argument inference works around that issue.
This commit is contained in:
Sönke Ludwig 2018-03-08 14:24:22 +01:00
parent 258abe0844
commit eb3620056f
2 changed files with 3 additions and 3 deletions

View file

@ -991,7 +991,7 @@ struct FileDescriptorEvent {
alias readwaiter = Waitable!(IOCallback, alias readwaiter = Waitable!(IOCallback,
cb => eventDriver.sockets.waitForData(m_socket, cb), cb => eventDriver.sockets.waitForData(m_socket, cb),
cb => eventDriver.sockets.cancelRead(m_socket), cb => eventDriver.sockets.cancelRead(m_socket),
(StreamSocketFD fd, IOStatus st, size_t nb) { got_data = st == IOStatus.ok; } (fd, st, nb) { got_data = st == IOStatus.ok; }
); );
asyncAwaitAny!(true, readwaiter)(timeout); asyncAwaitAny!(true, readwaiter)(timeout);

View file

@ -201,7 +201,7 @@ TCPConnection connectTCP(NetworkAddress addr, NetworkAddress bind_address = anyA
alias waiter = Waitable!(ConnectCallback, alias waiter = Waitable!(ConnectCallback,
cb => eventDriver.sockets.connectStream(uaddr, baddr, cb), cb => eventDriver.sockets.connectStream(uaddr, baddr, cb),
(ConnectCallback cb, StreamSocketFD sock_fd) { (cb, sock_fd) {
cancelled = true; cancelled = true;
eventDriver.sockets.cancelConnectStream(sock_fd); eventDriver.sockets.cancelConnectStream(sock_fd);
}, },
@ -610,7 +610,7 @@ mixin(tracer);
determined or the specified timeout is reached. determined or the specified timeout is reached.
*/ */
WaitForDataAsyncStatus waitForDataAsync(CALLABLE)(CALLABLE read_ready_callback, Duration timeout = Duration.max) WaitForDataAsyncStatus waitForDataAsync(CALLABLE)(CALLABLE read_ready_callback, Duration timeout = Duration.max)
if (is(typeof(read_ready_callback(true)))) if (is(typeof(() @safe { read_ready_callback(true); } ())))
{ {
mixin(tracer); mixin(tracer);
import vibe.core.core : setTimer; import vibe.core.core : setTimer;