mt_allocator.h (__mt_alloc<>::deallocate): Rearrange arithmetic to avoid computing...
authorPaolo Carlini <pcarlini@suse.de>
Fri, 2 Apr 2004 19:51:21 +0000 (19:51 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 2 Apr 2004 19:51:21 +0000 (19:51 +0000)
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
libstdc++-v3/include/ext/mt_allocator.h

index b47d26e0a3dee4c0084f2766aaee489830ea9040..3248c3243bcaf963f97320efb3cbb1abe7a48ea3 100644 (file)
@@ -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):
index 8edbaaaf50fb7fddfff82ba4da31bac79c046f1f..d69b0e1ebd9152c1ac9246d4b3d7190ca1f73ac0 100644 (file)
@@ -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;