mt_allocator.h (__mt_alloc<>::deallocate): The critical section is actually very...
authorPaolo Carlini <pcarlini@suse.de>
Mon, 5 Apr 2004 22:46:04 +0000 (22:46 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 5 Apr 2004 22:46:04 +0000 (22:46 +0000)
2004-04-05  Paolo Carlini  <pcarlini@suse.de>

* include/ext/mt_allocator.h (__mt_alloc<>::deallocate):
The critical section is actually very small, only two assignments.

From-SVN: r80439

libstdc++-v3/ChangeLog
libstdc++-v3/include/ext/mt_allocator.h

index 8ff1d83..5843ccf 100644 (file)
@@ -1,3 +1,8 @@
+2004-04-05  Paolo Carlini  <pcarlini@suse.de>
+
+       * include/ext/mt_allocator.h (__mt_alloc<>::deallocate):
+       The critical section is actually very small, only two assignments.
+
 2004-04-04  Paolo Carlini  <pcarlini@suse.de>
            Petur Runolfsson  <peturr02@ru.is>
 
index 401fc3f..0b17aa2 100644 (file)
@@ -430,20 +430,18 @@ namespace __gnu_cxx
                                           * _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;
              __remove /= _S_options._M_freelist_headroom;
              const long __removed = __remove;
-             while (__remove > 1)
-               {
-                 __tmp = __tmp->_M_next;
-                 --__remove;
-               }
+             while (__remove-- > 1)
+               __tmp = __tmp->_M_next;
              __bin._M_first[__thread_id] = __tmp->_M_next;
+             __bin._M_free[__thread_id] -= __removed;
+
+             __gthread_mutex_lock(__bin._M_mutex);
              __tmp->_M_next = __bin._M_first[0];
              __bin._M_first[0] = __first;
-             __bin._M_free[__thread_id] -= __removed;
              __gthread_mutex_unlock(__bin._M_mutex);
            }