From 249341bc5838532f99df5c4709a1bd9b9131dcf7 Mon Sep 17 00:00:00 2001 From: default0 Date: Wed, 20 Jan 2016 19:45:29 +0100 Subject: [PATCH 1/9] Fix compiler errors on windows Checking the repo out and running dub to build on windows would give two compiler errors, one because UnixAddress is not defined another because a function misses a return statement if Unix sockets are not possible. --- src/client/client.d | 11 +++++++++-- src/common/socket.d | 4 ++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/client/client.d b/src/client/client.d index 515baae..64648c4 100644 --- a/src/client/client.d +++ b/src/client/client.d @@ -312,8 +312,15 @@ Socket createSocket(string socketFile, ushort port) } else { - socket = new Socket(AddressFamily.UNIX, SocketType.STREAM); - socket.connect(new UnixAddress(socketFile)); + version(Windows) + { + throw new Exception("Cannot use UNIX domain sockets on Windows."); + } + else + { + socket = new Socket(AddressFamily.UNIX, SocketType.STREAM); + socket.connect(new UnixAddress(socketFile)); + } } socket.setOption(SocketOptionLevel.SOCKET, SocketOption.RCVTIMEO, dur!"seconds"(5)); socket.blocking = true; diff --git a/src/common/socket.d b/src/common/socket.d index 05623f6..eed6b40 100644 --- a/src/common/socket.d +++ b/src/common/socket.d @@ -42,4 +42,8 @@ string generateSocketName() "dcd.socket"); } } + else + { + assert(0); + } } From d26ce5ed202723c0f72cbf9448c3743c8397479d Mon Sep 17 00:00:00 2001 From: Hackerpilot Date: Thu, 21 Jan 2016 15:44:40 -0800 Subject: [PATCH 2/9] Fix #286 --- src/client/client.d | 3 ++- src/server/server.d | 26 +++++++++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/client/client.d b/src/client/client.d index 64648c4..8d91137 100644 --- a/src/client/client.d +++ b/src/client/client.d @@ -314,7 +314,8 @@ Socket createSocket(string socketFile, ushort port) { version(Windows) { - throw new Exception("Cannot use UNIX domain sockets on Windows."); + // should never be called with non-null socketFile on Windows + assert(false); } else { diff --git a/src/server/server.d b/src/server/server.d index 406dc32..a77ef42 100644 --- a/src/server/server.d +++ b/src/server/server.d @@ -128,17 +128,25 @@ int main(string[] args) } else { - socket = new Socket(AddressFamily.UNIX, SocketType.STREAM); - if (exists(socketFile)) + version(Windows) { - info("Cleaning up old socket file at ", socketFile); - remove(socketFile); + fatal("UNIX domain sockets not supported on Windows"); + return 1; + } + else + { + socket = new Socket(AddressFamily.UNIX, SocketType.STREAM); + if (exists(socketFile)) + { + info("Cleaning up old socket file at ", socketFile); + remove(socketFile); + } + socket.blocking = true; + socket.setOption(SocketOptionLevel.SOCKET, SocketOption.REUSEADDR, true); + socket.bind(new UnixAddress(socketFile)); + setAttributes(socketFile, S_IRUSR | S_IWUSR); + info("Listening at ", socketFile); } - socket.blocking = true; - socket.setOption(SocketOptionLevel.SOCKET, SocketOption.REUSEADDR, true); - socket.bind(new UnixAddress(socketFile)); - setAttributes(socketFile, S_IRUSR | S_IWUSR); - info("Listening at ", socketFile); } socket.listen(0); From 33aaa08ea42f991df3bb466a7a40c88c1c93a43c Mon Sep 17 00:00:00 2001 From: Alan Yuelkenbeck Date: Sat, 23 Jan 2016 10:38:56 -0600 Subject: [PATCH 3/9] Update build.bat --- build.bat | 1 + 1 file changed, 1 insertion(+) diff --git a/build.bat b/build.bat index 732acad..35933ca 100644 --- a/build.bat +++ b/build.bat @@ -23,6 +23,7 @@ dmd^ src\client\client.d^ src\common\messages.d^ src\common\dcd_version.d^ + src\common\socket.d^ msgpack-d\src\msgpack.d^ -Imsgpack-d\src^ -release -inline -O -wi^ From 52d8bb6f79de2bc68e34663262a6941d64fd780c Mon Sep 17 00:00:00 2001 From: Hackerpilot Date: Mon, 25 Jan 2016 16:57:48 -0800 Subject: [PATCH 4/9] Update libdparse --- libdparse | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libdparse b/libdparse index 4d87656..725529f 160000 --- a/libdparse +++ b/libdparse @@ -1 +1 @@ -Subproject commit 4d876562b4862a98bf1b6b6bf4fd07af96506a54 +Subproject commit 725529f0da46d11b1599337d501725f2bbd29ef3 From 21591b40816ebdba52701f17336ade7552804bd9 Mon Sep 17 00:00:00 2001 From: Hackerpilot Date: Mon, 25 Jan 2016 17:03:55 -0800 Subject: [PATCH 5/9] Fix #288 --- src/client/client.d | 54 +++++---------------------------- src/common/messages.d | 69 +++++++++++++++++++++++++++++++++++++++++++ src/server/server.d | 10 ++++++- 3 files changed, 85 insertions(+), 48 deletions(-) diff --git a/src/client/client.d b/src/client/client.d index 8d91137..7511d9f 100644 --- a/src/client/client.d +++ b/src/client/client.d @@ -30,13 +30,14 @@ import std.conv; import std.string; import std.experimental.logger; -import msgpack; import common.messages; import common.dcd_version; import common.socket; int main(string[] args) { + sharedLog.fatalHandler = () {}; + size_t cursorPos = size_t.max; string[] importPaths; ushort port = 9166; @@ -106,24 +107,12 @@ int main(string[] args) if (query) { - try + if (serverIsRunning(useTCP, socketFile, port)) { - Socket socket = createSocket(socketFile, port); - scope (exit) { socket.shutdown(SocketShutdown.BOTH); socket.close(); } - request.kind = RequestKind.query; - if (sendRequest(socket, request)) - { - const AutocompleteResponse response = getResponse(socket); - if (response.completionType == "ack") - { - writeln("Server is running"); - return 0; - } - else - throw new Exception(""); - } + writeln("Server is running"); + return 0; } - catch (Exception ex) + else { writeln("Server is not running"); return 1; @@ -328,39 +317,10 @@ Socket createSocket(string socketFile, ushort port) return socket; } -/** - * Returns: true on success - */ -bool sendRequest(Socket socket, AutocompleteRequest request) -{ - ubyte[] message = msgpack.pack(request); - ubyte[] messageBuffer = new ubyte[message.length + message.length.sizeof]; - auto messageLength = message.length; - messageBuffer[0 .. size_t.sizeof] = (cast(ubyte*) &messageLength)[0 .. size_t.sizeof]; - messageBuffer[size_t.sizeof .. $] = message[]; - return socket.send(messageBuffer) == messageBuffer.length; -} - -/** - * Gets the response from the server - */ -AutocompleteResponse getResponse(Socket socket) -{ - ubyte[1024 * 16] buffer; - auto bytesReceived = socket.receive(buffer); - if (bytesReceived == Socket.ERROR) - throw new Exception("Incorrect number of bytes received"); - if (bytesReceived == 0) - throw new Exception("Server closed the connection, 0 bytes received"); - AutocompleteResponse response; - msgpack.unpack(buffer[0..bytesReceived], response); - return response; -} - void printDocResponse(AutocompleteResponse response) { import std.array: join; - response.docComments.join(r"\n\n").writeln; + response.docComments.join(r"\n\n").writeln; } void printLocationResponse(AutocompleteResponse response) diff --git a/src/common/messages.d b/src/common/messages.d index f1b0d95..a3d07de 100644 --- a/src/common/messages.d +++ b/src/common/messages.d @@ -18,6 +18,9 @@ module common.messages; +import std.socket; +import msgpack; + /** * The type of completion list being returned */ @@ -157,3 +160,69 @@ struct AutocompleteResponse */ string[] importPaths; } + +/** + * Returns: true on success + */ +bool sendRequest(Socket socket, AutocompleteRequest request) +{ + ubyte[] message = msgpack.pack(request); + ubyte[] messageBuffer = new ubyte[message.length + message.length.sizeof]; + auto messageLength = message.length; + messageBuffer[0 .. size_t.sizeof] = (cast(ubyte*) &messageLength)[0 .. size_t.sizeof]; + messageBuffer[size_t.sizeof .. $] = message[]; + return socket.send(messageBuffer) == messageBuffer.length; +} + +/** + * Gets the response from the server + */ +AutocompleteResponse getResponse(Socket socket) +{ + ubyte[1024 * 16] buffer; + auto bytesReceived = socket.receive(buffer); + if (bytesReceived == Socket.ERROR) + throw new Exception("Incorrect number of bytes received"); + if (bytesReceived == 0) + throw new Exception("Server closed the connection, 0 bytes received"); + AutocompleteResponse response; + msgpack.unpack(buffer[0..bytesReceived], response); + return response; +} + +/** + * Returns: true if a server instance is running + * Params: + * useTCP = `true` to check a TCP port, `false` for UNIX domain socket + * socketFile = the file name for the UNIX domain socket + * port = the TCP port + */ +bool serverIsRunning(bool useTCP, string socketFile, ushort port) +{ + scope (failure) + return false; + AutocompleteRequest request; + request.kind = RequestKind.query; + Socket socket; + scope (exit) + { + socket.shutdown(SocketShutdown.BOTH); + socket.close(); + } + if (useTCP) + { + socket = new TcpSocket(AddressFamily.INET); + socket.connect(new InternetAddress("localhost", port)); + } + else + { + socket = new Socket(AddressFamily.UNIX, SocketType.STREAM); + socket.connect(new UnixAddress(socketFile)); + } + socket.setOption(SocketOptionLevel.SOCKET, SocketOption.RCVTIMEO, dur!"seconds"(5)); + socket.blocking = true; + if (sendRequest(socket, request)) + return getResponse(socket).completionType == "ack"; + else + return false; +} diff --git a/src/server/server.d b/src/server/server.d index a77ef42..fa7a32f 100644 --- a/src/server/server.d +++ b/src/server/server.d @@ -73,6 +73,8 @@ int main(string[] args) string socketFile = generateSocketName(); } + sharedLog.fatalHandler = () {}; + try { getopt(args, "port|p", &port, "I", &importPaths, "help|h", &help, @@ -86,6 +88,8 @@ int main(string[] args) return 1; } + globalLogLevel = level; + if (printVersion) { version (Windows) @@ -109,7 +113,11 @@ int main(string[] args) return 1; } - globalLogLevel = level; + if (serverIsRunning(useTCP, socketFile, port)) + { + fatal("Another instance of DCD-server is already running"); + return 1; + } info("Starting up..."); StopWatch sw = StopWatch(AutoStart.yes); From 4cc1f43ca89e99475dd1c14a1d33905d18304447 Mon Sep 17 00:00:00 2001 From: Hackerpilot Date: Mon, 25 Jan 2016 17:04:37 -0800 Subject: [PATCH 6/9] Ignore gdb temp files --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 94dfdd5..7cd2510 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,9 @@ perf.data.old # Valgrind reports callgrind.* +# GDB temp files +.gdb_history + # Git hash file githash.txt From 9793ecbb4943f56f9a4ea6abe77999535b55a701 Mon Sep 17 00:00:00 2001 From: Hackerpilot Date: Mon, 25 Jan 2016 18:40:53 -0800 Subject: [PATCH 7/9] Fix #282 --- dsymbol | 2 +- dub.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dsymbol b/dsymbol index 0605a90..c7d57d5 160000 --- a/dsymbol +++ b/dsymbol @@ -1 +1 @@ -Subproject commit 0605a90a84ac287f879530420c7046cded566b74 +Subproject commit c7d57d5b2041af51efc6e7be7e58ae15abce7637 diff --git a/dub.json b/dub.json index 3d6cf52..ff34b54 100644 --- a/dub.json +++ b/dub.json @@ -7,8 +7,8 @@ ], "license": "GPL-3.0", "dependencies": { - "dsymbol": "~>0.1.0", - "libdparse": "~>0.3.0", + "dsymbol": "~>0.1.1", + "libdparse": "~>0.4.1", "msgpack-d": "~>1.0.0-beta.2" }, "versions": ["built_with_dub"], From 17310a2830edecac1dc25de2f0e7201f53eea449 Mon Sep 17 00:00:00 2001 From: Hackerpilot Date: Mon, 25 Jan 2016 18:47:13 -0800 Subject: [PATCH 8/9] Test case for #282 --- tests/actual.txt | 0 tests/tc027/expected1.txt | 9 +++++++++ tests/tc027/file.d | 10 ++++++++++ tests/tc027/run.sh | 5 +++++ 4 files changed, 24 insertions(+) delete mode 100644 tests/actual.txt create mode 100644 tests/tc027/expected1.txt create mode 100644 tests/tc027/file.d create mode 100755 tests/tc027/run.sh diff --git a/tests/actual.txt b/tests/actual.txt deleted file mode 100644 index e69de29..0000000 diff --git a/tests/tc027/expected1.txt b/tests/tc027/expected1.txt new file mode 100644 index 0000000..a1254f5 --- /dev/null +++ b/tests/tc027/expected1.txt @@ -0,0 +1,9 @@ +identifiers +C l +alignof k +i v +init k +mangleof k +sizeof k +stringof k +tupleof k diff --git a/tests/tc027/file.d b/tests/tc027/file.d new file mode 100644 index 0000000..ed2da0d --- /dev/null +++ b/tests/tc027/file.d @@ -0,0 +1,10 @@ +struct Foo(C) +{ + int i; +} + +unittest +{ + auto foo = Foo!int(); + foo. +} diff --git a/tests/tc027/run.sh b/tests/tc027/run.sh new file mode 100755 index 0000000..d9fe1a8 --- /dev/null +++ b/tests/tc027/run.sh @@ -0,0 +1,5 @@ +set -e +set -u + +../../bin/dcd-client $1 file.d -c66 > actual1.txt +diff actual1.txt expected1.txt From 851fbd59186bf8b462a69df15fbc6fe9220d442f Mon Sep 17 00:00:00 2001 From: Hackerpilot Date: Mon, 25 Jan 2016 18:49:32 -0800 Subject: [PATCH 9/9] Update version --- src/common/dcd_version.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/dcd_version.d b/src/common/dcd_version.d index 01ca019..ac7c229 100644 --- a/src/common/dcd_version.d +++ b/src/common/dcd_version.d @@ -21,7 +21,7 @@ module common.dcd_version; /** * Human-readable version number */ -enum DCD_VERSION = "v0.8.0-alpha1"; +enum DCD_VERSION = "v0.8.0-beta2"; version (Windows) {} else version (built_with_dub) {}