From aa5ce03b40003ee8f7cfff4d2f1285b405f5906a Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Sat, 18 Mar 2017 00:55:59 +0300 Subject: Fix file descriptors leakage to child process on Windows --- butl/process-details | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 butl/process-details (limited to 'butl/process-details') diff --git a/butl/process-details b/butl/process-details new file mode 100644 index 0000000..b07ceff --- /dev/null +++ b/butl/process-details @@ -0,0 +1,49 @@ +// file : butl/process-details -*- C++ -*- +// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef BUTL_PROCESS_DETAILS +#define BUTL_PROCESS_DETAILS + +#include + +#include +#if defined(__cpp_lib_shared_mutex) || defined(__cpp_lib_shared_timed_mutex) +# include +#endif + +namespace butl +{ +#if defined(__cpp_lib_shared_mutex) + using shared_mutex = std::shared_mutex; + using ulock = std::unique_lock; + using slock = std::shared_lock; +#elif defined(__cpp_lib_shared_timed_mutex) + using shared_mutex = std::shared_timed_mutex; + using ulock = std::unique_lock; + using slock = std::shared_lock; +#else + // Because we have this fallback, we need to be careful not to create + // multiple shared locks in the same thread. + // + struct shared_mutex: std::mutex + { + using mutex::mutex; + + void lock_shared () { lock (); } + void try_lock_shared () { try_lock (); } + void unlock_shared () { unlock (); } + }; + + using ulock = std::unique_lock; + using slock = ulock; +#endif + + // Mutex that is acquired to make a sequence of operations atomic in regards + // to child process spawning. Must be aquired for exclusive access for child + // process startup, and for shared access otherwise. Defined in process.cxx. + // + extern shared_mutex process_spawn_mutex; +} + +#endif // BUTL_PROCESS_DETAILS -- cgit v1.1