Ticket #6342: 6342.patch
File 6342.patch, 10.2 KB (added by , 11 years ago) |
---|
-
boost/thread/pthread/once.hpp
21 21 namespace boost 22 22 { 23 23 24 # if BOOST_THREAD_VERSION==324 #define BOOST_ONCE_INITIAL_FLAG_VALUE 0 25 25 26 #ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11 27 26 28 struct once_flag 27 29 { 28 30 BOOST_CONSTEXPR once_flag() BOOST_NOEXCEPT 29 : epoch( 0)31 : epoch(BOOST_ONCE_INITIAL_FLAG_VALUE) 30 32 {} 31 33 #ifndef BOOST_NO_DELETED_FUNCTIONS 32 34 once_flag(const once_flag&) = delete; 33 35 once_flag& operator=(const once_flag&) = delete; 34 36 #else // BOOST_NO_DELETED_FUNCTIONS 35 37 private: 36 once_flag( constonce_flag&);37 once_flag& operator=( constonce_flag&);38 once_flag(once_flag&); 39 once_flag& operator=(once_flag&); 38 40 public: 39 41 #endif // BOOST_NO_DELETED_FUNCTIONS 40 42 private: 41 43 boost::uintmax_t epoch; 42 44 template<typename Function> 45 friend 46 void call_once(once_flag& flag,Function f); 43 47 }; 44 48 45 #else // BOOST_THREAD_ VERSION==349 #else // BOOST_THREAD_PROVIDES_ONCE_CXX11 46 50 47 51 struct once_flag 48 52 { 49 53 boost::uintmax_t epoch; 50 54 }; 51 55 52 #define BOOST_ONCE_INITIAL_FLAG_VALUE 053 56 #define BOOST_ONCE_INIT {BOOST_ONCE_INITIAL_FLAG_VALUE} 57 #endif // BOOST_THREAD_PROVIDES_ONCE_CXX11 54 58 55 #endif // BOOST_THREAD_VERSION==356 57 59 namespace detail 58 60 { 59 61 BOOST_THREAD_DECL boost::uintmax_t& get_once_per_thread_epoch(); -
boost/thread/detail/config.hpp
19 19 // This compiler doesn't support Boost.Move 20 20 #if BOOST_WORKAROUND(__SUNPRO_CC, < 0x5100) 21 21 #define BOOST_THREAD_DONT_USE_MOVE 22 #define BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS 22 23 #endif 23 24 24 25 // Default version is 1 … … 59 60 #endif 60 61 61 62 #if BOOST_THREAD_VERSION==1 63 #if ! defined BOOST_THREAD_DONT_PROVIDE_PROMISE_LAZY 62 64 #define BOOST_THREAD_PROMISE_LAZY 63 65 #endif 66 #if ! defined BOOST_THREAD_DONT_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0 67 #define BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V2_0_0 68 #endif 69 #endif 64 70 65 71 #if BOOST_THREAD_VERSION==2 72 #if ! defined BOOST_THREAD_DONT_PROVIDE_ONCE_CXX11 73 #define BOOST_THREAD_PROVIDES_ONCE_CXX11 74 #endif 75 #if ! defined BOOST_THREAD_DONT_PROVIDE_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE 66 76 #define BOOST_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE 77 #endif 78 #if ! defined BOOST_THREAD_DONT_PROVIDE_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE 67 79 #define BOOST_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE 80 #endif 81 #if ! defined BOOST_THREAD_DONT_PROVIDE_USES_FUTURE 68 82 #define BOOST_THREAD_USES_FUTURE 83 #endif 84 #if ! defined BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS 69 85 #define BOOST_THREAD_FUTURE_USES_ALLOCATORS 86 #endif 87 #if ! defined BOOST_THREAD_SHARED_MUTEX_DONT_PROVIDE_UPWARDS_CONVERSIONS 70 88 #define BOOST_THREAD_SHARED_MUTEX_PROVIDES_UPWARDS_CONVERSION 89 #endif 90 #if ! defined BOOST_THREAD_DONT_PROVIDE_EXPLICIT_LOCK_CONVERSION 71 91 #define BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION 92 #endif 93 #if ! defined BOOST_THREAD_DONT_PROVIDE_SHARED_MUTEX_GENERIC 72 94 #define BOOST_THREAD_SHARED_MUTEX_GENERIC 73 #if ! defined BOOST_THREAD_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0 95 #endif 96 #if ! defined BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V2_0_0 74 97 #define BOOST_THREAD_DONT_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0 75 98 #endif 76 99 #endif 77 100 78 // BOOST_THREAD_PROVIDE _DEPRECATED_FEATURES_SINCE_V2_0_0 defined by default up to Boost 1.52101 // BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V2_0_0 defined by default up to Boost 1.52 79 102 // BOOST_THREAD_DONT_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0 defined by default up to Boost 1.55 80 103 #if ! defined BOOST_THREAD_DONT_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0 81 #define BOOST_THREAD_PROVIDE _DEPRECATED_FEATURES_SINCE_V2_0_0104 #define BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V2_0_0 82 105 #endif 83 106 84 107 #if BOOST_WORKAROUND(__BORLANDC__, < 0x600) -
boost/thread/win32/once.hpp
3 3 4 4 // once.hpp 5 5 // 6 // (C) Copyright 2005-7 Anthony Williams 6 // (C) Copyright 2005-7 Anthony Williams 7 7 // (C) Copyright 2005 John Maddock 8 8 // 9 9 // Distributed under the Boost Software License, Version 1.0. (See … … 30 30 31 31 namespace boost 32 32 { 33 #ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11 34 35 struct once_flag 36 { 37 BOOST_CONSTEXPR once_flag() BOOST_NOEXCEPT 38 : status(0), count(0) 39 {} 40 #ifndef BOOST_NO_DELETED_FUNCTIONS 41 once_flag(const once_flag&) = delete; 42 once_flag& operator=(const once_flag&) = delete; 43 #else // BOOST_NO_DELETED_FUNCTIONS 44 private: 45 once_flag(once_flag&); 46 once_flag& operator=(once_flag&); 47 public: 48 #endif // BOOST_NO_DELETED_FUNCTIONS 49 private: 50 long status; 51 long count; 52 template<typename Function> 53 friend 54 void call_once(once_flag& flag,Function f); 55 }; 56 57 #define BOOST_ONCE_INIT once_flag() 58 #else // BOOST_THREAD_PROVIDES_ONCE_CXX11 59 33 60 struct once_flag 34 61 { 35 62 long status; … … 37 64 }; 38 65 39 66 #define BOOST_ONCE_INIT {0,0} 67 #endif // BOOST_THREAD_PROVIDES_ONCE_CXX11 40 68 41 69 namespace detail 42 70 { … … 71 99 #else 72 100 static const once_char_type fixed_mutex_name[]="Local\\{C15730E2-145C-4c5e-B005-3BC753F42475}-once-flag"; 73 101 #endif 74 BOOST_STATIC_ASSERT(sizeof(fixed_mutex_name) == 102 BOOST_STATIC_ASSERT(sizeof(fixed_mutex_name) == 75 103 (sizeof(once_char_type)*(once_mutex_name_fixed_length+1))); 76 104 77 105 std::memcpy(mutex_name,fixed_mutex_name,sizeof(fixed_mutex_name)); 78 detail::int_to_string(reinterpret_cast<std::ptrdiff_t>(flag_address), 106 detail::int_to_string(reinterpret_cast<std::ptrdiff_t>(flag_address), 79 107 mutex_name + once_mutex_name_fixed_length); 80 detail::int_to_string(win32::GetCurrentProcessId(), 108 detail::int_to_string(win32::GetCurrentProcessId(), 81 109 mutex_name + once_mutex_name_fixed_length + sizeof(void*)*2); 82 110 } 83 111 84 112 inline void* open_once_event(once_char_type* mutex_name,void* flag_address) 85 113 { 86 114 if(!*mutex_name) 87 115 { 88 116 name_once_mutex(mutex_name,flag_address); 89 117 } 90 91 #ifdef BOOST_NO_ANSI_APIS 118 119 #ifdef BOOST_NO_ANSI_APIS 92 120 return ::boost::detail::win32::OpenEventW( 93 121 #else 94 122 return ::boost::detail::win32::OpenEventA( 95 123 #endif 96 ::boost::detail::win32::synchronize | 124 ::boost::detail::win32::synchronize | 97 125 ::boost::detail::win32::event_modify_state, 98 126 false, 99 127 mutex_name); … … 105 133 { 106 134 name_once_mutex(mutex_name,flag_address); 107 135 } 108 #ifdef BOOST_NO_ANSI_APIS 136 #ifdef BOOST_NO_ANSI_APIS 109 137 return ::boost::detail::win32::CreateEventW( 110 138 #else 111 139 return ::boost::detail::win32::CreateEventA( … … 115 143 mutex_name); 116 144 } 117 145 } 118 119 146 147 120 148 template<typename Function> 121 149 void call_once(once_flag& flag,Function f) 122 150 { … … 153 181 counted=true; 154 182 } 155 183 BOOST_INTERLOCKED_EXCHANGE(&flag.status,function_complete_flag_value); 156 if(!event_handle && 184 if(!event_handle && 157 185 (::boost::detail::interlocked_read_acquire(&flag.count)>1)) 158 186 { 159 187 event_handle=detail::create_once_event(mutex_name,&flag); -
boost/thread/once.hpp
22 22 23 23 namespace boost 24 24 { 25 // template<class Callable, class ...Args> void call_once(once_flag& flag, Callable func, Args&&... args); 25 // template<class Callable, class ...Args> void 26 // call_once(once_flag& flag, Callable&& func, Args&&... args); 26 27 inline void call_once(void (*func)(),once_flag& flag) 27 28 { 28 29 call_once(flag,func); -
libs/thread/example/once.cpp
1 1 // Copyright (C) 2001-2003 2 2 // William E. Kempf 3 3 // 4 // Distributed under the Boost Software License, Version 1.0. (See accompanying 4 // Distributed under the Boost Software License, Version 1.0. (See accompanying 5 5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 6 7 #define BOOST_THREAD_PROVIDES_ONCE_CXX11 8 7 9 #include <boost/thread/thread.hpp> 8 10 #include <boost/thread/once.hpp> 9 11 #include <cassert> 10 12 11 13 int value=0; 14 #ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11 15 boost::once_flag once; 16 #else 12 17 boost::once_flag once = BOOST_ONCE_INIT; 18 boost::once_flag once2 = once; 19 #endif 13 20 14 21 void init() 15 22 { -
libs/thread/src/win32/thread.cpp
26 26 { 27 27 namespace 28 28 { 29 #ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11 30 boost::once_flag current_thread_tls_init_flag; 31 #else 29 32 boost::once_flag current_thread_tls_init_flag=BOOST_ONCE_INIT; 33 #endif 30 34 #if defined(UNDER_CE) 31 35 // Windows CE does not define the TLS_OUT_OF_INDEXES constant. 32 36 DWORD tls_out_of_index=0xFFFFFFFF; -
libs/thread/src/pthread/thread.cpp
46 46 47 47 namespace 48 48 { 49 #ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11 50 boost::once_flag current_thread_tls_init_flag; 51 #else 49 52 boost::once_flag current_thread_tls_init_flag=BOOST_ONCE_INIT; 53 #endif 50 54 pthread_key_t current_thread_tls_key; 51 55 52 56 extern "C"