[PATCH xorg-gtest] Wait for dummy X server to shut down in Environment::TearDown()

Chase Douglas chase.douglas at canonical.com
Fri Apr 20 09:45:59 PDT 2012


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 at canonical.com>
---
 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";
 }
-- 
1.7.9.1



More information about the xorg-devel mailing list