Ticket #2067: 2067.patch

File 2067.patch, 4.7 KB (added by eb@…, 14 years ago)

patch for ticket 2067

  • boost/thread/pthread/shared_mutex.hpp

     
    1010#include <boost/assert.hpp>
    1111#include <boost/static_assert.hpp>
    1212#include <boost/thread/mutex.hpp>
    13 #include <boost/thread/thread.hpp>
     13#include <boost/thread/detail/interruption_control.hpp>
    1414#include <boost/thread/condition_variable.hpp>
    1515
    1616#include <boost/config/abi_prefix.hpp>
  • boost/thread/detail/interruption_control.hpp

     
     1#ifndef BOOST_THREAD_DETAIL_INTERRUPTION_CONTROL_HPP
     2#define BOOST_THREAD_DETAIL_INTERRUPTION_CONTROL_HPP
     3// Distributed under the Boost Software License, Version 1.0. (See
     4// accompanying file LICENSE_1_0.txt or copy at
     5// http://www.boost.org/LICENSE_1_0.txt)
     6
     7#include <boost/thread/detail/config.hpp>
     8
     9namespace boost
     10{
     11    namespace this_thread
     12    {
     13        class BOOST_THREAD_DECL disable_interruption
     14        {
     15            disable_interruption(const disable_interruption&);
     16            disable_interruption& operator=(const disable_interruption&);
     17           
     18            bool interruption_was_enabled;
     19            friend class restore_interruption;
     20        public:
     21            disable_interruption();
     22            ~disable_interruption();
     23        };
     24
     25        class BOOST_THREAD_DECL restore_interruption
     26        {
     27            restore_interruption(const restore_interruption&);
     28            restore_interruption& operator=(const restore_interruption&);
     29        public:
     30            explicit restore_interruption(disable_interruption& d);
     31            ~restore_interruption();
     32        };
     33    }
     34}
     35#endif
  • boost/thread/detail/thread.hpp

     
    99#include <ostream>
    1010#include <boost/thread/detail/move.hpp>
    1111#include <boost/thread/mutex.hpp>
     12#include <boost/thread/shared_mutex.hpp>
    1213#include <boost/thread/xtime.hpp>
    1314#include <boost/thread/detail/thread_heap_alloc.hpp>
     15#include <boost/thread/detail/interruption_control.hpp>
    1416#include <boost/utility.hpp>
    1517#include <boost/assert.hpp>
    1618#include <list>
     
    338340
    339341    namespace this_thread
    340342    {
     343#if 0  // moved to interruption_control.hpp
    341344        class BOOST_THREAD_DECL disable_interruption
    342345        {
    343346            disable_interruption(const disable_interruption&);
     
    358361            explicit restore_interruption(disable_interruption& d);
    359362            ~restore_interruption();
    360363        };
     364#endif
    361365
    362366        thread::id BOOST_THREAD_DECL get_id();
    363367
     
    496500        template<typename F>
    497501        thread* create_thread(F threadfunc)
    498502        {
    499             boost::lock_guard<mutex> guard(m);
     503            boost::lock_guard<shared_mutex> guard(m);
    500504            std::auto_ptr<thread> new_thread(new thread(threadfunc));
    501505            threads.push_back(new_thread.get());
    502506            return new_thread.release();
     
    506510        {
    507511            if(thrd)
    508512            {
    509                 boost::lock_guard<mutex> guard(m);
     513                boost::lock_guard<shared_mutex> guard(m);
    510514                threads.push_back(thrd);
    511515            }
    512516        }
    513517           
    514518        void remove_thread(thread* thrd)
    515519        {
    516             boost::lock_guard<mutex> guard(m);
     520            boost::lock_guard<shared_mutex> guard(m);
    517521            std::list<thread*>::iterator const it=std::find(threads.begin(),threads.end(),thrd);
    518522            if(it!=threads.end())
    519523            {
     
    523527       
    524528        void join_all()
    525529        {
    526             boost::lock_guard<mutex> guard(m);
     530            boost::shared_lock<shared_mutex> guard(m);
    527531           
    528532            for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
    529533                it!=end;
     
    535539       
    536540        void interrupt_all()
    537541        {
    538             boost::lock_guard<mutex> guard(m);
     542            boost::shared_lock<shared_mutex> guard(m);
    539543           
    540544            for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
    541545                it!=end;
     
    547551       
    548552        size_t size() const
    549553        {
    550             boost::lock_guard<mutex> guard(m);
     554            boost::shared_lock<shared_mutex> guard(m);
    551555            return threads.size();
    552556        }
    553557       
    554558    private:
    555559        std::list<thread*> threads;
    556         mutable mutex m;
     560        mutable shared_mutex m;
    557561    };
    558562}
    559563