diff --git a/include/boost/detail/lwm_linux.hpp b/include/boost/detail/lwm_linux.hpp new file mode 100644 index 0000000..c2ef69a --- /dev/null +++ b/include/boost/detail/lwm_linux.hpp @@ -0,0 +1,78 @@ +#ifndef BOOST_DETAIL_LWM_LINUX_HPP_INCLUDED +#define BOOST_DETAIL_LWM_LINUX_HPP_INCLUDED + +#if _MSC_VER >= 1020 +#pragma once +#endif + +// +// boost/detail/lwm_linux.hpp +// +// Copyright (c) 2002 Peter Dimov and Multi Media Ltd. +// +// 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 + +namespace boost +{ + +namespace detail +{ + +class lightweight_mutex +{ +private: + + atomic_t a_; + + lightweight_mutex(lightweight_mutex const &); + lightweight_mutex & operator=(lightweight_mutex const &); + +public: + + lightweight_mutex() + { + atomic_t a = ATOMIC_INIT(1); + a_ = a; + } + + 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( !atomic_dec_and_test(&m_.a_) ) + { + atomic_inc(&m_.a_); + // sched_yield(); + } + } + + ~scoped_lock() + { + atomic_inc(&m_.a_); + } + }; +}; + +} // namespace detail + +} // namespace boost + +#endif // #ifndef BOOST_DETAIL_LWM_WIN32_HPP_INCLUDED diff --git a/include/boost/detail/lwm_win32.hpp b/include/boost/detail/lwm_win32.hpp index 2a29c3d..60388d5 100644 --- a/include/boost/detail/lwm_win32.hpp +++ b/include/boost/detail/lwm_win32.hpp @@ -22,13 +22,10 @@ namespace boost namespace detail { -// Avoid #including +// avoid including -namespace win32 -{ extern "C" __declspec(dllimport) long __stdcall InterlockedExchange(long volatile *, long); extern "C" __declspec(dllimport) void __stdcall Sleep(unsigned long); -} class lightweight_mutex { @@ -61,14 +58,14 @@ public: explicit scoped_lock(lightweight_mutex & m): m_(m) { - while( win32::InterlockedExchange(&m_.l_, 1) ) win32::Sleep(0); + while( InterlockedExchange(&m_.l_, 1) ) Sleep(0); } ~scoped_lock() { - win32::InterlockedExchange(&m_.l_, 0); + InterlockedExchange(&m_.l_, 0); - // Note: adding a win32::Sleep(0) here will make + // Note: adding a Sleep(0) here will make // the mutex more fair and will increase the overall // performance of the application substantially in // high contention situations, but will penalize the