diff options
| author | Remko Tronçon <git@el-tramo.be> | 2012-12-23 13:16:26 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2012-12-23 14:43:26 (GMT) | 
| commit | 491ddd570a752cf9bda85933bed0c6942e39b1f9 (patch) | |
| tree | 10c25c1be8cc08d0497df1dccd56a10fbb30beee /3rdParty/Boost/src/boost/thread/pthread/once.hpp | |
| parent | da7d7a0ca71b80281aa9ff2526290b61ccb0cc60 (diff) | |
| download | swift-contrib-491ddd570a752cf9bda85933bed0c6942e39b1f9.zip swift-contrib-491ddd570a752cf9bda85933bed0c6942e39b1f9.tar.bz2 | |
Update Boost to 1.52.0.
Change-Id: I1e56bea2600bf2ed9c5b3aba8c4f9d2a0f350e77
Diffstat (limited to '3rdParty/Boost/src/boost/thread/pthread/once.hpp')
| -rw-r--r-- | 3rdParty/Boost/src/boost/thread/pthread/once.hpp | 80 | 
1 files changed, 55 insertions, 25 deletions
| diff --git a/3rdParty/Boost/src/boost/thread/pthread/once.hpp b/3rdParty/Boost/src/boost/thread/pthread/once.hpp index 6321aa2..02c2732 100644 --- a/3rdParty/Boost/src/boost/thread/pthread/once.hpp +++ b/3rdParty/Boost/src/boost/thread/pthread/once.hpp @@ -3,53 +3,86 @@  //  once.hpp  // -//  (C) Copyright 2007-8 Anthony Williams  +//  (C) Copyright 2007-8 Anthony Williams +//  (C) Copyright 2011-2012 Vicente J. Botet Escriba  //  //  Distributed under the Boost Software License, Version 1.0. (See  //  accompanying file LICENSE_1_0.txt or copy at  //  http://www.boost.org/LICENSE_1_0.txt)  #include <boost/thread/detail/config.hpp> -#include <boost/config.hpp> -#include <pthread.h> -#include <boost/assert.hpp> -#include "pthread_mutex_scoped_lock.hpp"  #include <boost/thread/pthread/pthread_mutex_scoped_lock.hpp> -#include <boost/cstdint.hpp> +#include <boost/thread/detail/delete.hpp> +#include <boost/detail/no_exceptions_support.hpp> +#include <boost/assert.hpp>  #include <boost/config/abi_prefix.hpp> +#include <boost/cstdint.hpp> +#include <pthread.h> +#include <csignal> +  namespace boost  { +#define BOOST_ONCE_INITIAL_FLAG_VALUE 0 + +  namespace thread_detail +  { +//#ifdef SIG_ATOMIC_MAX +//    typedef sig_atomic_t  uintmax_atomic_t; +//    #define BOOST_THREAD_DETAIL_UINTMAX_ATOMIC_MAX_C SIG_ATOMIC_MAX +//#else +    typedef unsigned long  uintmax_atomic_t; +    #define BOOST_THREAD_DETAIL_UINTMAX_ATOMIC_C2(value) value##ul +    #define BOOST_THREAD_DETAIL_UINTMAX_ATOMIC_MAX_C BOOST_THREAD_DETAIL_UINTMAX_ATOMIC_C2(~0) +//#endif +  } + +#ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11 + +  struct once_flag +  { +      BOOST_THREAD_NO_COPYABLE(once_flag) +      BOOST_CONSTEXPR once_flag() BOOST_NOEXCEPT +        : epoch(BOOST_ONCE_INITIAL_FLAG_VALUE) +      {} +  private: +      volatile thread_detail::uintmax_atomic_t epoch; +      template<typename Function> +      friend +      void call_once(once_flag& flag,Function f); +  }; + +#else // BOOST_THREAD_PROVIDES_ONCE_CXX11 +      struct once_flag      { -        boost::uintmax_t epoch; +      volatile thread_detail::uintmax_atomic_t epoch;      }; +#define BOOST_ONCE_INIT {BOOST_ONCE_INITIAL_FLAG_VALUE} +#endif // BOOST_THREAD_PROVIDES_ONCE_CXX11 +      namespace detail      { -        BOOST_THREAD_DECL boost::uintmax_t& get_once_per_thread_epoch(); -        BOOST_THREAD_DECL extern boost::uintmax_t once_global_epoch; +        BOOST_THREAD_DECL thread_detail::uintmax_atomic_t& get_once_per_thread_epoch(); +        BOOST_THREAD_DECL extern thread_detail::uintmax_atomic_t once_global_epoch;          BOOST_THREAD_DECL extern pthread_mutex_t once_epoch_mutex;          BOOST_THREAD_DECL extern pthread_cond_t once_epoch_cv;      } -     -#define BOOST_ONCE_INITIAL_FLAG_VALUE 0 -#define BOOST_ONCE_INIT {BOOST_ONCE_INITIAL_FLAG_VALUE} -      // Based on Mike Burrows fast_pthread_once algorithm as described in      // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2444.html      template<typename Function>      void call_once(once_flag& flag,Function f)      { -        static boost::uintmax_t const uninitialized_flag=BOOST_ONCE_INITIAL_FLAG_VALUE; -        static boost::uintmax_t const being_initialized=uninitialized_flag+1; -        boost::uintmax_t const epoch=flag.epoch; -        boost::uintmax_t& this_thread_epoch=detail::get_once_per_thread_epoch(); -         +        static thread_detail::uintmax_atomic_t const uninitialized_flag=BOOST_ONCE_INITIAL_FLAG_VALUE; +        static thread_detail::uintmax_atomic_t const being_initialized=uninitialized_flag+1; +        thread_detail::uintmax_atomic_t const epoch=flag.epoch; +        thread_detail::uintmax_atomic_t& this_thread_epoch=detail::get_once_per_thread_epoch(); +          if(epoch<this_thread_epoch)          {              pthread::pthread_mutex_scoped_lock lk(&detail::once_epoch_mutex); @@ -59,21 +92,18 @@ namespace boost                  if(flag.epoch==uninitialized_flag)                  {                      flag.epoch=being_initialized; -#ifndef BOOST_NO_EXCEPTIONS -                    try +                    BOOST_TRY                      { -#endif                          pthread::pthread_mutex_scoped_unlock relocker(&detail::once_epoch_mutex);                          f(); -#ifndef BOOST_NO_EXCEPTIONS                      } -                    catch(...) +                    BOOST_CATCH (...)                      {                          flag.epoch=uninitialized_flag;                          BOOST_VERIFY(!pthread_cond_broadcast(&detail::once_epoch_cv)); -                        throw; +                        BOOST_RETHROW                      } -#endif +                    BOOST_CATCH_END                      flag.epoch=--detail::once_global_epoch;                      BOOST_VERIFY(!pthread_cond_broadcast(&detail::once_epoch_cv));                  } | 
 Swift
 Swift