diff options
author | Benjamin Kosnik <bkoz@redhat.com> | 2004-10-06 16:31:19 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2004-10-06 16:31:19 +0000 |
commit | 8470634361b8847b54db3a20d15e3d2e5de2431c (patch) | |
tree | c9ecff4c550fca02d9673950e0c6ef37f49058ac | |
parent | 3b0cff13e448725520ea39925b69954365644567 (diff) | |
download | gcc-8470634361b8847b54db3a20d15e3d2e5de2431c.zip gcc-8470634361b8847b54db3a20d15e3d2e5de2431c.tar.gz gcc-8470634361b8847b54db3a20d15e3d2e5de2431c.tar.bz2 |
re PR libstdc++/17780 (std::allocator vs. static init)
2004-10-06 Benjamin Kosnik <bkoz@redhat.com>
Paolo Carlini <pcarlini@suse.de>
PR libstdc++/17780
* src/mt_allocator.cc (__pool<true>::_M_reserve_block): Revert
to old locking order.
Co-Authored-By: Paolo Carlini <pcarlini@suse.de>
From-SVN: r88611
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/src/mt_allocator.cc | 4 |
2 files changed, 10 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 9509eba..c87cda9 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2004-10-06 Benjamin Kosnik <bkoz@redhat.com> + Paolo Carlini <pcarlini@suse.de> + + PR libstdc++/17780 + * src/mt_allocator.cc (__pool<true>::_M_reserve_block): Revert + to old locking order. + 2004-10-06 Paolo Carlini <pcarlini@suse.de> * include/std/std_sstream.h (_M_sync): When the caller is diff --git a/libstdc++-v3/src/mt_allocator.cc b/libstdc++-v3/src/mt_allocator.cc index 066726b..1e45f4c 100644 --- a/libstdc++-v3/src/mt_allocator.cc +++ b/libstdc++-v3/src/mt_allocator.cc @@ -298,10 +298,13 @@ namespace __gnu_cxx _Block_record* __block = NULL; if (__gthread_active_p()) { + __gthread_mutex_lock(__bin._M_mutex); if (__bin._M_first[0] == NULL) { // No need to hold the lock when we are adding a whole // chunk to our own list. + __gthread_mutex_unlock(__bin._M_mutex); + void* __v = ::operator new(__options._M_chunk_size); __bin._M_first[__thread_id] = static_cast<_Block_record*>(__v); __bin._M_free[__thread_id] = __block_count; @@ -327,7 +330,6 @@ namespace __gnu_cxx // Is the number of required blocks greater than or equal // to the number that can be provided by the global free // list? - __gthread_mutex_lock(__bin._M_mutex); __bin._M_first[__thread_id] = __bin._M_first[0]; if (__block_count >= __bin._M_free[0]) { |