From 7e507d1b230245b4416eb3649737402fabd73d7b Mon Sep 17 00:00:00 2001 From: bkoz Date: Fri, 13 Feb 2009 23:08:50 +0000 Subject: 2009-02-13 Chris Fairles Benjamin Kosnik * include/std/thread (_Impl_base): Move _M_id out and into ... (thread): ...here. Call _M_make_routine in body of constructors. Adjust data member usage to reflect changes. (_M_make_routine): From _M_make_shared_data. (_M_start_thread): Add __shared_base_type argument. * src/thread.cc: Fixups for above. * config/abi/pre/gnu.ver: Adjust exports. * testsuite/30_threads/thread/native_handle/typesizes.cc: Enable. * testsuite/30_threads/thread/cons/assign_neg.cc: Adjust line numbers. * testsuite/30_threads/thread/cons/copy_neg.cc: Same. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@144171 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/include/std/thread | 50 +++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 30 deletions(-) (limited to 'libstdc++-v3/include') diff --git a/libstdc++-v3/include/std/thread b/libstdc++-v3/include/std/thread index b527d59caf7..8cd0e3a230f 100644 --- a/libstdc++-v3/include/std/thread +++ b/libstdc++-v3/include/std/thread @@ -57,14 +57,14 @@ namespace std class thread { public: - typedef __gthread_t native_handle_type; + typedef __gthread_t native_handle_type; struct _Impl_base; typedef shared_ptr<_Impl_base> __shared_base_type; /// thread::id class id { - native_handle_type _M_thread; + native_handle_type _M_thread; public: id() : _M_thread() { } @@ -88,35 +88,31 @@ namespace std operator<<(basic_ostream<_CharT, _Traits>&& __out, thread::id __id); }; + // Simple base type that the templatized, derived class containing + // an abitrary functor can be converted to and called. struct _Impl_base { - id _M_id; - __shared_base_type _M_this_ptr; - - _Impl_base() = default; + __shared_base_type _M_this_ptr; virtual ~_Impl_base() = default; - virtual void - _M_run() = 0; + virtual void _M_run() = 0; }; template - class _Impl : public _Impl_base + struct _Impl : public _Impl_base { - _Callable _M_func; + _Callable _M_func; - public: _Impl(_Callable&& __f) : _M_func(std::forward<_Callable>(__f)) { } - void + void _M_run() { _M_func(); } }; private: - // NB: Store the base type here. - __shared_base_type _M_data; + id _M_id; public: thread() = default; @@ -127,13 +123,11 @@ namespace std template explicit thread(_Callable __f) - : _M_data(_M_make_shared_data<_Callable>(__f)) - { _M_start_thread(); } + { _M_start_thread(_M_make_routine<_Callable>(__f)); } template thread(_Callable&& __f, _Args&&... __args) - : _M_data(_M_make_shared_data(std::bind(__f, __args...))) - { _M_start_thread(); } + { _M_start_thread(_M_make_routine(std::bind(__f, __args...))); } ~thread() { @@ -153,11 +147,11 @@ namespace std void swap(thread&& __t) - { std::swap(_M_data, __t._M_data); } + { std::swap(_M_id, __t._M_id); } bool joinable() const - { return _M_data; } + { return !(_M_id == id()); } void join(); @@ -167,18 +161,13 @@ namespace std thread::id get_id() const - { - if (_M_data) - return thread::id(_M_data->_M_id._M_thread); - else - return thread::id(); - } + { return _M_id; } /** @pre thread is joinable */ native_handle_type native_handle() - { return _M_data->_M_id._M_thread; } + { return _M_id._M_thread; } // Returns a value that hints at the number of hardware thread contexts. static unsigned int @@ -186,15 +175,16 @@ namespace std { return 0; } private: + void + _M_start_thread(__shared_base_type); + template shared_ptr<_Impl<_Callable>> - _M_make_shared_data(_Callable&& __f) + _M_make_routine(_Callable&& __f) { // Create and allocate full data structure, not base. return make_shared<_Impl<_Callable>>(std::forward<_Callable>(__f)); } - - void _M_start_thread(); }; inline void -- cgit v1.2.3