X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=boost%2Fboost%2Fdetail%2Flwm_win32.hpp;h=22282314fb05fc1a589d20170c627385e9c7ee28;hb=fce4ab0e79bfda9651d7d7f3c951bfb5d7516fc5;hp=a54aefcb013d8634787b7a94fa3104e41b42be9a;hpb=59b6a4701a8d2b5155af08cf758b4ca120201282;p=lyx.git diff --git a/boost/boost/detail/lwm_win32.hpp b/boost/boost/detail/lwm_win32.hpp index a54aefcb01..22282314fb 100644 --- a/boost/boost/detail/lwm_win32.hpp +++ b/boost/boost/detail/lwm_win32.hpp @@ -1,14 +1,16 @@ #ifndef BOOST_DETAIL_LWM_WIN32_HPP_INCLUDED #define BOOST_DETAIL_LWM_WIN32_HPP_INCLUDED -#if _MSC_VER >= 1020 -#pragma once +// MS compatible compilers support #pragma once + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +# pragma once #endif // // boost/detail/lwm_win32.hpp // -// Copyright (c) 2002 Peter Dimov and Multi Media Ltd. +// Copyright (c) 2002, 2003 Peter Dimov // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. @@ -16,7 +18,13 @@ // warranty, and with no claim as to its suitability for any purpose. // -#include +#ifdef BOOST_USE_WINDOWS_H +# include +#endif + +#ifdef __BORLANDC__ +# pragma warn -8027 // Functions containing while are not expanded inline +#endif namespace boost { @@ -24,6 +32,31 @@ namespace boost namespace detail { +#ifndef BOOST_USE_WINDOWS_H + +#ifdef _WIN64 + +// Intel 6.0 on Win64 version, posted by Tim Fenders to [boost-users] + +extern "C" long_type __cdecl _InterlockedExchange(long volatile *, long); + +#pragma intrinsic(_InterlockedExchange) + +inline long InterlockedExchange(long volatile* lp, long l) +{ + return _InterlockedExchange(lp, l); +} + +#else // _WIN64 + +extern "C" __declspec(dllimport) long __stdcall InterlockedExchange(long volatile *, long); + +#endif // _WIN64 + +extern "C" __declspec(dllimport) void __stdcall Sleep(unsigned long); + +#endif // #ifndef BOOST_USE_WINDOWS_H + class lightweight_mutex { private: @@ -55,18 +88,23 @@ public: explicit scoped_lock(lightweight_mutex & m): m_(m) { - while( winapi::InterlockedExchange(&m_.l_, 1) ) + while( InterlockedExchange(&m_.l_, 1) ) { - winapi::Sleep(0); + // Note: changed to Sleep(1) from Sleep(0). + // According to MSDN, Sleep(0) will never yield + // to a lower-priority thread, whereas Sleep(1) + // will. Performance seems not to be affected. + + Sleep(1); } } ~scoped_lock() { - winapi::InterlockedExchange(&m_.l_, 0); + InterlockedExchange(&m_.l_, 0); - // Note: adding a Sleep(0) here will make - // the mutex more fair and will increase the overall + // Note: adding a yield here will make + // the spinlock more fair and will increase the overall // performance of some applications substantially in // high contention situations, but will penalize the // low contention / single thread case up to 5x @@ -78,4 +116,8 @@ public: } // namespace boost +#ifdef __BORLANDC__ +# pragma warn .8027 // Functions containing while are not expanded inline +#endif + #endif // #ifndef BOOST_DETAIL_LWM_WIN32_HPP_INCLUDED