This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ 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]

Re: [Patch] Streamline __mt_alloc::_S_initialize


Oops!

Paolo.

///////////
2004-04-01  Paolo Carlini  <pcarlini@suse.de>

	* include/ext/mt_allocator.h (__mt_alloc<>::_S_initialize):
	Streamline the second half, wrapping it in a single
	'#ifdef __GTHREADS if (__gthread_active_p())' and avoiding
	conditionals inside loops.
diff -urN libstdc++-v3-orig/include/ext/mt_allocator.h libstdc++-v3/include/ext/mt_allocator.h
--- libstdc++-v3-orig/include/ext/mt_allocator.h	2004-03-27 11:15:49.000000000 +0100
+++ libstdc++-v3/include/ext/mt_allocator.h	2004-04-01 17:21:33.000000000 +0200
@@ -151,12 +151,7 @@
 	explicit _Tune()
 	: _M_max_bytes(128), _M_min_bin(8),
 	  _M_chunk_size(4096 - 4 * sizeof(void*)), 
-#ifdef __GTHREADS
-	  _M_max_threads(4096), 
-#else
-	  _M_max_threads(0), 
-#endif
-	  _M_freelist_headroom(10), 
+	  _M_max_threads(4096), _M_freelist_headroom(10), 
 	  _M_force_new(getenv("GLIBCXX_FORCE_NEW") ? true : false) 
 	{ }      
 
@@ -230,7 +225,7 @@
 
       union _Block_record
       {
-	// Points to the next block_record for its thread_id.
+	// Points to the block_record of the next free block.
         _Block_record* volatile         _M_next;
 
 	// The thread id of the thread which has requested this block.
@@ -522,10 +517,13 @@
           *__bp++ = __bint;
         }
 
+      // Initialize _S_bin and its members.
+      void* __v = ::operator new(sizeof(_Bin_record) * _S_bin_size);
+      _S_bin = static_cast<_Bin_record*>(__v);
+
       // If __gthread_active_p() create and initialize the list of
       // free thread ids. Single threaded applications use thread id 0
       // directly and have no need for this.
-      void* __v;
 #ifdef __GTHREADS
       if (__gthread_active_p())
         {
@@ -554,29 +552,14 @@
           // Initialize per thread key to hold pointer to
           // _S_thread_freelist.
           __gthread_key_create(&_S_thread_key, _S_destroy_thread_key);
-        }
-#endif
 
-      // Initialize _S_bin and its members.
-      __v = ::operator new(sizeof(_Bin_record) * _S_bin_size);
-      _S_bin = static_cast<_Bin_record*>(__v);
-	
-      // Maximum number of threads. 
-      size_t __max_threads = 1;
-#ifdef __GTHREADS
-      if (__gthread_active_p())
-        __max_threads = _S_options._M_max_threads + 1;
-#endif
-
-      for (size_t __n = 0; __n < _S_bin_size; ++__n)
-        {
-	  _Bin_record& __bin = _S_bin[__n];
-	  __v = ::operator new(sizeof(_Block_record*) * __max_threads);
-          __bin._M_first = static_cast<_Block_record**>(__v);
+	  const size_t __max_threads = _S_options._M_max_threads + 1;
+	  for (size_t __n = 0; __n < _S_bin_size; ++__n)
+	    {
+	      _Bin_record& __bin = _S_bin[__n];
+	      __v = ::operator new(sizeof(_Block_record*) * __max_threads);
+	      __bin._M_first = static_cast<_Block_record**>(__v);
 
-#ifdef __GTHREADS
-          if (__gthread_active_p())
-            {
 	      __v = ::operator new(sizeof(size_t) * __max_threads);
               __bin._M_free = static_cast<size_t*>(__v);
 
@@ -595,21 +578,26 @@
 #else
               { __GTHREAD_MUTEX_INIT_FUNCTION(__bin._M_mutex); }
 #endif
-            }
-#endif
 
-          for (size_t __threadn = 0; __threadn < __max_threads; ++__threadn)
-            {
-              __bin._M_first[__threadn] = NULL;
-#ifdef __GTHREADS
-              if (__gthread_active_p())
-                {
-                  __bin._M_free[__threadn] = 0;
-                  __bin._M_used[__threadn] = 0;
-                }
-#endif
-            }
-        }
+	      for (size_t __threadn = 0; __threadn < __max_threads;
+		   ++__threadn)
+		{
+		  __bin._M_first[__threadn] = NULL;
+		  __bin._M_free[__threadn] = 0;
+		  __bin._M_used[__threadn] = 0;
+		}
+	    }
+	}
+      else
+#endif	
+	for (size_t __n = 0; __n < _S_bin_size; ++__n)
+	  {
+	    _Bin_record& __bin = _S_bin[__n];
+	    __v = ::operator new(sizeof(_Block_record*));
+	    __bin._M_first = static_cast<_Block_record**>(__v);
+	    __bin._M_first[0] = NULL;
+	  }
+
       _S_init = true;
     }
 

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