updated boost on windows
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/checked_delete.hpp>
|
||||
#include <boost/core/no_exceptions_support.hpp>
|
||||
#include <boost/signals2/postconstructible.hpp>
|
||||
#include <boost/signals2/predestructible.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
@@ -40,15 +41,16 @@ namespace boost
|
||||
}
|
||||
inline void do_predestruct(const predestructible *ptr)
|
||||
{
|
||||
try
|
||||
BOOST_TRY
|
||||
{
|
||||
predestructible *nonconst_ptr = const_cast<predestructible*>(ptr);
|
||||
nonconst_ptr->predestruct();
|
||||
}
|
||||
catch(...)
|
||||
BOOST_CATCH(...)
|
||||
{
|
||||
BOOST_ASSERT(false);
|
||||
}
|
||||
BOOST_CATCH_END
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -248,6 +248,14 @@ namespace detail
|
||||
auto_buffer_destroy( where, boost::has_trivial_destructor<T>() );
|
||||
}
|
||||
|
||||
void auto_buffer_destroy()
|
||||
{
|
||||
BOOST_ASSERT( is_valid() );
|
||||
if( buffer_ ) // do we need this check? Yes, but only
|
||||
// for N = 0u + local instances in one_sided_swap()
|
||||
auto_buffer_destroy( boost::has_trivial_destructor<T>() );
|
||||
}
|
||||
|
||||
void destroy_back_n( size_type n, const boost::false_type& )
|
||||
{
|
||||
BOOST_ASSERT( n > 0 );
|
||||
@@ -301,7 +309,7 @@ namespace detail
|
||||
{
|
||||
pointer new_buffer = move_to_new_buffer( new_capacity,
|
||||
boost::has_nothrow_copy<T>() );
|
||||
(*this).~auto_buffer();
|
||||
auto_buffer_destroy();
|
||||
buffer_ = new_buffer;
|
||||
members_.capacity_ = new_capacity;
|
||||
BOOST_ASSERT( size_ <= members_.capacity_ );
|
||||
@@ -355,7 +363,7 @@ namespace detail
|
||||
void one_sided_swap( auto_buffer& temp ) // nothrow
|
||||
{
|
||||
BOOST_ASSERT( !temp.is_on_stack() );
|
||||
this->~auto_buffer();
|
||||
auto_buffer_destroy();
|
||||
// @remark: must be nothrow
|
||||
get_allocator() = temp.get_allocator();
|
||||
members_.capacity_ = temp.members_.capacity_;
|
||||
@@ -506,7 +514,7 @@ namespace detail
|
||||
{
|
||||
// @remark: we release memory as early as possible
|
||||
// since we only give the basic guarantee
|
||||
(*this).~auto_buffer();
|
||||
auto_buffer_destroy();
|
||||
buffer_ = 0;
|
||||
pointer new_buffer = allocate( r.size() );
|
||||
boost::multi_index::detail::scope_guard guard =
|
||||
@@ -597,10 +605,7 @@ namespace detail
|
||||
|
||||
~auto_buffer()
|
||||
{
|
||||
BOOST_ASSERT( is_valid() );
|
||||
if( buffer_ ) // do we need this check? Yes, but only
|
||||
// for N = 0u + local instances in one_sided_swap()
|
||||
auto_buffer_destroy( boost::has_trivial_destructor<T>() );
|
||||
auto_buffer_destroy();
|
||||
}
|
||||
|
||||
public:
|
||||
@@ -1033,7 +1038,7 @@ namespace detail
|
||||
pointer new_buffer = static_cast<T*>(other->members_.address());
|
||||
copy_impl( one_on_stack->begin(), one_on_stack->end(),
|
||||
new_buffer ); // strong
|
||||
one_on_stack->~auto_buffer(); // nothrow
|
||||
one_on_stack->auto_buffer_destroy(); // nothrow
|
||||
boost::swap( get_allocator(), r.get_allocator() ); // assume nothrow
|
||||
boost::swap( members_.capacity_, r.members_.capacity_ );
|
||||
boost::swap( size_, r.size_ );
|
||||
|
||||
@@ -15,17 +15,22 @@
|
||||
|
||||
// MS compatible compilers support #pragma once
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
||||
# pragma once
|
||||
#endif
|
||||
|
||||
#include <boost/predef.h>
|
||||
#include <boost/assert.hpp>
|
||||
|
||||
#ifdef BOOST_USE_WINDOWS_H
|
||||
# include <windows.h>
|
||||
#endif
|
||||
|
||||
#include <boost/predef/platform.h>
|
||||
#include <windows.h>
|
||||
|
||||
#else
|
||||
|
||||
struct _RTL_CRITICAL_SECTION;
|
||||
|
||||
#endif
|
||||
|
||||
namespace boost
|
||||
{
|
||||
@@ -33,6 +38,9 @@ namespace boost
|
||||
namespace signals2
|
||||
{
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
||||
#ifndef BOOST_USE_WINDOWS_H
|
||||
|
||||
struct critical_section
|
||||
@@ -50,26 +58,42 @@ struct critical_section
|
||||
};
|
||||
|
||||
#if BOOST_PLAT_WINDOWS_RUNTIME
|
||||
extern "C" __declspec(dllimport) void __stdcall InitializeCriticalSectionEx(critical_section *, unsigned long, unsigned long);
|
||||
extern "C" __declspec(dllimport) void __stdcall InitializeCriticalSectionEx(::_RTL_CRITICAL_SECTION *, unsigned long, unsigned long);
|
||||
#else
|
||||
extern "C" __declspec(dllimport) void __stdcall InitializeCriticalSection(critical_section *);
|
||||
extern "C" __declspec(dllimport) void __stdcall InitializeCriticalSection(::_RTL_CRITICAL_SECTION *);
|
||||
#endif
|
||||
extern "C" __declspec(dllimport) void __stdcall EnterCriticalSection(critical_section *);
|
||||
extern "C" __declspec(dllimport) int __stdcall TryEnterCriticalSection(critical_section *);
|
||||
extern "C" __declspec(dllimport) void __stdcall LeaveCriticalSection(critical_section *);
|
||||
extern "C" __declspec(dllimport) void __stdcall DeleteCriticalSection(critical_section *);
|
||||
extern "C" __declspec(dllimport) void __stdcall EnterCriticalSection(::_RTL_CRITICAL_SECTION *);
|
||||
extern "C" __declspec(dllimport) int __stdcall TryEnterCriticalSection(::_RTL_CRITICAL_SECTION *);
|
||||
extern "C" __declspec(dllimport) void __stdcall LeaveCriticalSection(::_RTL_CRITICAL_SECTION *);
|
||||
extern "C" __declspec(dllimport) void __stdcall DeleteCriticalSection(::_RTL_CRITICAL_SECTION *);
|
||||
|
||||
#else
|
||||
typedef ::_RTL_CRITICAL_SECTION rtl_critical_section;
|
||||
|
||||
#else // #ifndef BOOST_USE_WINDOWS_H
|
||||
|
||||
typedef ::CRITICAL_SECTION critical_section;
|
||||
|
||||
#if BOOST_PLAT_WINDOWS_RUNTIME
|
||||
using ::InitializeCriticalSectionEx;
|
||||
#else
|
||||
using ::InitializeCriticalSection;
|
||||
#endif
|
||||
using ::EnterCriticalSection;
|
||||
using ::TryEnterCriticalSection;
|
||||
using ::LeaveCriticalSection;
|
||||
using ::DeleteCriticalSection;
|
||||
|
||||
typedef ::CRITICAL_SECTION rtl_critical_section;
|
||||
|
||||
#endif // #ifndef BOOST_USE_WINDOWS_H
|
||||
|
||||
} // namespace detail
|
||||
|
||||
class mutex
|
||||
{
|
||||
private:
|
||||
|
||||
critical_section cs_;
|
||||
boost::signals2::detail::critical_section cs_;
|
||||
|
||||
mutex(mutex const &);
|
||||
mutex & operator=(mutex const &);
|
||||
@@ -79,26 +103,26 @@ public:
|
||||
mutex()
|
||||
{
|
||||
#if BOOST_PLAT_WINDOWS_RUNTIME
|
||||
InitializeCriticalSectionEx(&cs_, 4000, 0);
|
||||
boost::signals2::detail::InitializeCriticalSectionEx(reinterpret_cast< boost::signals2::detail::rtl_critical_section* >(&cs_), 4000, 0);
|
||||
#else
|
||||
InitializeCriticalSection(&cs_);
|
||||
boost::signals2::detail::InitializeCriticalSection(reinterpret_cast< boost::signals2::detail::rtl_critical_section* >(&cs_));
|
||||
#endif
|
||||
}
|
||||
|
||||
~mutex()
|
||||
{
|
||||
DeleteCriticalSection(&cs_);
|
||||
boost::signals2::detail::DeleteCriticalSection(reinterpret_cast< boost::signals2::detail::rtl_critical_section* >(&cs_));
|
||||
}
|
||||
|
||||
void lock()
|
||||
{
|
||||
EnterCriticalSection(&cs_);
|
||||
boost::signals2::detail::EnterCriticalSection(reinterpret_cast< boost::signals2::detail::rtl_critical_section* >(&cs_));
|
||||
}
|
||||
// TryEnterCriticalSection only exists on Windows NT 4.0 and later
|
||||
#if (defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0400))
|
||||
bool try_lock()
|
||||
{
|
||||
return TryEnterCriticalSection(&cs_) != 0;
|
||||
return boost::signals2::detail::TryEnterCriticalSection(reinterpret_cast< boost::signals2::detail::rtl_critical_section* >(&cs_)) != 0;
|
||||
}
|
||||
#else
|
||||
bool try_lock()
|
||||
@@ -109,7 +133,7 @@ public:
|
||||
#endif
|
||||
void unlock()
|
||||
{
|
||||
LeaveCriticalSection(&cs_);
|
||||
boost::signals2::detail::LeaveCriticalSection(reinterpret_cast< boost::signals2::detail::rtl_critical_section* >(&cs_));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -78,12 +78,12 @@ namespace boost {
|
||||
: public boost::iterator_facade<slot_call_iterator_t<Function, Iterator, ConnectionBody>,
|
||||
typename Function::result_type,
|
||||
boost::single_pass_traversal_tag,
|
||||
typename boost::add_const<typename boost::add_reference<typename Function::result_type>::type>::type >
|
||||
typename boost::add_reference<typename boost::add_const<typename Function::result_type>::type>::type >
|
||||
{
|
||||
typedef boost::iterator_facade<slot_call_iterator_t<Function, Iterator, ConnectionBody>,
|
||||
typename Function::result_type,
|
||||
boost::single_pass_traversal_tag,
|
||||
typename boost::add_const<typename boost::add_reference<typename Function::result_type>::type>::type >
|
||||
typename boost::add_reference<typename boost::add_const<typename Function::result_type>::type>::type >
|
||||
inherited;
|
||||
|
||||
typedef typename Function::result_type result_type;
|
||||
|
||||
@@ -52,7 +52,7 @@ namespace boost {
|
||||
++first;
|
||||
}
|
||||
if(value) return value.get();
|
||||
throw no_slots_error();
|
||||
boost::throw_exception(no_slots_error());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <boost/signals2/detail/foreign_ptr.hpp>
|
||||
#include <boost/signals2/expired_slot.hpp>
|
||||
#include <boost/signals2/signal_base.hpp>
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <boost/variant/apply_visitor.hpp>
|
||||
#include <boost/variant/variant.hpp>
|
||||
#include <vector>
|
||||
@@ -67,7 +68,6 @@ namespace boost
|
||||
typedef std::vector<detail::void_shared_ptr_variant> locked_container_type;
|
||||
|
||||
const tracked_container_type& tracked_objects() const {return _tracked_objects;}
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
locked_container_type lock() const
|
||||
{
|
||||
locked_container_type locked_objects;
|
||||
@@ -77,12 +77,11 @@ namespace boost
|
||||
locked_objects.push_back(apply_visitor(detail::lock_weak_ptr_visitor(), *it));
|
||||
if(apply_visitor(detail::expired_weak_ptr_visitor(), *it))
|
||||
{
|
||||
throw expired_slot();
|
||||
boost::throw_exception(expired_slot());
|
||||
}
|
||||
}
|
||||
return locked_objects;
|
||||
}
|
||||
#endif
|
||||
bool expired() const
|
||||
{
|
||||
tracked_container_type::const_iterator it;
|
||||
|
||||
Reference in New Issue
Block a user