From aa98e2b37ee1b0a4c4470816cf0817056db66a9d Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 27 Feb 2002 16:35:15 +0000 Subject: [PATCH] Added lwm_irix.hpp (contributed by Dan Gohman) [SVN r12955] --- include/boost/detail/lightweight_mutex.hpp | 2 + include/boost/detail/lwm_irix.hpp | 78 ++++++++++++++++++++++ include/boost/detail/lwm_win32.hpp | 57 ---------------- 3 files changed, 80 insertions(+), 57 deletions(-) create mode 100644 include/boost/detail/lwm_irix.hpp diff --git a/include/boost/detail/lightweight_mutex.hpp b/include/boost/detail/lightweight_mutex.hpp index d4ef1c1..69a3a6c 100644 --- a/include/boost/detail/lightweight_mutex.hpp +++ b/include/boost/detail/lightweight_mutex.hpp @@ -40,6 +40,8 @@ # include #elif defined(linux) || defined(__linux) || defined(__linux__) # include +#elif defined(__sgi) +# include #elif defined(BOOST_HAS_PTHREADS) # include #else diff --git a/include/boost/detail/lwm_irix.hpp b/include/boost/detail/lwm_irix.hpp new file mode 100644 index 0000000..2a55161 --- /dev/null +++ b/include/boost/detail/lwm_irix.hpp @@ -0,0 +1,78 @@ +#ifndef BOOST_DETAIL_LWM_IRIX_HPP_INCLUDED +#define BOOST_DETAIL_LWM_IRIX_HPP_INCLUDED + +#if _MSC_VER >= 1020 +#pragma once +#endif + +// +// boost/detail/lwm_irix.hpp +// +// Copyright (c) 2002 Peter Dimov and Multi Media Ltd. +// Copyright (c) 2002 Dan Gohman +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// + +#include +#include +#include + +namespace boost +{ + +namespace detail +{ + +class lightweight_mutex +{ +private: + + __uint32_t l_; + + lightweight_mutex(lightweight_mutex const &); + lightweight_mutex & operator=(lightweight_mutex const &); + +public: + + lightweight_mutex(): l_(0) + { + } + + class scoped_lock; + friend class scoped_lock; + + class scoped_lock + { + private: + + lightweight_mutex & m_; + + scoped_lock(scoped_lock const &); + scoped_lock & operator=(scoped_lock const &); + + public: + + explicit scoped_lock(lightweight_mutex & m): m_(m) + { + while( test_and_set32(&m_.l_, 1) ) + { + sched_yield(); + } + } + + ~scoped_lock() + { + m_.l_ = 0; + } + }; +}; + +} // namespace detail + +} // namespace boost + +#endif // #ifndef BOOST_DETAIL_LWM_IRIX_HPP_INCLUDED diff --git a/include/boost/detail/lwm_win32.hpp b/include/boost/detail/lwm_win32.hpp index 8bcd469..3e79198 100644 --- a/include/boost/detail/lwm_win32.hpp +++ b/include/boost/detail/lwm_win32.hpp @@ -16,18 +16,12 @@ // warranty, and with no claim as to its suitability for any purpose. // -#ifndef BOOST_LWM_WIN32_USE_CRITICAL_SECTION -# include -#endif - namespace boost { namespace detail { -#ifndef BOOST_LWM_WIN32_USE_CRITICAL_SECTION - // avoid including extern "C" __declspec(dllimport) long __stdcall InterlockedExchange(long volatile *, long); @@ -80,57 +74,6 @@ public: }; }; -#else - -class lightweight_mutex -{ -private: - - CRITICAL_SECTION cs_; - - lightweight_mutex(lightweight_mutex const &); - lightweight_mutex & operator=(lightweight_mutex const &); - -public: - - lightweight_mutex() - { - ::InitializeCriticalSection(&cs_); - } - - ~lightweight_mutex() - { - ::DeleteCriticalSection(&cs_); - } - - class scoped_lock; - friend class scoped_lock; - - class scoped_lock - { - private: - - lightweight_mutex & m_; - - scoped_lock(scoped_lock const &); - scoped_lock & operator=(scoped_lock const &); - - public: - - explicit scoped_lock(lightweight_mutex & m): m_(m) - { - ::EnterCriticalSection(&m_.cs_); - } - - ~scoped_lock() - { - ::LeaveCriticalSection(&m_.cs_); - } - }; -}; - -#endif - } // namespace detail } // namespace boost