From 897fee84ea1cfd18daad88130021b8f160e593f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Ludwig?= Date: Mon, 3 Sep 2018 13:45:53 +0200 Subject: [PATCH] Free resources associated with waitForDataAsync as early as possible. Instead of letting the GC clean up at an undefined point in time. --- source/vibe/core/net.d | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/source/vibe/core/net.d b/source/vibe/core/net.d index a2cf17a..2c2a2a6 100644 --- a/source/vibe/core/net.d +++ b/source/vibe/core/net.d @@ -633,6 +633,8 @@ mixin(tracer); } static final class WaitContext { + import std.algorithm.mutation : move; + CALLABLE callback; TCPConnection connection; Timer timer; @@ -648,7 +650,7 @@ mixin(tracer); void onTimeout() { eventDriver.sockets.cancelRead(connection.m_socket); - callback(false); + invoke(false); } void onData(StreamSocketFD, IOStatus st, size_t nb) @@ -656,7 +658,15 @@ mixin(tracer); if (timer) timer.stop(); assert(connection.m_context.readBuffer.length == 0); connection.m_context.readBuffer.putN(nb); - callback(connection.m_context.readBuffer.length > 0); + invoke(connection.m_context.readBuffer.length > 0); + } + + void invoke(bool status) + { + auto cb = move(callback); + connection = TCPConnection.init; + timer = Timer.init; + cb(status); } }