annotate DEPENDENCIES/generic/include/boost/thread/detail/thread_group.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 #ifndef BOOST_THREAD_DETAIL_THREAD_GROUP_HPP
Chris@16 2 #define BOOST_THREAD_DETAIL_THREAD_GROUP_HPP
Chris@16 3 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 4 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 5 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 6 // (C) Copyright 2007-9 Anthony Williams
Chris@16 7
Chris@16 8 #include <list>
Chris@16 9 #include <boost/thread/shared_mutex.hpp>
Chris@16 10 #include <boost/thread/mutex.hpp>
Chris@16 11 #include <boost/thread/lock_guard.hpp>
Chris@16 12
Chris@16 13 #include <boost/config/abi_prefix.hpp>
Chris@16 14
Chris@16 15 #ifdef BOOST_MSVC
Chris@16 16 #pragma warning(push)
Chris@16 17 #pragma warning(disable:4251)
Chris@16 18 #endif
Chris@16 19
Chris@16 20 namespace boost
Chris@16 21 {
Chris@16 22 class thread_group
Chris@16 23 {
Chris@16 24 private:
Chris@16 25 thread_group(thread_group const&);
Chris@16 26 thread_group& operator=(thread_group const&);
Chris@16 27 public:
Chris@16 28 thread_group() {}
Chris@16 29 ~thread_group()
Chris@16 30 {
Chris@16 31 for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
Chris@16 32 it!=end;
Chris@16 33 ++it)
Chris@16 34 {
Chris@16 35 delete *it;
Chris@16 36 }
Chris@16 37 }
Chris@16 38
Chris@16 39 bool is_this_thread_in()
Chris@16 40 {
Chris@16 41 thread::id id = this_thread::get_id();
Chris@16 42 boost::shared_lock<shared_mutex> guard(m);
Chris@16 43 for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
Chris@16 44 it!=end;
Chris@16 45 ++it)
Chris@16 46 {
Chris@16 47 if ((*it)->get_id() == id)
Chris@16 48 return true;
Chris@16 49 }
Chris@16 50 return false;
Chris@16 51 }
Chris@16 52
Chris@16 53 bool is_thread_in(thread* thrd)
Chris@16 54 {
Chris@16 55 if(thrd)
Chris@16 56 {
Chris@16 57 thread::id id = thrd->get_id();
Chris@16 58 boost::shared_lock<shared_mutex> guard(m);
Chris@16 59 for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
Chris@16 60 it!=end;
Chris@16 61 ++it)
Chris@16 62 {
Chris@16 63 if ((*it)->get_id() == id)
Chris@16 64 return true;
Chris@16 65 }
Chris@16 66 return false;
Chris@16 67 }
Chris@16 68 else
Chris@16 69 {
Chris@16 70 return false;
Chris@16 71 }
Chris@16 72 }
Chris@16 73
Chris@16 74 template<typename F>
Chris@16 75 thread* create_thread(F threadfunc)
Chris@16 76 {
Chris@16 77 boost::lock_guard<shared_mutex> guard(m);
Chris@16 78 std::auto_ptr<thread> new_thread(new thread(threadfunc));
Chris@16 79 threads.push_back(new_thread.get());
Chris@16 80 return new_thread.release();
Chris@16 81 }
Chris@16 82
Chris@16 83 void add_thread(thread* thrd)
Chris@16 84 {
Chris@16 85 if(thrd)
Chris@16 86 {
Chris@16 87 BOOST_THREAD_ASSERT_PRECONDITION( ! is_thread_in(thrd) ,
Chris@101 88 thread_resource_error(static_cast<int>(system::errc::resource_deadlock_would_occur), "boost::thread_group: trying to add a duplicated thread")
Chris@16 89 );
Chris@16 90
Chris@16 91 boost::lock_guard<shared_mutex> guard(m);
Chris@16 92 threads.push_back(thrd);
Chris@16 93 }
Chris@16 94 }
Chris@16 95
Chris@16 96 void remove_thread(thread* thrd)
Chris@16 97 {
Chris@16 98 boost::lock_guard<shared_mutex> guard(m);
Chris@16 99 std::list<thread*>::iterator const it=std::find(threads.begin(),threads.end(),thrd);
Chris@16 100 if(it!=threads.end())
Chris@16 101 {
Chris@16 102 threads.erase(it);
Chris@16 103 }
Chris@16 104 }
Chris@16 105
Chris@16 106 void join_all()
Chris@16 107 {
Chris@16 108 BOOST_THREAD_ASSERT_PRECONDITION( ! is_this_thread_in() ,
Chris@101 109 thread_resource_error(static_cast<int>(system::errc::resource_deadlock_would_occur), "boost::thread_group: trying joining itself")
Chris@16 110 );
Chris@16 111 boost::shared_lock<shared_mutex> guard(m);
Chris@16 112
Chris@16 113 for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
Chris@16 114 it!=end;
Chris@16 115 ++it)
Chris@16 116 {
Chris@16 117 if ((*it)->joinable())
Chris@16 118 (*it)->join();
Chris@16 119 }
Chris@16 120 }
Chris@16 121
Chris@16 122 #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
Chris@16 123 void interrupt_all()
Chris@16 124 {
Chris@16 125 boost::shared_lock<shared_mutex> guard(m);
Chris@16 126
Chris@16 127 for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
Chris@16 128 it!=end;
Chris@16 129 ++it)
Chris@16 130 {
Chris@16 131 (*it)->interrupt();
Chris@16 132 }
Chris@16 133 }
Chris@16 134 #endif
Chris@16 135
Chris@16 136 size_t size() const
Chris@16 137 {
Chris@16 138 boost::shared_lock<shared_mutex> guard(m);
Chris@16 139 return threads.size();
Chris@16 140 }
Chris@16 141
Chris@16 142 private:
Chris@16 143 std::list<thread*> threads;
Chris@16 144 mutable shared_mutex m;
Chris@16 145 };
Chris@16 146 }
Chris@16 147
Chris@16 148 #ifdef BOOST_MSVC
Chris@16 149 #pragma warning(pop)
Chris@16 150 #endif
Chris@16 151
Chris@16 152 #include <boost/config/abi_suffix.hpp>
Chris@16 153
Chris@16 154 #endif