This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[v3] thread impl shrinkage


... Re-jiggers the thread implementation classes to hit the desired
size/alignment goals. Then, activates this test in the testsuite.

tested x86_64/linux

-benjamin

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.


Index: src/thread.cc
===================================================================
--- src/thread.cc	(revision 144170)
+++ src/thread.cc	(working copy)
@@ -61,16 +61,16 @@
   {
     int __e = EINVAL;
 
-    if (_M_data)
+    if (_M_id != id())
     {
       void* __r = 0;
-      __e = __gthread_join(_M_data->_M_id._M_thread, &__r);
+      __e = __gthread_join(_M_id._M_thread, &__r);
     }
 
     if (__e)
       __throw_system_error(__e);
 
-    _M_data.reset();
+    _M_id = id();
   }
 
   void
@@ -78,24 +78,24 @@
   {
     int __e = EINVAL;
 
-    if (_M_data)
-      __e = __gthread_detach(_M_data->_M_id._M_thread);
+    if (_M_id != id())
+      __e = __gthread_detach(_M_id._M_thread);
 
     if (__e)
       __throw_system_error(__e);
 
-    _M_data.reset();
+    _M_id = id();
   }
 
   void
-  thread::_M_start_thread()
+  thread::_M_start_thread(__shared_base_type __b)
   {
-    _M_data->_M_this_ptr = _M_data;
-    int __e = __gthread_create(&_M_data->_M_id._M_thread,
-			       &execute_native_thread_routine, _M_data.get());
+    __b->_M_this_ptr = __b;
+    int __e = __gthread_create(&_M_id._M_thread,
+			       &execute_native_thread_routine, __b.get());
     if (__e)
     {
-      _M_data->_M_this_ptr.reset();
+      __b->_M_this_ptr.reset();
       __throw_system_error(__e);
     }
   }
Index: include/std/thread
===================================================================
--- include/std/thread	(revision 144170)
+++ include/std/thread	(working copy)
@@ -57,14 +57,14 @@
   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 @@
 	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;
+      __shared_base_type	_M_this_ptr;
 
-      _Impl_base() = default;
-
       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 @@
 
     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 @@
 
     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 @@
 
     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 @@
     { 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
Index: testsuite/30_threads/thread/native_handle/typesizes.cc
===================================================================
--- testsuite/30_threads/thread/native_handle/typesizes.cc	(revision 144170)
+++ testsuite/30_threads/thread/native_handle/typesizes.cc	(working copy)
@@ -29,7 +29,6 @@
 int main()
 {
   typedef std::thread test_type;
-  // XX disable for now
-  //__gnu_test::compare_type_to_native_type<test_type>();
+  __gnu_test::compare_type_to_native_type<test_type>();
   return 0;
 }
Index: testsuite/30_threads/thread/cons/assign_neg.cc
===================================================================
--- testsuite/30_threads/thread/cons/assign_neg.cc	(revision 144170)
+++ testsuite/30_threads/thread/cons/assign_neg.cc	(working copy)
@@ -33,4 +33,4 @@
 }
 
 // { dg-error "used here" "" { target *-*-* } 32 }
-// { dg-error "deleted function" "" { target *-*-* } 144 }
+// { dg-error "deleted function" "" { target *-*-* } 138 }
Index: testsuite/30_threads/thread/cons/copy_neg.cc
===================================================================
--- testsuite/30_threads/thread/cons/copy_neg.cc	(revision 144170)
+++ testsuite/30_threads/thread/cons/copy_neg.cc	(working copy)
@@ -32,5 +32,5 @@
 }
 
 // { dg-error "here" "" { target *-*-* } 31 }
-// { dg-error "deleted function" "" { target *-*-* } 123 }
+// { dg-error "deleted function" "" { target *-*-* } 119 }
 // { dg-excess-errors "In file included from" }
Index: config/abi/pre/gnu.ver
===================================================================
--- config/abi/pre/gnu.ver	(revision 144170)
+++ config/abi/pre/gnu.ver	(working copy)
@@ -897,9 +897,9 @@
     _ZNSt22condition_variable_anyD2Ev;
 
     # thread
-    _ZNSt6thread15_M_start_threadEv;
     _ZNSt6thread4joinEv;
     _ZNSt6thread6detachEv;
+    _ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE;
 
     # system_error
     _ZSt15system_category;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]