From ab40b100d3e1676c60d3ccd0765a45736471beaf Mon Sep 17 00:00:00 2001
From: Paolo Carlini <pcarlini@suse.de>
Date: Fri, 2 Apr 2004 19:51:21 +0000
Subject: [PATCH] mt_allocator.h (__mt_alloc<>::deallocate): Rearrange
 arithmetic to avoid computing two divisions at each deallocation.

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

	* include/ext/mt_allocator.h (__mt_alloc<>::deallocate):
	Rearrange arithmetic to avoid computing two divisions at
	each deallocation.

From-SVN: r80356
---
 libstdc++-v3/ChangeLog                  |  6 ++++++
 libstdc++-v3/include/ext/mt_allocator.h | 26 ++++++++++++-------------
 2 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index b47d26e0a3de..3248c3243bca 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,9 @@
+2004-04-02  Paolo Carlini  <pcarlini@suse.de>
+
+	* include/ext/mt_allocator.h (__mt_alloc<>::deallocate):
+	Rearrange arithmetic to avoid computing two divisions at
+	each deallocation.
+
 2004-04-01  Paolo Carlini  <pcarlini@suse.de>
 
 	* include/ext/mt_allocator.h (__mt_alloc<>::_S_initialize):
diff --git a/libstdc++-v3/include/ext/mt_allocator.h b/libstdc++-v3/include/ext/mt_allocator.h
index 8edbaaaf50fb..d69b0e1ebd91 100644
--- a/libstdc++-v3/include/ext/mt_allocator.h
+++ b/libstdc++-v3/include/ext/mt_allocator.h
@@ -434,25 +434,23 @@ namespace __gnu_cxx
 #ifdef __GTHREADS
       if (__gthread_active_p())
 	{
-	  // Calculate the number of records to remove from our freelist.
+	  // Calculate the number of records to remove from our freelist:
+	  // in order to avoid too much contention we wait until the
+	  // number of records is "high enough".
 	  const size_t __thread_id = _S_get_thread_id();
-	  int __remove = (__bin._M_free[__thread_id]
-			  - (__bin._M_used[__thread_id]
-			     / _S_options._M_freelist_headroom));
-
-	  // The calculation above will almost always tell us to
-	  // remove one or two records at a time, but this creates too
-	  // much contention when locking and therefore we wait until
-	  // the number of records is "high enough".
-	  int __cond1 = static_cast<int>(100 * (_S_bin_size - __which));
-	  int __cond2 = static_cast<int>(__bin._M_free[__thread_id]
-					 / _S_options._M_freelist_headroom);
-	  if (__remove > __cond1 && __remove > __cond2)
+
+	  long __remove = ((__bin._M_free[__thread_id]
+			    * _S_options._M_freelist_headroom)
+			   - __bin._M_used[__thread_id]);
+	  if (__remove > static_cast<long>(100 * (_S_bin_size - __which)
+					   * _S_options._M_freelist_headroom)
+	      && __remove > static_cast<long>(__bin._M_free[__thread_id]))
 	    {
 	      __gthread_mutex_lock(__bin._M_mutex);
 	      _Block_record* __tmp = __bin._M_first[__thread_id];
 	      _Block_record* __first = __tmp;
-	      const int __removed = __remove;
+	      __remove /= _S_options._M_freelist_headroom;
+	      const long __removed = __remove;
 	      while (__remove > 1)
 		{
 		  __tmp = __tmp->_M_next;
-- 
GitLab