diff options
Diffstat (limited to '3rdParty/Boost/src/boost/thread/win32/once.hpp')
| -rw-r--r-- | 3rdParty/Boost/src/boost/thread/win32/once.hpp | 55 | 
1 files changed, 40 insertions, 15 deletions
| diff --git a/3rdParty/Boost/src/boost/thread/win32/once.hpp b/3rdParty/Boost/src/boost/thread/win32/once.hpp index e1b1843..3066b50 100644 --- a/3rdParty/Boost/src/boost/thread/win32/once.hpp +++ b/3rdParty/Boost/src/boost/thread/win32/once.hpp @@ -3,8 +3,9 @@  //  once.hpp  // -//  (C) Copyright 2005-7 Anthony Williams  +//  (C) Copyright 2005-7 Anthony Williams  //  (C) Copyright 2005 John Maddock +//  (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 @@ -30,6 +31,25 @@ namespace std  namespace boost  { +#ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11 + +  struct once_flag +  { +      BOOST_THREAD_NO_COPYABLE(once_flag) +      BOOST_CONSTEXPR once_flag() BOOST_NOEXCEPT +        : status(0), count(0) +      {} +  private: +      long status; +      long count; +      template<typename Function> +      friend +      void call_once(once_flag& flag,Function f); +  }; + +#define BOOST_ONCE_INIT once_flag() +#else // BOOST_THREAD_PROVIDES_ONCE_CXX11 +      struct once_flag      {          long status; @@ -37,6 +57,7 @@ namespace boost      };  #define BOOST_ONCE_INIT {0,0} +#endif  // BOOST_THREAD_PROVIDES_ONCE_CXX11      namespace detail      { @@ -71,29 +92,29 @@ namespace boost  #else              static const once_char_type fixed_mutex_name[]="Local\\{C15730E2-145C-4c5e-B005-3BC753F42475}-once-flag";  #endif -            BOOST_STATIC_ASSERT(sizeof(fixed_mutex_name) ==  +            BOOST_STATIC_ASSERT(sizeof(fixed_mutex_name) ==                                  (sizeof(once_char_type)*(once_mutex_name_fixed_length+1))); -             +              std::memcpy(mutex_name,fixed_mutex_name,sizeof(fixed_mutex_name)); -            detail::int_to_string(reinterpret_cast<std::ptrdiff_t>(flag_address),  +            detail::int_to_string(reinterpret_cast<std::ptrdiff_t>(flag_address),                                    mutex_name + once_mutex_name_fixed_length); -            detail::int_to_string(win32::GetCurrentProcessId(),  +            detail::int_to_string(win32::GetCurrentProcessId(),                                    mutex_name + once_mutex_name_fixed_length + sizeof(void*)*2);          } -                         +          inline void* open_once_event(once_char_type* mutex_name,void* flag_address)          {              if(!*mutex_name)              {                  name_once_mutex(mutex_name,flag_address);              } -             -#ifdef BOOST_NO_ANSI_APIS                         + +#ifdef BOOST_NO_ANSI_APIS              return ::boost::detail::win32::OpenEventW(  #else              return ::boost::detail::win32::OpenEventA(  #endif -                ::boost::detail::win32::synchronize |  +                ::boost::detail::win32::synchronize |                  ::boost::detail::win32::event_modify_state,                  false,                  mutex_name); @@ -105,7 +126,7 @@ namespace boost              {                  name_once_mutex(mutex_name,flag_address);              } -#ifdef BOOST_NO_ANSI_APIS                         +#ifdef BOOST_NO_ANSI_APIS              return ::boost::detail::win32::CreateEventW(  #else              return ::boost::detail::win32::CreateEventA( @@ -115,7 +136,7 @@ namespace boost                  mutex_name);          }      } -     +      template<typename Function>      void call_once(once_flag& flag,Function f) @@ -136,7 +157,9 @@ namespace boost              status=BOOST_INTERLOCKED_COMPARE_EXCHANGE(&flag.status,running_value,0);              if(!status)              { -                try +#ifndef BOOST_NO_EXCEPTIONS +                try // BOOST_NO_EXCEPTIONS protected +#endif                  {                      if(!event_handle)                      { @@ -153,7 +176,7 @@ namespace boost                          counted=true;                      }                      BOOST_INTERLOCKED_EXCHANGE(&flag.status,function_complete_flag_value); -                    if(!event_handle &&  +                    if(!event_handle &&                         (::boost::detail::interlocked_read_acquire(&flag.count)>1))                      {                          event_handle=detail::create_once_event(mutex_name,&flag); @@ -164,7 +187,8 @@ namespace boost                      }                      break;                  } -                catch(...) +#ifndef BOOST_NO_EXCEPTIONS +                catch(...) // BOOST_NO_EXCEPTIONS protected                  {                      BOOST_INTERLOCKED_EXCHANGE(&flag.status,0);                      if(!event_handle) @@ -175,8 +199,9 @@ namespace boost                      {                          ::boost::detail::win32::SetEvent(event_handle);                      } -                    throw; +                    throw; // BOOST_NO_EXCEPTIONS protected                  } +#endif              }              if(!counted) | 
 Swift
 Swift