diff options
author | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-02-13 23:08:50 +0000 |
---|---|---|
committer | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-02-13 23:08:50 +0000 |
commit | 7e507d1b230245b4416eb3649737402fabd73d7b (patch) | |
tree | 6e674392fa11494d375b32c8b0725a6b0d0cc32d /libstdc++-v3/include | |
parent | a6f624bd60682f85db63c4513c2bd70aadd7e3c3 (diff) |
2009-02-13 Chris Fairles <cfairles@gcc.gnu.org>
Benjamin Kosnik <bkoz@redhat.com>
* 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
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/std/thread | 50 |
1 files changed, 20 insertions, 30 deletions
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<typename _Callable> - 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<typename _Callable> explicit thread(_Callable __f) - : _M_data(_M_make_shared_data<_Callable>(__f)) - { _M_start_thread(); } + { _M_start_thread(_M_make_routine<_Callable>(__f)); } template<typename _Callable, typename... _Args> 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<typename _Callable> 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 |