Browse Source

De-duplicate cmUVSignalHackRAII

This was added separately in `cmCTestMultiProcessHandler` and
`cmQtAutoGenerator`.  Factor out the duplicate code into a common header
for re-use.
Brad King 7 years ago
parent
commit
3ec5f7c1a2

+ 1 - 0
Source/CMakeLists.txt

@@ -351,6 +351,7 @@ set(SRCS
   cmUuid.cxx
   cmUVHandlePtr.cxx
   cmUVHandlePtr.h
+  cmUVSignalHackRAII.h
   cmVariableWatch.cxx
   cmVariableWatch.h
   cmVersion.cxx

+ 2 - 37
Source/CTest/cmCTestMultiProcessHandler.cxx

@@ -11,6 +11,8 @@
 
 #include "cm_uv.h"
 
+#include "cmUVSignalHackRAII.h" // IWYU pragma: keep
+
 #include "cmsys/FStream.hxx"
 #include "cmsys/String.hxx"
 #include "cmsys/SystemInformation.hxx"
@@ -25,43 +27,6 @@
 #include <stdlib.h>
 #include <utility>
 
-#if defined(CMAKE_USE_SYSTEM_LIBUV) && !defined(_WIN32) &&                    \
-  UV_VERSION_MAJOR == 1 && UV_VERSION_MINOR < 19
-#define CMAKE_UV_SIGNAL_HACK
-/*
-   libuv does not use SA_RESTART on its signal handler, but C++ streams
-   depend on it for reliable i/o operations.  This RAII helper convinces
-   libuv to install its handler, and then revises the handler to add the
-   SA_RESTART flag.  We use a distinct uv loop that never runs to avoid
-   ever really getting a callback.  libuv may fill the hack loop's signal
-   pipe and then stop writing, but that won't break any real loops.
- */
-class cmUVSignalHackRAII
-{
-  uv_loop_t HackLoop;
-  cm::uv_signal_ptr HackSignal;
-  static void HackCB(uv_signal_t*, int) {}
-public:
-  cmUVSignalHackRAII()
-  {
-    uv_loop_init(&this->HackLoop);
-    this->HackSignal.init(this->HackLoop);
-    this->HackSignal.start(HackCB, SIGCHLD);
-    struct sigaction hack_sa;
-    sigaction(SIGCHLD, nullptr, &hack_sa);
-    if (!(hack_sa.sa_flags & SA_RESTART)) {
-      hack_sa.sa_flags |= SA_RESTART;
-      sigaction(SIGCHLD, &hack_sa, nullptr);
-    }
-  }
-  ~cmUVSignalHackRAII()
-  {
-    this->HackSignal.stop();
-    uv_loop_close(&this->HackLoop);
-  }
-};
-#endif
-
 class TestComparator
 {
 public:

+ 1 - 37
Source/cmQtAutoGenerator.h

@@ -7,6 +7,7 @@
 
 #include "cmQtAutoGen.h"
 #include "cmUVHandlePtr.h"
+#include "cmUVSignalHackRAII.h" // IWYU pragma: keep
 #include "cm_uv.h"
 
 #include <array>
@@ -203,43 +204,6 @@ public:
     PipeT UVPipeErr_;
   };
 
-#if defined(CMAKE_USE_SYSTEM_LIBUV) && !defined(_WIN32) &&                    \
-  UV_VERSION_MAJOR == 1 && UV_VERSION_MINOR < 19
-#define CMAKE_UV_SIGNAL_HACK
-  /*
-     libuv does not use SA_RESTART on its signal handler, but C++ streams
-     depend on it for reliable i/o operations.  This RAII helper convinces
-     libuv to install its handler, and then revises the handler to add the
-     SA_RESTART flag.  We use a distinct uv loop that never runs to avoid
-     ever really getting a callback.  libuv may fill the hack loop's signal
-     pipe and then stop writing, but that won't break any real loops.
-   */
-  class cmUVSignalHackRAII
-  {
-    uv_loop_t HackLoop;
-    cm::uv_signal_ptr HackSignal;
-    static void HackCB(uv_signal_t*, int) {}
-  public:
-    cmUVSignalHackRAII()
-    {
-      uv_loop_init(&this->HackLoop);
-      this->HackSignal.init(this->HackLoop);
-      this->HackSignal.start(HackCB, SIGCHLD);
-      struct sigaction hack_sa;
-      sigaction(SIGCHLD, NULL, &hack_sa);
-      if (!(hack_sa.sa_flags & SA_RESTART)) {
-        hack_sa.sa_flags |= SA_RESTART;
-        sigaction(SIGCHLD, &hack_sa, NULL);
-      }
-    }
-    ~cmUVSignalHackRAII()
-    {
-      this->HackSignal.stop();
-      uv_loop_close(&this->HackLoop);
-    }
-  };
-#endif
-
 public:
   // -- Constructors
   cmQtAutoGenerator();

+ 44 - 0
Source/cmUVSignalHackRAII.h

@@ -0,0 +1,44 @@
+/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+   file Copyright.txt or https://cmake.org/licensing for details.  */
+#pragma once
+#include "cmConfigure.h" // IWYU pragma: keep
+
+#include "cm_uv.h"
+
+#if defined(CMAKE_USE_SYSTEM_LIBUV) && !defined(_WIN32) &&                    \
+  UV_VERSION_MAJOR == 1 && UV_VERSION_MINOR < 19
+#define CMAKE_UV_SIGNAL_HACK
+#include "cmUVHandlePtr.h"
+/*
+   libuv does not use SA_RESTART on its signal handler, but C++ streams
+   depend on it for reliable i/o operations.  This RAII helper convinces
+   libuv to install its handler, and then revises the handler to add the
+   SA_RESTART flag.  We use a distinct uv loop that never runs to avoid
+   ever really getting a callback.  libuv may fill the hack loop's signal
+   pipe and then stop writing, but that won't break any real loops.
+ */
+class cmUVSignalHackRAII
+{
+  uv_loop_t HackLoop;
+  cm::uv_signal_ptr HackSignal;
+  static void HackCB(uv_signal_t*, int) {}
+public:
+  cmUVSignalHackRAII()
+  {
+    uv_loop_init(&this->HackLoop);
+    this->HackSignal.init(this->HackLoop);
+    this->HackSignal.start(HackCB, SIGCHLD);
+    struct sigaction hack_sa;
+    sigaction(SIGCHLD, nullptr, &hack_sa);
+    if (!(hack_sa.sa_flags & SA_RESTART)) {
+      hack_sa.sa_flags |= SA_RESTART;
+      sigaction(SIGCHLD, &hack_sa, nullptr);
+    }
+  }
+  ~cmUVSignalHackRAII()
+  {
+    this->HackSignal.stop();
+    uv_loop_close(&this->HackLoop);
+  }
+};
+#endif