aboutsummaryrefslogtreecommitdiff
path: root/libbutl/process-details.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'libbutl/process-details.hxx')
-rw-r--r--libbutl/process-details.hxx49
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