diff options
| author | Remko Tronçon <git@el-tramo.be> | 2009-06-01 08:48:42 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2009-06-01 09:24:28 (GMT) | 
| commit | 2812bddd81f8a1b804c7460f4e14cd0aa393d129 (patch) | |
| tree | d46294f35150c4f0f43deaf2d31fceaf945ae715 /3rdParty/Boost/boost/thread/pthread | |
| download | swift-2812bddd81f8a1b804c7460f4e14cd0aa393d129.zip swift-2812bddd81f8a1b804c7460f4e14cd0aa393d129.tar.bz2 | |
Import.
Diffstat (limited to '3rdParty/Boost/boost/thread/pthread')
| -rw-r--r-- | 3rdParty/Boost/boost/thread/pthread/condition_variable.hpp | 176 | ||||
| -rw-r--r-- | 3rdParty/Boost/boost/thread/pthread/condition_variable_fwd.hpp | 97 | ||||
| -rw-r--r-- | 3rdParty/Boost/boost/thread/pthread/mutex.hpp | 210 | ||||
| -rw-r--r-- | 3rdParty/Boost/boost/thread/pthread/once.hpp | 90 | ||||
| -rw-r--r-- | 3rdParty/Boost/boost/thread/pthread/pthread_mutex_scoped_lock.hpp | 54 | ||||
| -rw-r--r-- | 3rdParty/Boost/boost/thread/pthread/recursive_mutex.hpp | 266 | ||||
| -rw-r--r-- | 3rdParty/Boost/boost/thread/pthread/shared_mutex.hpp | 303 | ||||
| -rw-r--r-- | 3rdParty/Boost/boost/thread/pthread/thread_data.hpp | 118 | ||||
| -rw-r--r-- | 3rdParty/Boost/boost/thread/pthread/thread_heap_alloc.hpp | 242 | ||||
| -rw-r--r-- | 3rdParty/Boost/boost/thread/pthread/timespec.hpp | 36 | 
10 files changed, 1592 insertions, 0 deletions
| diff --git a/3rdParty/Boost/boost/thread/pthread/condition_variable.hpp b/3rdParty/Boost/boost/thread/pthread/condition_variable.hpp new file mode 100644 index 0000000..8ec6ae7 --- /dev/null +++ b/3rdParty/Boost/boost/thread/pthread/condition_variable.hpp @@ -0,0 +1,176 @@ +#ifndef BOOST_THREAD_CONDITION_VARIABLE_PTHREAD_HPP +#define BOOST_THREAD_CONDITION_VARIABLE_PTHREAD_HPP +// 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) +// (C) Copyright 2007-8 Anthony Williams + +#include "timespec.hpp" +#include "pthread_mutex_scoped_lock.hpp" +#include "thread_data.hpp" +#include "condition_variable_fwd.hpp" + +#include <boost/config/abi_prefix.hpp> + +namespace boost +{ +    inline void condition_variable::wait(unique_lock<mutex>& m) +    { +        detail::interruption_checker check_for_interruption(&cond); +        BOOST_VERIFY(!pthread_cond_wait(&cond,m.mutex()->native_handle())); +    } + +    inline bool condition_variable::timed_wait(unique_lock<mutex>& m,boost::system_time const& wait_until) +    { +        detail::interruption_checker check_for_interruption(&cond); +        struct timespec const timeout=detail::get_timespec(wait_until); +        int const cond_res=pthread_cond_timedwait(&cond,m.mutex()->native_handle(),&timeout); +        if(cond_res==ETIMEDOUT) +        { +            return false; +        } +        BOOST_ASSERT(!cond_res); +        return true; +    } + +    inline void condition_variable::notify_one() +    { +        BOOST_VERIFY(!pthread_cond_signal(&cond)); +    } +         +    inline void condition_variable::notify_all() +    { +        BOOST_VERIFY(!pthread_cond_broadcast(&cond)); +    } +     +    class condition_variable_any +    { +        pthread_mutex_t internal_mutex; +        pthread_cond_t cond; + +        condition_variable_any(condition_variable&); +        condition_variable_any& operator=(condition_variable&); + +    public: +        condition_variable_any() +        { +            int const res=pthread_mutex_init(&internal_mutex,NULL); +            if(res) +            { +                throw thread_resource_error(); +            } +            int const res2=pthread_cond_init(&cond,NULL); +            if(res2) +            { +                BOOST_VERIFY(!pthread_mutex_destroy(&internal_mutex)); +                throw thread_resource_error(); +            } +        } +        ~condition_variable_any() +        { +            BOOST_VERIFY(!pthread_mutex_destroy(&internal_mutex)); +            BOOST_VERIFY(!pthread_cond_destroy(&cond)); +        } +         +        template<typename lock_type> +        void wait(lock_type& m) +        { +            int res=0; +            { +                detail::interruption_checker check_for_interruption(&cond); +                { +                    boost::pthread::pthread_mutex_scoped_lock internal_lock(&internal_mutex); +                    m.unlock(); +                    res=pthread_cond_wait(&cond,&internal_mutex); +                } +                m.lock(); +            } +            if(res) +            { +                throw condition_error(); +            } +        } + +        template<typename lock_type,typename predicate_type> +        void wait(lock_type& m,predicate_type pred) +        { +            while(!pred()) wait(m); +        } +         +        template<typename lock_type> +        bool timed_wait(lock_type& m,boost::system_time const& wait_until) +        { +            struct timespec const timeout=detail::get_timespec(wait_until); +            int res=0; +            { +                detail::interruption_checker check_for_interruption(&cond); +                { +                    boost::pthread::pthread_mutex_scoped_lock internal_lock(&internal_mutex); +                    m.unlock(); +                    res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout); +                } +                m.lock(); +            } +            if(res==ETIMEDOUT) +            { +                return false; +            } +            if(res) +            { +                throw condition_error(); +            } +            return true; +        } +        template<typename lock_type> +        bool timed_wait(lock_type& m,xtime const& wait_until) +        { +            return timed_wait(m,system_time(wait_until)); +        } + +        template<typename lock_type,typename duration_type> +        bool timed_wait(lock_type& m,duration_type const& wait_duration) +        { +            return timed_wait(m,get_system_time()+wait_duration); +        } + +        template<typename lock_type,typename predicate_type> +        bool timed_wait(lock_type& m,boost::system_time const& wait_until,predicate_type pred) +        { +            while (!pred()) +            { +                if(!timed_wait(m, wait_until)) +                    return pred(); +            } +            return true; +        } + +        template<typename lock_type,typename predicate_type> +        bool timed_wait(lock_type& m,xtime const& wait_until,predicate_type pred) +        { +            return timed_wait(m,system_time(wait_until),pred); +        } + +        template<typename lock_type,typename duration_type,typename predicate_type> +        bool timed_wait(lock_type& m,duration_type const& wait_duration,predicate_type pred) +        { +            return timed_wait(m,get_system_time()+wait_duration,pred); +        } + +        void notify_one() +        { +            boost::pthread::pthread_mutex_scoped_lock internal_lock(&internal_mutex); +            BOOST_VERIFY(!pthread_cond_signal(&cond)); +        } +         +        void notify_all() +        { +            boost::pthread::pthread_mutex_scoped_lock internal_lock(&internal_mutex); +            BOOST_VERIFY(!pthread_cond_broadcast(&cond)); +        } +    }; + +} + +#include <boost/config/abi_suffix.hpp> + +#endif diff --git a/3rdParty/Boost/boost/thread/pthread/condition_variable_fwd.hpp b/3rdParty/Boost/boost/thread/pthread/condition_variable_fwd.hpp new file mode 100644 index 0000000..4048cdf --- /dev/null +++ b/3rdParty/Boost/boost/thread/pthread/condition_variable_fwd.hpp @@ -0,0 +1,97 @@ +#ifndef BOOST_THREAD_PTHREAD_CONDITION_VARIABLE_FWD_HPP +#define BOOST_THREAD_PTHREAD_CONDITION_VARIABLE_FWD_HPP +// 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) +// (C) Copyright 2007-8 Anthony Williams + +#include <boost/assert.hpp> +#include <pthread.h> +#include <boost/thread/mutex.hpp> +#include <boost/thread/locks.hpp> +#include <boost/thread/thread_time.hpp> +#include <boost/thread/xtime.hpp> + +#include <boost/config/abi_prefix.hpp> + +namespace boost +{ +    class condition_variable +    { +    private: +        pthread_cond_t cond; +         +        condition_variable(condition_variable&); +        condition_variable& operator=(condition_variable&); + +    public: +        condition_variable() +        { +            int const res=pthread_cond_init(&cond,NULL); +            if(res) +            { +                throw thread_resource_error(); +            } +        } +        ~condition_variable() +        { +            BOOST_VERIFY(!pthread_cond_destroy(&cond)); +        } + +        void wait(unique_lock<mutex>& m); + +        template<typename predicate_type> +        void wait(unique_lock<mutex>& m,predicate_type pred) +        { +            while(!pred()) wait(m); +        } + +        bool timed_wait(unique_lock<mutex>& m,boost::system_time const& wait_until); +        bool timed_wait(unique_lock<mutex>& m,xtime const& wait_until) +        { +            return timed_wait(m,system_time(wait_until)); +        } + +        template<typename duration_type> +        bool timed_wait(unique_lock<mutex>& m,duration_type const& wait_duration) +        { +            return timed_wait(m,get_system_time()+wait_duration); +        } + +        template<typename predicate_type> +        bool timed_wait(unique_lock<mutex>& m,boost::system_time const& wait_until,predicate_type pred) +        { +            while (!pred()) +            { +                if(!timed_wait(m, wait_until)) +                    return pred(); +            } +            return true; +        } + +        template<typename predicate_type> +        bool timed_wait(unique_lock<mutex>& m,xtime const& wait_until,predicate_type pred) +        { +            return timed_wait(m,system_time(wait_until),pred); +        } + +        template<typename duration_type,typename predicate_type> +        bool timed_wait(unique_lock<mutex>& m,duration_type const& wait_duration,predicate_type pred) +        { +            return timed_wait(m,get_system_time()+wait_duration,pred); +        } + +        typedef pthread_cond_t* native_handle_type; +        native_handle_type native_handle() +        { +            return &cond; +        } + +        void notify_one(); +        void notify_all(); +    }; +} + +#include <boost/config/abi_suffix.hpp> + +#endif diff --git a/3rdParty/Boost/boost/thread/pthread/mutex.hpp b/3rdParty/Boost/boost/thread/pthread/mutex.hpp new file mode 100644 index 0000000..51d62ae --- /dev/null +++ b/3rdParty/Boost/boost/thread/pthread/mutex.hpp @@ -0,0 +1,210 @@ +#ifndef BOOST_THREAD_PTHREAD_MUTEX_HPP +#define BOOST_THREAD_PTHREAD_MUTEX_HPP +// (C) Copyright 2007-8 Anthony Williams +// 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 <pthread.h> +#include <boost/utility.hpp> +#include <boost/thread/exceptions.hpp> +#include <boost/thread/locks.hpp> +#include <boost/thread/thread_time.hpp> +#include <boost/thread/xtime.hpp> +#include <boost/assert.hpp> +#include <errno.h> +#include "timespec.hpp" +#include "pthread_mutex_scoped_lock.hpp" + +#ifdef _POSIX_TIMEOUTS +#if _POSIX_TIMEOUTS >= 0 +#define BOOST_PTHREAD_HAS_TIMEDLOCK +#endif +#endif + +#include <boost/config/abi_prefix.hpp> + +namespace boost +{ +    class mutex: +        boost::noncopyable +    { +    private: +        pthread_mutex_t m; +    public: +        mutex() +        { +            int const res=pthread_mutex_init(&m,NULL); +            if(res) +            { +                throw thread_resource_error(); +            } +        } +        ~mutex() +        { +            BOOST_VERIFY(!pthread_mutex_destroy(&m)); +        } +         +        void lock() +        { +            BOOST_VERIFY(!pthread_mutex_lock(&m)); +        } + +        void unlock() +        { +            BOOST_VERIFY(!pthread_mutex_unlock(&m)); +        } +         +        bool try_lock() +        { +            int const res=pthread_mutex_trylock(&m); +            BOOST_ASSERT(!res || res==EBUSY); +            return !res; +        } + +        typedef pthread_mutex_t* native_handle_type; +        native_handle_type native_handle() +        { +            return &m; +        } + +        typedef unique_lock<mutex> scoped_lock; +        typedef detail::try_lock_wrapper<mutex> scoped_try_lock; +    }; + +    typedef mutex try_mutex; + +    class timed_mutex: +        boost::noncopyable +    { +    private: +        pthread_mutex_t m; +#ifndef BOOST_PTHREAD_HAS_TIMEDLOCK +        pthread_cond_t cond; +        bool is_locked; +#endif +    public: +        timed_mutex() +        { +            int const res=pthread_mutex_init(&m,NULL); +            if(res) +            { +                throw thread_resource_error(); +            } +#ifndef BOOST_PTHREAD_HAS_TIMEDLOCK +            int const res2=pthread_cond_init(&cond,NULL); +            if(res2) +            { +                BOOST_VERIFY(!pthread_mutex_destroy(&m)); +                throw thread_resource_error(); +            } +            is_locked=false; +#endif +        } +        ~timed_mutex() +        { +            BOOST_VERIFY(!pthread_mutex_destroy(&m)); +#ifndef BOOST_PTHREAD_HAS_TIMEDLOCK +            BOOST_VERIFY(!pthread_cond_destroy(&cond)); +#endif +        } + +        template<typename TimeDuration> +        bool timed_lock(TimeDuration const & relative_time) +        { +            return timed_lock(get_system_time()+relative_time); +        } +        bool timed_lock(boost::xtime const & absolute_time) +        { +            return timed_lock(system_time(absolute_time)); +        } + +#ifdef BOOST_PTHREAD_HAS_TIMEDLOCK +        void lock() +        { +            BOOST_VERIFY(!pthread_mutex_lock(&m)); +        } + +        void unlock() +        { +            BOOST_VERIFY(!pthread_mutex_unlock(&m)); +        } +         +        bool try_lock() +        { +            int const res=pthread_mutex_trylock(&m); +            BOOST_ASSERT(!res || res==EBUSY); +            return !res; +        } +        bool timed_lock(system_time const & abs_time) +        { +            struct timespec const timeout=detail::get_timespec(abs_time); +            int const res=pthread_mutex_timedlock(&m,&timeout); +            BOOST_ASSERT(!res || res==ETIMEDOUT); +            return !res; +        } + +        typedef pthread_mutex_t* native_handle_type; +        native_handle_type native_handle() +        { +            return &m; +        } + +#else +        void lock() +        { +            boost::pthread::pthread_mutex_scoped_lock const local_lock(&m); +            while(is_locked) +            { +                BOOST_VERIFY(!pthread_cond_wait(&cond,&m)); +            } +            is_locked=true; +        } + +        void unlock() +        { +            boost::pthread::pthread_mutex_scoped_lock const local_lock(&m); +            is_locked=false; +            BOOST_VERIFY(!pthread_cond_signal(&cond)); +        } +         +        bool try_lock() +        { +            boost::pthread::pthread_mutex_scoped_lock const local_lock(&m); +            if(is_locked) +            { +                return false; +            } +            is_locked=true; +            return true; +        } + +        bool timed_lock(system_time const & abs_time) +        { +            struct timespec const timeout=detail::get_timespec(abs_time); +            boost::pthread::pthread_mutex_scoped_lock const local_lock(&m); +            while(is_locked) +            { +                int const cond_res=pthread_cond_timedwait(&cond,&m,&timeout); +                if(cond_res==ETIMEDOUT) +                { +                    return false; +                } +                BOOST_ASSERT(!cond_res); +            } +            is_locked=true; +            return true; +        } +#endif + +        typedef unique_lock<timed_mutex> scoped_timed_lock; +        typedef detail::try_lock_wrapper<timed_mutex> scoped_try_lock; +        typedef scoped_timed_lock scoped_lock; +    }; + +} + +#include <boost/config/abi_suffix.hpp> + + +#endif diff --git a/3rdParty/Boost/boost/thread/pthread/once.hpp b/3rdParty/Boost/boost/thread/pthread/once.hpp new file mode 100644 index 0000000..f278a57 --- /dev/null +++ b/3rdParty/Boost/boost/thread/pthread/once.hpp @@ -0,0 +1,90 @@ +#ifndef BOOST_THREAD_PTHREAD_ONCE_HPP +#define BOOST_THREAD_PTHREAD_ONCE_HPP + +//  once.hpp +// +//  (C) Copyright 2007-8 Anthony Williams  +// +//  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 <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/config/abi_prefix.hpp> + +namespace boost +{ + +    struct once_flag +    { +        boost::uintmax_t epoch; +    }; + +    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 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(); +         +        if(epoch<this_thread_epoch) +        { +            pthread::pthread_mutex_scoped_lock lk(&detail::once_epoch_mutex); + +            while(flag.epoch<=being_initialized) +            { +                if(flag.epoch==uninitialized_flag) +                { +                    flag.epoch=being_initialized; +                    try +                    { +                        pthread::pthread_mutex_scoped_unlock relocker(&detail::once_epoch_mutex); +                        f(); +                    } +                    catch(...) +                    { +                        flag.epoch=uninitialized_flag; +                        BOOST_VERIFY(!pthread_cond_broadcast(&detail::once_epoch_cv)); +                        throw; +                    } +                    flag.epoch=--detail::once_global_epoch; +                    BOOST_VERIFY(!pthread_cond_broadcast(&detail::once_epoch_cv)); +                } +                else +                { +                    while(flag.epoch==being_initialized) +                    { +                        BOOST_VERIFY(!pthread_cond_wait(&detail::once_epoch_cv,&detail::once_epoch_mutex)); +                    } +                } +            } +            this_thread_epoch=detail::once_global_epoch; +        } +    } +} + +#include <boost/config/abi_suffix.hpp> + +#endif diff --git a/3rdParty/Boost/boost/thread/pthread/pthread_mutex_scoped_lock.hpp b/3rdParty/Boost/boost/thread/pthread/pthread_mutex_scoped_lock.hpp new file mode 100644 index 0000000..2407f91 --- /dev/null +++ b/3rdParty/Boost/boost/thread/pthread/pthread_mutex_scoped_lock.hpp @@ -0,0 +1,54 @@ +#ifndef BOOST_PTHREAD_MUTEX_SCOPED_LOCK_HPP +#define BOOST_PTHREAD_MUTEX_SCOPED_LOCK_HPP +//  (C) Copyright 2007-8 Anthony Williams  +// +//  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 <pthread.h> +#include <boost/assert.hpp> + +#include <boost/config/abi_prefix.hpp> + +namespace boost +{ +    namespace pthread +    { +        class pthread_mutex_scoped_lock +        { +            pthread_mutex_t* m; +        public: +            explicit pthread_mutex_scoped_lock(pthread_mutex_t* m_): +                m(m_) +            { +                BOOST_VERIFY(!pthread_mutex_lock(m)); +            } +            ~pthread_mutex_scoped_lock() +            { +                BOOST_VERIFY(!pthread_mutex_unlock(m)); +            } +             +        }; + +        class pthread_mutex_scoped_unlock +        { +            pthread_mutex_t* m; +        public: +            explicit pthread_mutex_scoped_unlock(pthread_mutex_t* m_): +                m(m_) +            { +                BOOST_VERIFY(!pthread_mutex_unlock(m)); +            } +            ~pthread_mutex_scoped_unlock() +            { +                BOOST_VERIFY(!pthread_mutex_lock(m)); +            } +             +        }; +    } +} + +#include <boost/config/abi_suffix.hpp> + +#endif diff --git a/3rdParty/Boost/boost/thread/pthread/recursive_mutex.hpp b/3rdParty/Boost/boost/thread/pthread/recursive_mutex.hpp new file mode 100644 index 0000000..f3f7bf1 --- /dev/null +++ b/3rdParty/Boost/boost/thread/pthread/recursive_mutex.hpp @@ -0,0 +1,266 @@ +#ifndef BOOST_THREAD_PTHREAD_RECURSIVE_MUTEX_HPP +#define BOOST_THREAD_PTHREAD_RECURSIVE_MUTEX_HPP +// (C) Copyright 2007-8 Anthony Williams +// 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 <pthread.h> +#include <boost/utility.hpp> +#include <boost/thread/exceptions.hpp> +#include <boost/thread/locks.hpp> +#include <boost/thread/thread_time.hpp> +#include <boost/assert.hpp> +#ifndef _WIN32 +#include <unistd.h> +#endif +#include <boost/date_time/posix_time/conversion.hpp> +#include <errno.h> +#include "timespec.hpp" +#include "pthread_mutex_scoped_lock.hpp" + +#ifdef _POSIX_TIMEOUTS +#if _POSIX_TIMEOUTS >= 0 +#define BOOST_PTHREAD_HAS_TIMEDLOCK +#endif +#endif + +#include <boost/config/abi_prefix.hpp> + +namespace boost +{ +    class recursive_mutex: +        boost::noncopyable +    { +    private: +        pthread_mutex_t m; +    public: +        recursive_mutex() +        { +            pthread_mutexattr_t attr; +             +            int const init_attr_res=pthread_mutexattr_init(&attr); +            if(init_attr_res) +            { +                throw thread_resource_error(); +            } +            int const set_attr_res=pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE); +            if(set_attr_res) +            { +                throw thread_resource_error(); +            } +             +            int const res=pthread_mutex_init(&m,&attr); +            if(res) +            { +                throw thread_resource_error(); +            } +            BOOST_VERIFY(!pthread_mutexattr_destroy(&attr)); +        } +        ~recursive_mutex() +        { +            BOOST_VERIFY(!pthread_mutex_destroy(&m)); +        } +         +        void lock() +        { +            BOOST_VERIFY(!pthread_mutex_lock(&m)); +        } + +        void unlock() +        { +            BOOST_VERIFY(!pthread_mutex_unlock(&m)); +        } +         +        bool try_lock() +        { +            int const res=pthread_mutex_trylock(&m); +            BOOST_ASSERT(!res || res==EBUSY); +            return !res; +        } + +        typedef pthread_mutex_t* native_handle_type; +        native_handle_type native_handle() +        { +            return &m; +        } + +        typedef unique_lock<recursive_mutex> scoped_lock; +        typedef detail::try_lock_wrapper<recursive_mutex> scoped_try_lock; +    }; + +    typedef recursive_mutex recursive_try_mutex; + +    class recursive_timed_mutex: +        boost::noncopyable +    { +    private: +        pthread_mutex_t m; +#ifndef BOOST_PTHREAD_HAS_TIMEDLOCK +        pthread_cond_t cond; +        bool is_locked; +        pthread_t owner; +        unsigned count; +#endif +    public: +        recursive_timed_mutex() +        { +#ifdef BOOST_PTHREAD_HAS_TIMEDLOCK +            pthread_mutexattr_t attr; +             +            int const init_attr_res=pthread_mutexattr_init(&attr); +            if(init_attr_res) +            { +                throw thread_resource_error(); +            } +            int const set_attr_res=pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE); +            if(set_attr_res) +            { +                throw thread_resource_error(); +            } +             +            int const res=pthread_mutex_init(&m,&attr); +            if(res) +            { +                BOOST_VERIFY(!pthread_mutexattr_destroy(&attr)); +                throw thread_resource_error(); +            } +            BOOST_VERIFY(!pthread_mutexattr_destroy(&attr)); +#else +            int const res=pthread_mutex_init(&m,NULL); +            if(res) +            { +                throw thread_resource_error(); +            } +            int const res2=pthread_cond_init(&cond,NULL); +            if(res2) +            { +                BOOST_VERIFY(!pthread_mutex_destroy(&m)); +                throw thread_resource_error(); +            } +            is_locked=false; +            count=0; +#endif +        } +        ~recursive_timed_mutex() +        { +            BOOST_VERIFY(!pthread_mutex_destroy(&m)); +#ifndef BOOST_PTHREAD_HAS_TIMEDLOCK +            BOOST_VERIFY(!pthread_cond_destroy(&cond)); +#endif +        } + +        template<typename TimeDuration> +        bool timed_lock(TimeDuration const & relative_time) +        { +            return timed_lock(get_system_time()+relative_time); +        } + +#ifdef BOOST_PTHREAD_HAS_TIMEDLOCK +        void lock() +        { +            BOOST_VERIFY(!pthread_mutex_lock(&m)); +        } + +        void unlock() +        { +            BOOST_VERIFY(!pthread_mutex_unlock(&m)); +        } +         +        bool try_lock() +        { +            int const res=pthread_mutex_trylock(&m); +            BOOST_ASSERT(!res || res==EBUSY); +            return !res; +        } +        bool timed_lock(system_time const & abs_time) +        { +            struct timespec const timeout=detail::get_timespec(abs_time); +            int const res=pthread_mutex_timedlock(&m,&timeout); +            BOOST_ASSERT(!res || res==ETIMEDOUT); +            return !res; +        } + +        typedef pthread_mutex_t* native_handle_type; +        native_handle_type native_handle() +        { +            return &m; +        } + +#else +        void lock() +        { +            boost::pthread::pthread_mutex_scoped_lock const local_lock(&m); +            if(is_locked && pthread_equal(owner,pthread_self())) +            { +                ++count; +                return; +            } +             +            while(is_locked) +            { +                BOOST_VERIFY(!pthread_cond_wait(&cond,&m)); +            } +            is_locked=true; +            ++count; +            owner=pthread_self(); +        } + +        void unlock() +        { +            boost::pthread::pthread_mutex_scoped_lock const local_lock(&m); +            if(!--count) +            { +                is_locked=false; +            } +            BOOST_VERIFY(!pthread_cond_signal(&cond)); +        } +         +        bool try_lock() +        { +            boost::pthread::pthread_mutex_scoped_lock const local_lock(&m); +            if(is_locked && !pthread_equal(owner,pthread_self())) +            { +                return false; +            } +            is_locked=true; +            ++count; +            owner=pthread_self(); +            return true; +        } + +        bool timed_lock(system_time const & abs_time) +        { +            struct timespec const timeout=detail::get_timespec(abs_time); +            boost::pthread::pthread_mutex_scoped_lock const local_lock(&m); +            if(is_locked && pthread_equal(owner,pthread_self())) +            { +                ++count; +                return true; +            } +            while(is_locked) +            { +                int const cond_res=pthread_cond_timedwait(&cond,&m,&timeout); +                if(cond_res==ETIMEDOUT) +                { +                    return false; +                } +                BOOST_ASSERT(!cond_res); +            } +            is_locked=true; +            ++count; +            owner=pthread_self(); +            return true; +        } +#endif + +        typedef unique_lock<recursive_timed_mutex> scoped_timed_lock; +        typedef detail::try_lock_wrapper<recursive_timed_mutex> scoped_try_lock; +        typedef scoped_timed_lock scoped_lock; +    }; + +} + +#include <boost/config/abi_suffix.hpp> + +#endif diff --git a/3rdParty/Boost/boost/thread/pthread/shared_mutex.hpp b/3rdParty/Boost/boost/thread/pthread/shared_mutex.hpp new file mode 100644 index 0000000..3ce4e23 --- /dev/null +++ b/3rdParty/Boost/boost/thread/pthread/shared_mutex.hpp @@ -0,0 +1,303 @@ +#ifndef BOOST_THREAD_PTHREAD_SHARED_MUTEX_HPP +#define BOOST_THREAD_PTHREAD_SHARED_MUTEX_HPP + +//  (C) Copyright 2006-8 Anthony Williams +// +//  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/assert.hpp> +#include <boost/static_assert.hpp> +#include <boost/thread/mutex.hpp> +#include <boost/thread/thread.hpp> +#include <boost/thread/condition_variable.hpp> + +#include <boost/config/abi_prefix.hpp> + +namespace boost +{ +    class shared_mutex +    { +    private: +        struct state_data +        { +            unsigned shared_count; +            bool exclusive; +            bool upgrade; +            bool exclusive_waiting_blocked; +        }; +         + + +        state_data state; +        boost::mutex state_change; +        boost::condition_variable shared_cond; +        boost::condition_variable exclusive_cond; +        boost::condition_variable upgrade_cond; + +        void release_waiters() +        { +            exclusive_cond.notify_one(); +            shared_cond.notify_all(); +        } +         + +    public: +        shared_mutex() +        { +            state_data state_={0,0,0,0}; +            state=state_; +        } + +        ~shared_mutex() +        { +        } + +        void lock_shared() +        { +            boost::this_thread::disable_interruption do_not_disturb; +            boost::mutex::scoped_lock lk(state_change); +                 +            while(state.exclusive || state.exclusive_waiting_blocked) +            { +                shared_cond.wait(lk); +            } +            ++state.shared_count; +        } + +        bool try_lock_shared() +        { +            boost::mutex::scoped_lock lk(state_change); +                 +            if(state.exclusive || state.exclusive_waiting_blocked) +            { +                return false; +            } +            else +            { +                ++state.shared_count; +                return true; +            } +        } + +        bool timed_lock_shared(system_time const& timeout) +        { +            boost::this_thread::disable_interruption do_not_disturb; +            boost::mutex::scoped_lock lk(state_change); +                 +            while(state.exclusive || state.exclusive_waiting_blocked) +            { +                if(!shared_cond.timed_wait(lk,timeout)) +                { +                    return false; +                } +            } +            ++state.shared_count; +            return true; +        } + +        template<typename TimeDuration> +        bool timed_lock_shared(TimeDuration const & relative_time) +        { +            return timed_lock_shared(get_system_time()+relative_time); +        } + +        void unlock_shared() +        { +            boost::mutex::scoped_lock lk(state_change); +            bool const last_reader=!--state.shared_count; +                 +            if(last_reader) +            { +                if(state.upgrade) +                { +                    state.upgrade=false; +                    state.exclusive=true; +                    upgrade_cond.notify_one(); +                } +                else +                { +                    state.exclusive_waiting_blocked=false; +                } +                release_waiters(); +            } +        } + +        void lock() +        { +            boost::this_thread::disable_interruption do_not_disturb; +            boost::mutex::scoped_lock lk(state_change); +                 +            while(state.shared_count || state.exclusive) +            { +                state.exclusive_waiting_blocked=true; +                exclusive_cond.wait(lk); +            } +            state.exclusive=true; +        } + +        bool timed_lock(system_time const& timeout) +        { +            boost::this_thread::disable_interruption do_not_disturb; +            boost::mutex::scoped_lock lk(state_change); + +            while(state.shared_count || state.exclusive) +            { +                state.exclusive_waiting_blocked=true; +                if(!exclusive_cond.timed_wait(lk,timeout)) +                { +                    if(state.shared_count || state.exclusive) +                    { +                        state.exclusive_waiting_blocked=false; +                        exclusive_cond.notify_one(); +                        return false; +                    } +                    break; +                } +            } +            state.exclusive=true; +            return true; +        } + +        template<typename TimeDuration> +        bool timed_lock(TimeDuration const & relative_time) +        { +            return timed_lock(get_system_time()+relative_time); +        } + +        bool try_lock() +        { +            boost::mutex::scoped_lock lk(state_change); +                 +            if(state.shared_count || state.exclusive) +            { +                return false; +            } +            else +            { +                state.exclusive=true; +                return true; +            } +                 +        } + +        void unlock() +        { +            boost::mutex::scoped_lock lk(state_change); +            state.exclusive=false; +            state.exclusive_waiting_blocked=false; +            release_waiters(); +        } + +        void lock_upgrade() +        { +            boost::this_thread::disable_interruption do_not_disturb; +            boost::mutex::scoped_lock lk(state_change); +            while(state.exclusive || state.exclusive_waiting_blocked || state.upgrade) +            { +                shared_cond.wait(lk); +            } +            ++state.shared_count; +            state.upgrade=true; +        } + +        bool timed_lock_upgrade(system_time const& timeout) +        { +            boost::this_thread::disable_interruption do_not_disturb; +            boost::mutex::scoped_lock lk(state_change); +            while(state.exclusive || state.exclusive_waiting_blocked || state.upgrade) +            { +                if(!shared_cond.timed_wait(lk,timeout)) +                { +                    if(state.exclusive || state.exclusive_waiting_blocked || state.upgrade) +                    { +                        return false; +                    } +                    break; +                } +            } +            ++state.shared_count; +            state.upgrade=true; +            return true; +        } + +        template<typename TimeDuration> +        bool timed_lock_upgrade(TimeDuration const & relative_time) +        { +            return timed_lock(get_system_time()+relative_time); +        } + +        bool try_lock_upgrade() +        { +            boost::mutex::scoped_lock lk(state_change); +            if(state.exclusive || state.exclusive_waiting_blocked || state.upgrade) +            { +                return false; +            } +            else +            { +                ++state.shared_count; +                state.upgrade=true; +                return true; +            } +        } + +        void unlock_upgrade() +        { +            boost::mutex::scoped_lock lk(state_change); +            state.upgrade=false; +            bool const last_reader=!--state.shared_count; +                 +            if(last_reader) +            { +                state.exclusive_waiting_blocked=false; +                release_waiters(); +            } +        } + +        void unlock_upgrade_and_lock() +        { +            boost::this_thread::disable_interruption do_not_disturb; +            boost::mutex::scoped_lock lk(state_change); +            --state.shared_count; +            while(state.shared_count) +            { +                upgrade_cond.wait(lk); +            } +            state.upgrade=false; +            state.exclusive=true; +        } + +        void unlock_and_lock_upgrade() +        { +            boost::mutex::scoped_lock lk(state_change); +            state.exclusive=false; +            state.upgrade=true; +            ++state.shared_count; +            state.exclusive_waiting_blocked=false; +            release_waiters(); +        } +         +        void unlock_and_lock_shared() +        { +            boost::mutex::scoped_lock lk(state_change); +            state.exclusive=false; +            ++state.shared_count; +            state.exclusive_waiting_blocked=false; +            release_waiters(); +        } +         +        void unlock_upgrade_and_lock_shared() +        { +            boost::mutex::scoped_lock lk(state_change); +            state.upgrade=false; +            state.exclusive_waiting_blocked=false; +            release_waiters(); +        } +    }; +} + +#include <boost/config/abi_suffix.hpp> + +#endif diff --git a/3rdParty/Boost/boost/thread/pthread/thread_data.hpp b/3rdParty/Boost/boost/thread/pthread/thread_data.hpp new file mode 100644 index 0000000..244035b --- /dev/null +++ b/3rdParty/Boost/boost/thread/pthread/thread_data.hpp @@ -0,0 +1,118 @@ +#ifndef BOOST_THREAD_PTHREAD_THREAD_DATA_HPP +#define BOOST_THREAD_PTHREAD_THREAD_DATA_HPP +// 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) +// (C) Copyright 2007 Anthony Williams + +#include <boost/thread/detail/config.hpp> +#include <boost/thread/exceptions.hpp> +#include <boost/shared_ptr.hpp> +#include <boost/enable_shared_from_this.hpp> +#include <boost/thread/mutex.hpp> +#include <boost/optional.hpp> +#include <pthread.h> +#include "condition_variable_fwd.hpp" + +#include <boost/config/abi_prefix.hpp> + +namespace boost +{ +    class thread; +     +    namespace detail +    { +        struct thread_exit_callback_node; +        struct tss_data_node; + +        struct thread_data_base; +        typedef boost::shared_ptr<thread_data_base> thread_data_ptr; +         +        struct BOOST_THREAD_DECL thread_data_base: +            enable_shared_from_this<thread_data_base> +        { +            thread_data_ptr self; +            pthread_t thread_handle; +            boost::mutex data_mutex; +            boost::condition_variable done_condition; +            boost::mutex sleep_mutex; +            boost::condition_variable sleep_condition; +            bool done; +            bool join_started; +            bool joined; +            boost::detail::thread_exit_callback_node* thread_exit_callbacks; +            boost::detail::tss_data_node* tss_data; +            bool interrupt_enabled; +            bool interrupt_requested; +            pthread_cond_t* current_cond; + +            thread_data_base(): +                done(false),join_started(false),joined(false), +                thread_exit_callbacks(0),tss_data(0), +                interrupt_enabled(true), +                interrupt_requested(false), +                current_cond(0) +            {} +            virtual ~thread_data_base(); + +            typedef pthread_t native_handle_type; + +            virtual void run()=0; +        }; + +        BOOST_THREAD_DECL thread_data_base* get_current_thread_data(); + +        class interruption_checker +        { +            thread_data_base* const thread_info; + +            void check_for_interruption() +            { +                if(thread_info->interrupt_requested) +                { +                    thread_info->interrupt_requested=false; +                    throw thread_interrupted(); +                } +            } +             +            void operator=(interruption_checker&); +        public: +            explicit interruption_checker(pthread_cond_t* cond): +                thread_info(detail::get_current_thread_data()) +            { +                if(thread_info && thread_info->interrupt_enabled) +                { +                    lock_guard<mutex> guard(thread_info->data_mutex); +                    check_for_interruption(); +                    thread_info->current_cond=cond; +                } +            } +            ~interruption_checker() +            { +                if(thread_info && thread_info->interrupt_enabled) +                { +                    lock_guard<mutex> guard(thread_info->data_mutex); +                    thread_info->current_cond=NULL; +                    check_for_interruption(); +                } +            } +        }; +    } + +    namespace this_thread +    { +        void BOOST_THREAD_DECL yield(); +         +        void BOOST_THREAD_DECL sleep(system_time const& abs_time); +         +        template<typename TimeDuration> +        inline void sleep(TimeDuration const& rel_time) +        { +            this_thread::sleep(get_system_time()+rel_time); +        } +    } +} + +#include <boost/config/abi_suffix.hpp> + +#endif diff --git a/3rdParty/Boost/boost/thread/pthread/thread_heap_alloc.hpp b/3rdParty/Boost/boost/thread/pthread/thread_heap_alloc.hpp new file mode 100644 index 0000000..7cc0aa0 --- /dev/null +++ b/3rdParty/Boost/boost/thread/pthread/thread_heap_alloc.hpp @@ -0,0 +1,242 @@ +// 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) +// (C) Copyright 2008 Anthony Williams +#ifndef THREAD_HEAP_ALLOC_PTHREAD_HPP +#define THREAD_HEAP_ALLOC_PTHREAD_HPP + +#include <boost/config/abi_prefix.hpp> + +namespace boost +{ +    namespace detail +    { +        template<typename T> +        inline T* heap_new() +        { +            return new T(); +        } + +#ifdef BOOST_HAS_RVALUE_REFS +        template<typename T,typename A1> +        inline T* heap_new(A1&& a1) +        { +            return new T(static_cast<A1&&>(a1)); +        } +        template<typename T,typename A1,typename A2> +        inline T* heap_new(A1&& a1,A2&& a2) +        { +            return new T(static_cast<A1&&>(a1),static_cast<A2&&>(a2)); +        } +        template<typename T,typename A1,typename A2,typename A3> +        inline T* heap_new(A1&& a1,A2&& a2,A3&& a3) +        { +            return new T(static_cast<A1&&>(a1),static_cast<A2&&>(a2), +                         static_cast<A3&&>(a3)); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1&& a1,A2&& a2,A3&& a3,A4&& a4) +        { +            return new T(static_cast<A1&&>(a1),static_cast<A2&&>(a2), +                         static_cast<A3&&>(a3),static_cast<A4&&>(a4)); +        } +#else +        template<typename T,typename A1> +        inline T* heap_new_impl(A1 a1) +        { +            return new T(a1); +        } +        template<typename T,typename A1,typename A2> +        inline T* heap_new_impl(A1 a1,A2 a2) +        { +            return new T(a1,a2); +        } +        template<typename T,typename A1,typename A2,typename A3> +        inline T* heap_new_impl(A1 a1,A2 a2,A3 a3) +        { +            return new T(a1,a2,a3); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4) +        { +            return new T(a1,a2,a3,a4); +        } + +        template<typename T,typename A1> +        inline T* heap_new(A1 const& a1) +        { +            return heap_new_impl<T,A1 const&>(a1); +        } +        template<typename T,typename A1> +        inline T* heap_new(A1& a1) +        { +            return heap_new_impl<T,A1&>(a1); +        } +         +        template<typename T,typename A1,typename A2> +        inline T* heap_new(A1 const& a1,A2 const& a2) +        { +            return heap_new_impl<T,A1 const&,A2 const&>(a1,a2); +        } +        template<typename T,typename A1,typename A2> +        inline T* heap_new(A1& a1,A2 const& a2) +        { +            return heap_new_impl<T,A1&,A2 const&>(a1,a2); +        } +        template<typename T,typename A1,typename A2> +        inline T* heap_new(A1 const& a1,A2& a2) +        { +            return heap_new_impl<T,A1 const&,A2&>(a1,a2); +        } +        template<typename T,typename A1,typename A2> +        inline T* heap_new(A1& a1,A2& a2) +        { +            return heap_new_impl<T,A1&,A2&>(a1,a2); +        } + +        template<typename T,typename A1,typename A2,typename A3> +        inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3) +        { +            return heap_new_impl<T,A1 const&,A2 const&,A3 const&>(a1,a2,a3); +        } +        template<typename T,typename A1,typename A2,typename A3> +        inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3) +        { +            return heap_new_impl<T,A1&,A2 const&,A3 const&>(a1,a2,a3); +        } +        template<typename T,typename A1,typename A2,typename A3> +        inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3) +        { +            return heap_new_impl<T,A1 const&,A2&,A3 const&>(a1,a2,a3); +        } +        template<typename T,typename A1,typename A2,typename A3> +        inline T* heap_new(A1& a1,A2& a2,A3 const& a3) +        { +            return heap_new_impl<T,A1&,A2&,A3 const&>(a1,a2,a3); +        } + +        template<typename T,typename A1,typename A2,typename A3> +        inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3) +        { +            return heap_new_impl<T,A1 const&,A2 const&,A3&>(a1,a2,a3); +        } +        template<typename T,typename A1,typename A2,typename A3> +        inline T* heap_new(A1& a1,A2 const& a2,A3& a3) +        { +            return heap_new_impl<T,A1&,A2 const&,A3&>(a1,a2,a3); +        } +        template<typename T,typename A1,typename A2,typename A3> +        inline T* heap_new(A1 const& a1,A2& a2,A3& a3) +        { +            return heap_new_impl<T,A1 const&,A2&,A3&>(a1,a2,a3); +        } +        template<typename T,typename A1,typename A2,typename A3> +        inline T* heap_new(A1& a1,A2& a2,A3& a3) +        { +            return heap_new_impl<T,A1&,A2&,A3&>(a1,a2,a3); +        } + +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3,A4 const& a4) +        { +            return heap_new_impl<T,A1 const&,A2 const&,A3 const&,A4 const&>(a1,a2,a3,a4); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3,A4 const& a4) +        { +            return heap_new_impl<T,A1&,A2 const&,A3 const&,A4 const&>(a1,a2,a3,a4); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3,A4 const& a4) +        { +            return heap_new_impl<T,A1 const&,A2&,A3 const&,A4 const&>(a1,a2,a3,a4); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1& a1,A2& a2,A3 const& a3,A4 const& a4) +        { +            return heap_new_impl<T,A1&,A2&,A3 const&,A4 const&>(a1,a2,a3,a4); +        } + +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3,A4 const& a4) +        { +            return heap_new_impl<T,A1 const&,A2 const&,A3&,A4 const&>(a1,a2,a3,a4); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1& a1,A2 const& a2,A3& a3,A4 const& a4) +        { +            return heap_new_impl<T,A1&,A2 const&,A3&,A4 const&>(a1,a2,a3,a4); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1 const& a1,A2& a2,A3& a3,A4 const& a4) +        { +            return heap_new_impl<T,A1 const&,A2&,A3&,A4 const&>(a1,a2,a3,a4); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1& a1,A2& a2,A3& a3,A4 const& a4) +        { +            return heap_new_impl<T,A1&,A2&,A3&,A4 const&>(a1,a2,a3,a4); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3,A4& a4) +        { +            return heap_new_impl<T,A1 const&,A2 const&,A3 const&,A4&>(a1,a2,a3,a4); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3,A4& a4) +        { +            return heap_new_impl<T,A1&,A2 const&,A3 const&,A4&>(a1,a2,a3,a4); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3,A4& a4) +        { +            return heap_new_impl<T,A1 const&,A2&,A3 const&,A4&>(a1,a2,a3,a4); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1& a1,A2& a2,A3 const& a3,A4& a4) +        { +            return heap_new_impl<T,A1&,A2&,A3 const&,A4&>(a1,a2,a3,a4); +        } + +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3,A4& a4) +        { +            return heap_new_impl<T,A1 const&,A2 const&,A3&,A4&>(a1,a2,a3,a4); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1& a1,A2 const& a2,A3& a3,A4& a4) +        { +            return heap_new_impl<T,A1&,A2 const&,A3&,A4&>(a1,a2,a3,a4); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1 const& a1,A2& a2,A3& a3,A4& a4) +        { +            return heap_new_impl<T,A1 const&,A2&,A3&,A4&>(a1,a2,a3,a4); +        } +        template<typename T,typename A1,typename A2,typename A3,typename A4> +        inline T* heap_new(A1& a1,A2& a2,A3& a3,A4& a4) +        { +            return heap_new_impl<T,A1&,A2&,A3&,A4&>(a1,a2,a3,a4); +        } +         +#endif         +        template<typename T> +        inline void heap_delete(T* data) +        { +            delete data; +        } + +        template<typename T> +        struct do_heap_delete +        { +            void operator()(T* data) const +            { +                detail::heap_delete(data); +            } +        }; +    } +} + +#include <boost/config/abi_suffix.hpp> + +#endif diff --git a/3rdParty/Boost/boost/thread/pthread/timespec.hpp b/3rdParty/Boost/boost/thread/pthread/timespec.hpp new file mode 100644 index 0000000..d7465c1 --- /dev/null +++ b/3rdParty/Boost/boost/thread/pthread/timespec.hpp @@ -0,0 +1,36 @@ +#ifndef BOOST_THREAD_PTHREAD_TIMESPEC_HPP +#define BOOST_THREAD_PTHREAD_TIMESPEC_HPP +//  (C) Copyright 2007-8 Anthony Williams  +// +//  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/thread_time.hpp> +#include <boost/date_time/posix_time/conversion.hpp> +#include <pthread.h> +#ifndef _WIN32 +#include <unistd.h> +#endif + +#include <boost/config/abi_prefix.hpp> + +namespace boost +{ +    namespace detail +    { +        inline struct timespec get_timespec(boost::system_time const& abs_time) +        { +            struct timespec timeout={0,0}; +            boost::posix_time::time_duration const time_since_epoch=abs_time-boost::posix_time::from_time_t(0); +             +            timeout.tv_sec=time_since_epoch.total_seconds(); +            timeout.tv_nsec=(long)(time_since_epoch.fractional_seconds()*(1000000000l/time_since_epoch.ticks_per_second())); +            return timeout; +        } +    } +} + +#include <boost/config/abi_suffix.hpp> + +#endif | 
 Swift
 Swift