diff options
author | Chase Douglas <chase.douglas@canonical.com> | 2012-04-20 09:41:45 -0700 |
---|---|---|
committer | Chase Douglas <chase.douglas@canonical.com> | 2012-04-23 07:35:44 -0700 |
commit | 6b66ce9fc632108a765a8e96cd287b6179f9cbb0 (patch) | |
tree | 2357b5179516067ce339cbad46b69eff614e9148 | |
parent | 080cee4010157b45c60b5693eca4f9aebda0c900 (diff) |
Wait for dummy X server to shut down in Environment::TearDown()
If two xorg-gtest binaries are executed one after another, the second
one may attempt to start its X server before the first one's X server
has fully shut down. This leads to the second X server not starting.
Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
Reviewed-by: Stephen M. Webb <stephen.webb@bregmasoft.ca>
-rw-r--r-- | src/environment.cpp | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/src/environment.cpp b/src/environment.cpp index c1c4d80..d7d1c82 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -144,17 +144,35 @@ void xorg::testing::Environment::SetUp() { } void xorg::testing::Environment::TearDown() { - if (!d_->process.Terminate()) { - std::cerr << "Warning: Failed to terminate dummy Xorg server: " - << std::strerror(errno) << "\n"; - if (!d_->process.Kill()) - std::cerr << "Warning: Failed to kill dummy Xorg server: " - << std::strerror(errno) << "\n"; + if (d_->process.Terminate()) { + for (int i = 0; i < 10; i++) { + int status; + int pid = waitpid(d_->process.Pid(), &status, WNOHANG); + + if (pid == d_->process.Pid()) + return; + + sleep(1); /* Give the dummy X server more time to shut down */ + } } + + Kill(); } void xorg::testing::Environment::Kill() { if (!d_->process.Kill()) std::cerr << "Warning: Failed to kill dummy Xorg server: " << std::strerror(errno) << "\n"; + + for (int i = 0; i < 10; i++) { + int status; + int pid = waitpid(d_->process.Pid(), &status, WNOHANG); + + if (pid == d_->process.Pid()) + return; + + sleep(1); /* Give the dummy X server more time to shut down */ + } + + std::cerr << "Warning: Dummy X server did not shut down\n"; } |