diff options
author | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-06-18 15:48:39 +0300 |
---|---|---|
committer | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-06-18 15:48:39 +0300 |
commit | ac4179e7de2b9ecd3696b8191fbdbde14e3f62cd (patch) | |
tree | 8b670aacc37004f0364ef9f7aa6c01e9b5659742 /test/fixtures | |
parent | 22acc2f14c9a21a3c6f8dbfc2adc689d6cd921bb (diff) | |
download | qtlocation-mapboxgl-ac4179e7de2b9ecd3696b8191fbdbde14e3f62cd.tar.gz |
Use a pipe() to synchronize the server initialization
As the signals are intercepted by debuggers.
Diffstat (limited to 'test/fixtures')
-rw-r--r-- | test/fixtures/util.cpp | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/test/fixtures/util.cpp b/test/fixtures/util.cpp index 7d9bbbfad7..068a3d849f 100644 --- a/test/fixtures/util.cpp +++ b/test/fixtures/util.cpp @@ -4,27 +4,51 @@ #include <csignal> +#include <unistd.h> + namespace mbgl { namespace test { pid_t startServer(const char *executable) { const std::string parent_pid = std::to_string(getpid()); + int pipefd[2]; + + if (pipe(pipefd)) { + throw std::runtime_error("Cannot create server pipe"); + } + pid_t pid = fork(); if (pid < 0) { throw std::runtime_error("Cannot create server process"); } else if (pid == 0) { + close(STDIN_FILENO); + + if (dup(pipefd[1])) { + Log::Error(Event::Setup, "Failed to start server: %s", strerror(errno)); + } + + close(pipefd[0]); + close(pipefd[1]); + char *args[] = { const_cast<char *>(executable), const_cast<char *>(parent_pid.c_str()), nullptr }; int ret = execv(executable, args); // This call should not return. In case execve failed, we exit anyway. if (ret < 0) { - Log::Error(Event::Setup, "failed to start server: %s", strerror(errno)); + Log::Error(Event::Setup, "Failed to start server: %s", strerror(errno)); } exit(0); } else { - // Wait until the server process sends SIGCONT. - raise(SIGSTOP); + char buffer[8]; + + // Wait until the server process sends something on the pipe. + if (!read(pipefd[0], buffer, sizeof(buffer))) { + throw std::runtime_error("Error reading a message from the server"); + } + + close(pipefd[0]); + close(pipefd[1]); } return pid; } |