diff options
Diffstat (limited to 'libbutl/process-details.hxx')
-rw-r--r-- | libbutl/process-details.hxx | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/libbutl/process-details.hxx b/libbutl/process-details.hxx new file mode 100644 index 0000000..b078cbb --- /dev/null +++ b/libbutl/process-details.hxx @@ -0,0 +1,49 @@ +// file : libbutl/process-details.hxx -*- C++ -*- +// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef LIBBUTL_PROCESS_DETAILS_HXX +#define LIBBUTL_PROCESS_DETAILS_HXX + +#include <mutex> + +#include <libbutl/ft/shared_mutex.hxx> +#if defined(__cpp_lib_shared_mutex) || defined(__cpp_lib_shared_timed_mutex) +# include <shared_mutex> +#endif + +namespace butl +{ +#if defined(__cpp_lib_shared_mutex) + using shared_mutex = std::shared_mutex; + using ulock = std::unique_lock<shared_mutex>; + using slock = std::shared_lock<shared_mutex>; +#elif defined(__cpp_lib_shared_timed_mutex) + using shared_mutex = std::shared_timed_mutex; + using ulock = std::unique_lock<shared_mutex>; + using slock = std::shared_lock<shared_mutex>; +#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<shared_mutex>; + 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 // LIBBUTL_PROCESS_DETAILS_HXX |