summaryrefslogtreecommitdiff
path: root/boost/sort/common/spinlock.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/sort/common/spinlock.hpp')
-rw-r--r--boost/sort/common/spinlock.hpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/boost/sort/common/spinlock.hpp b/boost/sort/common/spinlock.hpp
new file mode 100644
index 0000000000..450ba6b53e
--- /dev/null
+++ b/boost/sort/common/spinlock.hpp
@@ -0,0 +1,88 @@
+//----------------------------------------------------------------------------
+/// @file spinlock_t.hpp
+/// @brief
+///
+/// @author Copyright (c) 2010 2015 Francisco José Tapia (fjtapia@gmail.com )\n
+/// Distributed under the Boost Software License, Version 1.0.\n
+/// ( See accompanyingfile LICENSE_1_0.txt or copy at
+/// http://www.boost.org/LICENSE_1_0.txt )
+/// @version 0.1
+///
+/// @remarks
+//-----------------------------------------------------------------------------
+#ifndef __BOOST_SORT_PARALLEL_DETAIL_UTIL_SPINLOCK_HPP
+#define __BOOST_SORT_PARALLEL_DETAIL_UTIL_SPINLOCK_HPP
+
+#include <atomic>
+#include <ctime>
+#include <functional>
+#include <memory>
+#include <mutex>
+#include <thread>
+
+namespace boost
+{
+namespace sort
+{
+namespace common
+{
+//
+//---------------------------------------------------------------------------
+/// @class spinlock_t
+/// @brief This class implement, from atomic variables, a spinlock
+/// @remarks This class meet the BasicLockable requirements ( lock, unlock )
+//---------------------------------------------------------------------------
+class spinlock_t
+{
+ private:
+ //------------------------------------------------------------------------
+ // P R I V A T E V A R I A B L E S
+ //------------------------------------------------------------------------
+ std::atomic_flag af;
+
+ public:
+ //
+ //-------------------------------------------------------------------------
+ // function : spinlock_t
+ /// @brief class constructor
+ /// @param [in]
+ //-------------------------------------------------------------------------
+ explicit spinlock_t ( ) noexcept { af.clear ( ); };
+ //
+ //-------------------------------------------------------------------------
+ // function : lock
+ /// @brief Lock the spinlock_t
+ //-------------------------------------------------------------------------
+ void lock ( ) noexcept
+ {
+ while (af.test_and_set (std::memory_order_acquire))
+ {
+ std::this_thread::yield ( );
+ };
+ };
+ //
+ //-------------------------------------------------------------------------
+ // function : try_lock
+ /// @brief Try to lock the spinlock_t, if not, return false
+ /// @return true : locked
+ /// false: not previous locked
+ //-------------------------------------------------------------------------
+ bool try_lock ( ) noexcept
+ {
+ return not af.test_and_set (std::memory_order_acquire);
+ };
+ //
+ //-------------------------------------------------------------------------
+ // function : unlock
+ /// @brief unlock the spinlock_t
+ //-------------------------------------------------------------------------
+ void unlock ( ) noexcept { af.clear (std::memory_order_release); };
+
+}; // E N D C L A S S S P I N L O C K
+//
+//***************************************************************************
+}; // end namespace common
+}; // end namespace sort
+}; // end namespace boost
+//***************************************************************************
+#endif