From e6605637f8c22aac4155f83c1fac5de3b49a751d Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sat, 16 Feb 2002 18:45:20 +0000 Subject: [PATCH] BOOST_LWM_WIN32_USE_CRITICAL_SECTION option. [SVN r12842] --- include/boost/detail/lwm_win32.hpp | 59 +++++++++++++++++++++++++++++- shared_ptr_mt_test.cpp | 9 ++++- 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/include/boost/detail/lwm_win32.hpp b/include/boost/detail/lwm_win32.hpp index 60388d5..8bcd469 100644 --- a/include/boost/detail/lwm_win32.hpp +++ b/include/boost/detail/lwm_win32.hpp @@ -16,12 +16,18 @@ // 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); @@ -67,13 +73,64 @@ public: // Note: adding a Sleep(0) here will make // the mutex more fair and will increase the overall - // performance of the application substantially in + // performance of some applications substantially in // high contention situations, but will penalize the // low contention / single thread case up to 5x } }; }; +#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 diff --git a/shared_ptr_mt_test.cpp b/shared_ptr_mt_test.cpp index af48918..2511716 100644 --- a/shared_ptr_mt_test.cpp +++ b/shared_ptr_mt_test.cpp @@ -19,6 +19,9 @@ #include #include +#define BOOST_INCLUDE_MAIN +#include + #include #include #include @@ -141,11 +144,11 @@ void test(boost::shared_ptr const & pi) int const m = 16; // threads -int main() +int test_main( int, char ** ) { std::puts(title); - boost::shared_ptr pi(new int); + boost::shared_ptr pi(new int(42)); pthread_t a[m]; @@ -158,4 +161,6 @@ int main() { pthread_join(a[i], 0); } + + return 0; }