Implement TCPListener.stopListening and fix the vibe.core.net.1726 test.
The test fix follows the fix in the vibe.d repository: rejectedsoftware/vibe.d#f960427e5974c176c58b516647895a2af4ea181b
This commit is contained in:
parent
a70f35e846
commit
d7b2173cb3
|
@ -683,6 +683,9 @@ private void loopWithTimeout(alias LoopBody, ExceptionType = Exception)(Duration
|
|||
Represents a listening TCP socket.
|
||||
*/
|
||||
struct TCPListener {
|
||||
// FIXME: copying may lead to dangling FDs - this somehow needs to employ reference counting without breaking
|
||||
// the previous behavior of keeping the socket alive when the listener isn't stored. At the same time,
|
||||
// stopListening() needs to keep working.
|
||||
private {
|
||||
StreamListenSocketFD m_socket;
|
||||
NetworkAddress m_bindAddress;
|
||||
|
@ -704,7 +707,10 @@ struct TCPListener {
|
|||
/// Stops listening and closes the socket.
|
||||
void stopListening()
|
||||
{
|
||||
assert(false);
|
||||
if (m_socket != StreamListenSocketFD.invalid) {
|
||||
eventDriver.sockets.releaseRef(m_socket);
|
||||
m_socket = StreamListenSocketFD.invalid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,12 +10,11 @@ import vibe.core.net;
|
|||
import core.time : msecs;
|
||||
import vibe.core.log;
|
||||
|
||||
void main()
|
||||
{
|
||||
bool done = false;
|
||||
auto buf = new ubyte[512*1024*1024];
|
||||
ubyte[] buf;
|
||||
|
||||
listenTCP(11375,(conn) {
|
||||
void performTest(bool reverse)
|
||||
{
|
||||
auto l = listenTCP(11375, (conn) {
|
||||
bool read_ex = false;
|
||||
bool write_ex = false;
|
||||
auto rt = runTask!TCPConnection((conn) {
|
||||
|
@ -29,10 +28,10 @@ void main()
|
|||
} // expected
|
||||
}, conn);
|
||||
auto wt = runTask!TCPConnection((conn) {
|
||||
sleep(1.msecs); // give the connection time to establish
|
||||
sleep(reverse ? 100.msecs : 20.msecs); // give the connection time to establish
|
||||
try {
|
||||
conn.write(buf);
|
||||
assert(false, "Expected read() to throw an exception.");
|
||||
assert(false, "Expected write() to throw an exception.");
|
||||
} catch (Exception) {
|
||||
write_ex = true;
|
||||
conn.close();
|
||||
|
@ -44,24 +43,28 @@ void main()
|
|||
wt.join();
|
||||
assert(read_ex, "No read exception thrown");
|
||||
assert(write_ex, "No write exception thrown");
|
||||
done = true;
|
||||
logInfo("Test has finished successfully.");
|
||||
exitEventLoop();
|
||||
}, "127.0.0.1");
|
||||
|
||||
runTask({
|
||||
try {
|
||||
auto conn = connectTCP("127.0.0.1", 11375);
|
||||
sleep(10.msecs);
|
||||
sleep(reverse ? 20.msecs : 100.msecs);
|
||||
conn.close();
|
||||
} catch (Exception e) assert(false, e.msg);
|
||||
sleep(50.msecs);
|
||||
assert(done, "Not done");
|
||||
|
||||
exitEventLoop();
|
||||
});
|
||||
|
||||
setTimer(2000.msecs, {
|
||||
assert(false, "Test has hung.");
|
||||
});
|
||||
runEventLoop();
|
||||
|
||||
runApplication();
|
||||
l.stopListening();
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
setTimer(10000.msecs, { assert(false, "Test has hung."); });
|
||||
buf = new ubyte[512*1024*1024];
|
||||
|
||||
performTest(false);
|
||||
performTest(true);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue