summaryrefslogtreecommitdiffstats
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-05-16 17:01:40 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-05-16 17:01:40 +0000
commita4cc5e2c2e6675e900e7a272287b4a9c2c204734 (patch)
treec76fe30a15affefc1d7002c578e700a73621d44c /libstdc++-v3
parent31b1f24d82db2176b3cdd4069e3eb8e99ad18b4b (diff)
downloadppe42-gcc-a4cc5e2c2e6675e900e7a272287b4a9c2c204734.tar.gz
ppe42-gcc-a4cc5e2c2e6675e900e7a272287b4a9c2c204734.zip
2004-05-16 Paolo Carlini <pcarlini@suse.de>
* include/ext/mt_allocator.h (__mt_alloc<>::deallocate): Consistently update __bin._M_free[0]. (__mt_alloc<>::allocate): When __bin._M_first[0] != NULL use __bin._M_free[0] to simplify the while loop (i.e., the number of iterations becomes known at the outset). git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@81916 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/include/ext/mt_allocator.h55
2 files changed, 37 insertions, 26 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index bb7f593732f..2458a14754e 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,11 @@
+2004-05-16 Paolo Carlini <pcarlini@suse.de>
+
+ * include/ext/mt_allocator.h (__mt_alloc<>::deallocate):
+ Consistently update __bin._M_free[0].
+ (__mt_alloc<>::allocate): When __bin._M_first[0] != NULL use
+ __bin._M_free[0] to simplify the while loop (i.e., the number
+ of iterations becomes known at the outset).
+
2004-05-15 Paolo Carlini <pcarlini@suse.de>
* include/std/std_bitset.h: Trivial formatting fixes.
diff --git a/libstdc++-v3/include/ext/mt_allocator.h b/libstdc++-v3/include/ext/mt_allocator.h
index 0b17aa2d209..1fc0ccbca0e 100644
--- a/libstdc++-v3/include/ext/mt_allocator.h
+++ b/libstdc++-v3/include/ext/mt_allocator.h
@@ -148,19 +148,21 @@ namespace __gnu_cxx
// Set to true forces all allocations to use new().
bool _M_force_new;
- explicit _Tune()
+ explicit
+ _Tune()
: _M_max_bytes(128), _M_min_bin(8),
_M_chunk_size(4096 - 4 * sizeof(void*)),
_M_max_threads(4096), _M_freelist_headroom(10),
- _M_force_new(getenv("GLIBCXX_FORCE_NEW") ? true : false)
- { }
+ _M_force_new(getenv("GLIBCXX_FORCE_NEW") ? true : false)
+ { }
- explicit _Tune(size_t __maxb, size_t __minbin, size_t __chunk,
- size_t __maxthreads, size_t __headroom, bool __force)
+ explicit
+ _Tune(size_t __maxb, size_t __minbin, size_t __chunk,
+ size_t __maxthreads, size_t __headroom, bool __force)
: _M_max_bytes(__maxb), _M_min_bin(__minbin), _M_chunk_size(__chunk),
_M_max_threads(__maxthreads), _M_freelist_headroom(__headroom),
_M_force_new(__force)
- { }
+ { }
};
private:
@@ -330,34 +332,33 @@ namespace __gnu_cxx
void* __v = ::operator new(_S_options._M_chunk_size);
__bin._M_first[__thread_id] = static_cast<_Block_record*>(__v);
- __bin._M_free[__thread_id] = __block_count;
+ __bin._M_free[__thread_id] = __block_count;
--__block_count;
__block = __bin._M_first[__thread_id];
- while (__block_count > 0)
+ while (__block_count-- > 0)
{
char* __c = reinterpret_cast<char*>(__block) + __bin_size;
__block->_M_next = reinterpret_cast<_Block_record*>(__c);
__block = __block->_M_next;
- --__block_count;
}
- __block->_M_next = NULL;
}
else
{
- while (__bin._M_first[0] != NULL && __block_count > 0)
- {
- _Block_record* __tmp = __bin._M_first[0]->_M_next;
- __block = __bin._M_first[0];
-
- __block->_M_next = __bin._M_first[__thread_id];
- __bin._M_first[__thread_id] = __block;
-
- ++__bin._M_free[__thread_id];
- __bin._M_first[0] = __tmp;
- --__block_count;
- }
+ if (__block_count > __bin._M_free[0])
+ __block_count = __bin._M_free[0];
+ const size_t __added = __block_count;
+ _Block_record* __first = __bin._M_first[0];
+ __block = __first;
+ --__block_count;
+ while (__block_count-- > 0)
+ __block = __block->_M_next;
+ __bin._M_first[0] = __block->_M_next;
+ __bin._M_free[0] -= __added;
__gthread_mutex_unlock(__bin._M_mutex);
+
+ __bin._M_first[__thread_id] = __first;
+ __bin._M_free[__thread_id] += __added;
}
}
else
@@ -368,15 +369,15 @@ namespace __gnu_cxx
--__block_count;
__block = __bin._M_first[0];
- while (__block_count > 0)
+ while (__block_count-- > 0)
{
char* __c = reinterpret_cast<char*>(__block) + __bin_size;
__block->_M_next = reinterpret_cast<_Block_record*>(__c);
__block = __block->_M_next;
- --__block_count;
}
- __block->_M_next = NULL;
}
+
+ __block->_M_next = NULL;
}
__block = __bin._M_first[__thread_id];
@@ -434,7 +435,8 @@ namespace __gnu_cxx
_Block_record* __first = __tmp;
__remove /= _S_options._M_freelist_headroom;
const long __removed = __remove;
- while (__remove-- > 1)
+ --__remove;
+ while (__remove-- > 0)
__tmp = __tmp->_M_next;
__bin._M_first[__thread_id] = __tmp->_M_next;
__bin._M_free[__thread_id] -= __removed;
@@ -442,6 +444,7 @@ namespace __gnu_cxx
__gthread_mutex_lock(__bin._M_mutex);
__tmp->_M_next = __bin._M_first[0];
__bin._M_first[0] = __first;
+ __bin._M_free[0] += __removed;
__gthread_mutex_unlock(__bin._M_mutex);
}
OpenPOWER on IntegriCloud