Ticket #6342: 6342.patch

File 6342.patch, 10.2 KB (added by viboes, 11 years ago)

committed diffs in trunk [77767]

  • boost/thread/pthread/once.hpp

     
    2121namespace boost
    2222{
    2323
    24 #if BOOST_THREAD_VERSION==3
     24#define BOOST_ONCE_INITIAL_FLAG_VALUE 0
    2525
     26#ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11
     27
    2628  struct once_flag
    2729  {
    2830      BOOST_CONSTEXPR once_flag() BOOST_NOEXCEPT
    29         : epoch(0)
     31        : epoch(BOOST_ONCE_INITIAL_FLAG_VALUE)
    3032      {}
    3133#ifndef BOOST_NO_DELETED_FUNCTIONS
    3234      once_flag(const once_flag&) = delete;
    3335      once_flag& operator=(const once_flag&) = delete;
    3436#else // BOOST_NO_DELETED_FUNCTIONS
    3537  private:
    36       once_flag(const once_flag&);
    37       once_flag& operator=(const once_flag&);
     38      once_flag(once_flag&);
     39      once_flag& operator=(once_flag&);
    3840  public:
    3941#endif // BOOST_NO_DELETED_FUNCTIONS
    4042  private:
    4143      boost::uintmax_t epoch;
    42 
     44      template<typename Function>
     45      friend
     46      void call_once(once_flag& flag,Function f);
    4347  };
    4448
    45 #else // BOOST_THREAD_VERSION==3
     49#else // BOOST_THREAD_PROVIDES_ONCE_CXX11
    4650
    4751    struct once_flag
    4852    {
    4953        boost::uintmax_t epoch;
    5054    };
    5155
    52 #define BOOST_ONCE_INITIAL_FLAG_VALUE 0
    5356#define BOOST_ONCE_INIT {BOOST_ONCE_INITIAL_FLAG_VALUE}
     57#endif // BOOST_THREAD_PROVIDES_ONCE_CXX11
    5458
    55 #endif // BOOST_THREAD_VERSION==3
    56 
    5759    namespace detail
    5860    {
    5961        BOOST_THREAD_DECL boost::uintmax_t& get_once_per_thread_epoch();
  • boost/thread/detail/config.hpp

     
    1919// This compiler doesn't support Boost.Move
    2020#if BOOST_WORKAROUND(__SUNPRO_CC, < 0x5100)
    2121#define BOOST_THREAD_DONT_USE_MOVE
     22#define BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS
    2223#endif
    2324
    2425// Default version is 1
     
    5960#endif
    6061
    6162#if BOOST_THREAD_VERSION==1
     63#if ! defined BOOST_THREAD_DONT_PROVIDE_PROMISE_LAZY
    6264#define BOOST_THREAD_PROMISE_LAZY
    6365#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
    6470
    6571#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
    6676#define BOOST_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE
     77#endif
     78#if ! defined BOOST_THREAD_DONT_PROVIDE_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE
    6779#define BOOST_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE
     80#endif
     81#if ! defined BOOST_THREAD_DONT_PROVIDE_USES_FUTURE
    6882#define BOOST_THREAD_USES_FUTURE
     83#endif
     84#if ! defined BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS
    6985#define BOOST_THREAD_FUTURE_USES_ALLOCATORS
     86#endif
     87#if ! defined BOOST_THREAD_SHARED_MUTEX_DONT_PROVIDE_UPWARDS_CONVERSIONS
    7088#define BOOST_THREAD_SHARED_MUTEX_PROVIDES_UPWARDS_CONVERSION
     89#endif
     90#if ! defined BOOST_THREAD_DONT_PROVIDE_EXPLICIT_LOCK_CONVERSION
    7191#define BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION
     92#endif
     93#if ! defined BOOST_THREAD_DONT_PROVIDE_SHARED_MUTEX_GENERIC
    7294#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
    7497#define BOOST_THREAD_DONT_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0
    7598#endif
    7699#endif
    77100
    78 // BOOST_THREAD_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0 defined by default up to Boost 1.52
     101// BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V2_0_0 defined by default up to Boost 1.52
    79102// BOOST_THREAD_DONT_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0 defined by default up to Boost 1.55
    80103#if ! defined BOOST_THREAD_DONT_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0
    81 #define BOOST_THREAD_PROVIDE_DEPRECATED_FEATURES_SINCE_V2_0_0
     104#define BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V2_0_0
    82105#endif
    83106
    84107#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
  • boost/thread/win32/once.hpp

     
    33
    44//  once.hpp
    55//
    6 //  (C) Copyright 2005-7 Anthony Williams 
     6//  (C) Copyright 2005-7 Anthony Williams
    77//  (C) Copyright 2005 John Maddock
    88//
    99//  Distributed under the Boost Software License, Version 1.0. (See
     
    3030
    3131namespace boost
    3232{
     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
    3360    struct once_flag
    3461    {
    3562        long status;
     
    3764    };
    3865
    3966#define BOOST_ONCE_INIT {0,0}
     67#endif  // BOOST_THREAD_PROVIDES_ONCE_CXX11
    4068
    4169    namespace detail
    4270    {
     
    7199#else
    72100            static const once_char_type fixed_mutex_name[]="Local\\{C15730E2-145C-4c5e-B005-3BC753F42475}-once-flag";
    73101#endif
    74             BOOST_STATIC_ASSERT(sizeof(fixed_mutex_name) == 
     102            BOOST_STATIC_ASSERT(sizeof(fixed_mutex_name) ==
    75103                                (sizeof(once_char_type)*(once_mutex_name_fixed_length+1)));
    76            
     104
    77105            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),
    79107                                  mutex_name + once_mutex_name_fixed_length);
    80             detail::int_to_string(win32::GetCurrentProcessId(), 
     108            detail::int_to_string(win32::GetCurrentProcessId(),
    81109                                  mutex_name + once_mutex_name_fixed_length + sizeof(void*)*2);
    82110        }
    83                        
     111
    84112        inline void* open_once_event(once_char_type* mutex_name,void* flag_address)
    85113        {
    86114            if(!*mutex_name)
    87115            {
    88116                name_once_mutex(mutex_name,flag_address);
    89117            }
    90            
    91 #ifdef BOOST_NO_ANSI_APIS                       
     118
     119#ifdef BOOST_NO_ANSI_APIS
    92120            return ::boost::detail::win32::OpenEventW(
    93121#else
    94122            return ::boost::detail::win32::OpenEventA(
    95123#endif
    96                 ::boost::detail::win32::synchronize | 
     124                ::boost::detail::win32::synchronize |
    97125                ::boost::detail::win32::event_modify_state,
    98126                false,
    99127                mutex_name);
     
    105133            {
    106134                name_once_mutex(mutex_name,flag_address);
    107135            }
    108 #ifdef BOOST_NO_ANSI_APIS                       
     136#ifdef BOOST_NO_ANSI_APIS
    109137            return ::boost::detail::win32::CreateEventW(
    110138#else
    111139            return ::boost::detail::win32::CreateEventA(
     
    115143                mutex_name);
    116144        }
    117145    }
    118    
    119146
     147
    120148    template<typename Function>
    121149    void call_once(once_flag& flag,Function f)
    122150    {
     
    153181                        counted=true;
    154182                    }
    155183                    BOOST_INTERLOCKED_EXCHANGE(&flag.status,function_complete_flag_value);
    156                     if(!event_handle && 
     184                    if(!event_handle &&
    157185                       (::boost::detail::interlocked_read_acquire(&flag.count)>1))
    158186                    {
    159187                        event_handle=detail::create_once_event(mutex_name,&flag);
  • boost/thread/once.hpp

     
    2222
    2323namespace boost
    2424{
    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);
    2627    inline void call_once(void (*func)(),once_flag& flag)
    2728    {
    2829        call_once(flag,func);
  • libs/thread/example/once.cpp

     
    11// Copyright (C) 2001-2003
    22// William E. Kempf
    33//
    4 //  Distributed under the Boost Software License, Version 1.0. (See accompanying 
     4//  Distributed under the Boost Software License, Version 1.0. (See accompanying
    55//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
    66
     7#define BOOST_THREAD_PROVIDES_ONCE_CXX11
     8
    79#include <boost/thread/thread.hpp>
    810#include <boost/thread/once.hpp>
    911#include <cassert>
    1012
    1113int value=0;
     14#ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11
     15boost::once_flag once;
     16#else
    1217boost::once_flag once = BOOST_ONCE_INIT;
     18boost::once_flag once2 = once;
     19#endif
    1320
    1421void init()
    1522{
  • libs/thread/src/win32/thread.cpp

     
    2626{
    2727    namespace
    2828    {
     29#ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11
     30        boost::once_flag current_thread_tls_init_flag;
     31#else
    2932        boost::once_flag current_thread_tls_init_flag=BOOST_ONCE_INIT;
     33#endif
    3034        #if defined(UNDER_CE)
    3135        // Windows CE does not define the TLS_OUT_OF_INDEXES constant.
    3236        DWORD tls_out_of_index=0xFFFFFFFF;
  • libs/thread/src/pthread/thread.cpp

     
    4646
    4747        namespace
    4848        {
     49#ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11
     50          boost::once_flag current_thread_tls_init_flag;
     51#else
    4952            boost::once_flag current_thread_tls_init_flag=BOOST_ONCE_INIT;
     53#endif
    5054            pthread_key_t current_thread_tls_key;
    5155
    5256            extern "C"