Commit ab23d6fa by Iain Buclaw

libphobos: Merge phobos upstream 6c9fb28b0

Fixes a thread deadlock that occurs in the test runner if libcurl is
missing.

Library fix for https://gcc.gnu.org/PR88654

Reviewed-on: https://github.com/dlang/phobos/pull/6824

From-SVN: r268746
parent 2a484d14
d4933a90b1e8446c04d64cd044658f2b33250bd3 6c9fb28b0f8813d41798202a9d19c6b37ba5da5f
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the dlang/phobos repository. merge done from the dlang/phobos repository.
...@@ -178,7 +178,7 @@ version (unittest) ...@@ -178,7 +178,7 @@ version (unittest)
import std.range; import std.range;
import std.stdio; import std.stdio;
import std.socket : Address, INADDR_LOOPBACK, Socket, TcpSocket; import std.socket : Address, INADDR_LOOPBACK, Socket, SocketShutdown, TcpSocket;
private struct TestServer private struct TestServer
{ {
...@@ -192,6 +192,7 @@ version (unittest) ...@@ -192,6 +192,7 @@ version (unittest)
private: private:
string _addr; string _addr;
Tid tid; Tid tid;
TcpSocket sock;
static void loop(shared TcpSocket listener) static void loop(shared TcpSocket listener)
{ {
...@@ -215,20 +216,34 @@ version (unittest) ...@@ -215,20 +216,34 @@ version (unittest)
private TestServer startServer() private TestServer startServer()
{ {
tlsInit = true;
auto sock = new TcpSocket; auto sock = new TcpSocket;
sock.bind(new InternetAddress(INADDR_LOOPBACK, InternetAddress.PORT_ANY)); sock.bind(new InternetAddress(INADDR_LOOPBACK, InternetAddress.PORT_ANY));
sock.listen(1); sock.listen(1);
auto addr = sock.localAddress.toString(); auto addr = sock.localAddress.toString();
auto tid = spawn(&TestServer.loop, cast(shared) sock); auto tid = spawn(&TestServer.loop, cast(shared) sock);
return TestServer(addr, tid); return TestServer(addr, tid, sock);
} }
__gshared TestServer server;
bool tlsInit;
private ref TestServer testServer() private ref TestServer testServer()
{ {
__gshared TestServer server;
return initOnce!server(startServer()); return initOnce!server(startServer());
} }
static ~this()
{
// terminate server from a thread local dtor of the thread that started it,
// because thread_joinall is called before shared module dtors
if (tlsInit && server.sock)
{
server.sock.shutdown(SocketShutdown.RECEIVE);
server.sock.close();
}
}
private struct Request(T) private struct Request(T)
{ {
string hdrs; string hdrs;
...@@ -429,7 +444,11 @@ if (isCurlConn!Conn) ...@@ -429,7 +444,11 @@ if (isCurlConn!Conn)
s.send(httpOK("Hello world")); s.send(httpOK("Hello world"));
}); });
auto fn = std.file.deleteme; auto fn = std.file.deleteme;
scope (exit) std.file.remove(fn); scope (exit)
{
if (std.file.exists(fn))
std.file.remove(fn);
}
download(host, fn); download(host, fn);
assert(std.file.readText(fn) == "Hello world"); assert(std.file.readText(fn) == "Hello world");
} }
...@@ -491,7 +510,11 @@ if (isCurlConn!Conn) ...@@ -491,7 +510,11 @@ if (isCurlConn!Conn)
foreach (host; [testServer.addr, "http://"~testServer.addr]) foreach (host; [testServer.addr, "http://"~testServer.addr])
{ {
auto fn = std.file.deleteme; auto fn = std.file.deleteme;
scope (exit) std.file.remove(fn); scope (exit)
{
if (std.file.exists(fn))
std.file.remove(fn);
}
std.file.write(fn, "upload data\n"); std.file.write(fn, "upload data\n");
testServer.handle((s) { testServer.handle((s) {
auto req = s.recvReq; auto req = s.recvReq;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment