Commit c8333c0f by Paolo Carlini Committed by Paolo Carlini

mt_allocator.h (__mt_alloc<>::allocate): Factor out some duplicated code.

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

	* include/ext/mt_allocator.h (__mt_alloc<>::allocate): Factor out
	some duplicated code.
	(__mt_alloc<>::_Bin_record): Spare the space of _M_free and _M_used
	in the single threaded case.
	* testsuite/performance/20_util/allocator/list_sort_search.cc:
	Reorder and renumber the tests consistently with the other testfiles.
	* testsuite/performance/20_util/allocator/map_mt_find.cc: Ditto.
	* testsuite/performance/20_util/allocator/map_thread.cc: Ditto.
	* testsuite/performance/20_util/allocator/producer_consumer.cc: Ditto.

From-SVN: r80375
parent a0eabb87
2004-04-03 Paolo Carlini <pcarlini@suse.de>
* include/ext/mt_allocator.h (__mt_alloc<>::allocate): Factor out
some duplicated code.
(__mt_alloc<>::_Bin_record): Spare the space of _M_free and _M_used
in the single threaded case.
* testsuite/performance/20_util/allocator/list_sort_search.cc:
Reorder and renumber the tests consistently with the other testfiles.
* testsuite/performance/20_util/allocator/map_mt_find.cc: Ditto.
* testsuite/performance/20_util/allocator/map_thread.cc: Ditto.
* testsuite/performance/20_util/allocator/producer_consumer.cc: Ditto.
2004-04-02 Paolo Carlini <pcarlini@suse.de> 2004-04-02 Paolo Carlini <pcarlini@suse.de>
* include/ext/mt_allocator.h (__mt_alloc<>::deallocate): * include/ext/mt_allocator.h (__mt_alloc<>::deallocate):
......
...@@ -228,8 +228,8 @@ namespace __gnu_cxx ...@@ -228,8 +228,8 @@ namespace __gnu_cxx
// Points to the block_record of the next free block. // Points to the block_record of the next free block.
_Block_record* volatile _M_next; _Block_record* volatile _M_next;
// The thread id of the thread which has requested this block.
#ifdef __GTHREADS #ifdef __GTHREADS
// The thread id of the thread which has requested this block.
size_t _M_thread_id; size_t _M_thread_id;
#endif #endif
}; };
...@@ -241,6 +241,7 @@ namespace __gnu_cxx ...@@ -241,6 +241,7 @@ namespace __gnu_cxx
// for _S_max_threads + global pool 0. // for _S_max_threads + global pool 0.
_Block_record** volatile _M_first; _Block_record** volatile _M_first;
#ifdef __GTHREADS
// An "array" of counters used to keep track of the amount of // An "array" of counters used to keep track of the amount of
// blocks that are on the freelist/used for each thread id. // blocks that are on the freelist/used for each thread id.
// Memory to these "arrays" is allocated in _S_initialize() for // Memory to these "arrays" is allocated in _S_initialize() for
...@@ -251,7 +252,6 @@ namespace __gnu_cxx ...@@ -251,7 +252,6 @@ namespace __gnu_cxx
// Each bin has its own mutex which is used to ensure data // Each bin has its own mutex which is used to ensure data
// integrity while changing "ownership" on a block. The mutex // integrity while changing "ownership" on a block. The mutex
// is initialized in _S_initialize(). // is initialized in _S_initialize().
#ifdef __GTHREADS
__gthread_mutex_t* _M_mutex; __gthread_mutex_t* _M_mutex;
#endif #endif
}; };
...@@ -359,14 +359,6 @@ namespace __gnu_cxx ...@@ -359,14 +359,6 @@ namespace __gnu_cxx
} }
__gthread_mutex_unlock(__bin._M_mutex); __gthread_mutex_unlock(__bin._M_mutex);
} }
// Return the first newly added block in our list and
// update the counters
__block = __bin._M_first[__thread_id];
__bin._M_first[__thread_id] = __bin._M_first[__thread_id]->_M_next;
__block->_M_thread_id = __thread_id;
--__bin._M_free[__thread_id];
++__bin._M_used[__thread_id];
} }
else else
#endif #endif
...@@ -384,19 +376,11 @@ namespace __gnu_cxx ...@@ -384,19 +376,11 @@ namespace __gnu_cxx
--__block_count; --__block_count;
} }
__block->_M_next = NULL; __block->_M_next = NULL;
// Remove from list.
__block = __bin._M_first[0];
__bin._M_first[0] = __bin._M_first[0]->_M_next;
} }
} }
else
{
// "Default" operation - we have blocks on our own freelist
// grab the first record and update the counters.
__block = __bin._M_first[__thread_id]; __block = __bin._M_first[__thread_id];
__bin._M_first[__thread_id] = __bin._M_first[__thread_id]->_M_next; __bin._M_first[__thread_id] = __bin._M_first[__thread_id]->_M_next;
#ifdef __GTHREADS #ifdef __GTHREADS
if (__gthread_active_p()) if (__gthread_active_p())
{ {
...@@ -405,7 +389,7 @@ namespace __gnu_cxx ...@@ -405,7 +389,7 @@ namespace __gnu_cxx
++__bin._M_used[__thread_id]; ++__bin._M_used[__thread_id];
} }
#endif #endif
}
char* __c = reinterpret_cast<char*>(__block) + sizeof(_Block_record); char* __c = reinterpret_cast<char*>(__block) + sizeof(_Block_record);
return static_cast<_Tp*>(static_cast<void*>(__c)); return static_cast<_Tp*>(static_cast<void*>(__c));
} }
......
...@@ -116,10 +116,10 @@ int main () ...@@ -116,10 +116,10 @@ int main ()
do_test<malloc_allocator<int> >(); do_test<malloc_allocator<int> >();
#endif #endif
#ifdef TEST_S2 #ifdef TEST_S2
do_test<bitmap_allocator<int> >(); do_test<__mt_alloc<int> >();
#endif #endif
#ifdef TEST_S3 #ifdef TEST_S3
do_test<__mt_alloc<int> >(); do_test<bitmap_allocator<int> >();
#endif #endif
#ifdef TEST_S4 #ifdef TEST_S4
do_test<__pool_alloc<int> >(); do_test<__pool_alloc<int> >();
......
...@@ -142,10 +142,10 @@ int main() ...@@ -142,10 +142,10 @@ int main()
exec_tests<malloc_allocator<int> >(); exec_tests<malloc_allocator<int> >();
#endif #endif
#ifdef TEST_T2 #ifdef TEST_T2
exec_tests<bitmap_allocator<int> >(); exec_tests<__mt_alloc<int> >();
#endif #endif
#ifdef TEST_T3 #ifdef TEST_T3
exec_tests<__mt_alloc<int> >(); exec_tests<bitmap_allocator<int> >();
#endif #endif
#ifdef TEST_T4 #ifdef TEST_T4
exec_tests<__pool_alloc<int> >(); exec_tests<__pool_alloc<int> >();
......
...@@ -111,23 +111,23 @@ template<typename Container> ...@@ -111,23 +111,23 @@ template<typename Container>
int main(void) int main(void)
{ {
#ifdef TEST_T1 #ifdef TEST_T0
test_container(map<int, int>()); test_container(map<int, int>());
#endif #endif
#ifdef TEST_T2 #ifdef TEST_T1
test_container(map<int, int, less<const int>, new_allocator<int> >()); test_container(map<int, int, less<const int>, new_allocator<int> >());
#endif #endif
#ifdef TEST_T3 #ifdef TEST_T2
test_container(map<int, int, less<const int>, malloc_allocator<int> >()); test_container(map<int, int, less<const int>, malloc_allocator<int> >());
#endif #endif
#ifdef TEST_T4 #ifdef TEST_T3
test_container(map<int, int, less<const int>, test_container(map<int, int, less<const int>,
__mt_alloc< pair<const int, int> > >()); __mt_alloc< pair<const int, int> > >());
#endif #endif
#ifdef TEST_T5 #ifdef TEST_T4
test_container(map<int, int, less<const int>, bitmap_allocator<int> >()); test_container(map<int, int, less<const int>, bitmap_allocator<int> >());
#endif #endif
#ifdef TEST_T6 #ifdef TEST_T5
test_container(map<int, int, less<const int>, __pool_alloc<int> >()); test_container(map<int, int, less<const int>, __pool_alloc<int> >());
#endif #endif
return 0; return 0;
......
...@@ -290,51 +290,51 @@ template<typename Container> ...@@ -290,51 +290,51 @@ template<typename Container>
int main(void) int main(void)
{ {
#ifdef TEST_T1 #ifdef TEST_T0
test_container(vector<test_type, malloc_alloc_type>()); test_container(vector<test_type, malloc_alloc_type>());
#endif #endif
#ifdef TEST_T2 #ifdef TEST_T1
test_container(vector<test_type, new_alloc_type>()); test_container(vector<test_type, new_alloc_type>());
#endif #endif
#ifdef TEST_T3 #ifdef TEST_T2
test_container(vector<test_type, so_alloc_type>()); test_container(vector<test_type, so_alloc_type>());
#endif #endif
#ifdef TEST_T4 #ifdef TEST_T3
test_container(vector<test_type, bit_alloc_type>()); test_container(vector<test_type, bit_alloc_type>());
#endif #endif
#ifdef TEST_T5 #ifdef TEST_T4
test_container(vector<test_type, po_alloc_type>()); test_container(vector<test_type, po_alloc_type>());
#endif #endif
#ifdef TEST_T6 #ifdef TEST_T5
test_container(list<test_type, malloc_alloc_type>()); test_container(list<test_type, malloc_alloc_type>());
#endif #endif
#ifdef TEST_T7 #ifdef TEST_T6
test_container(list<test_type, new_alloc_type>()); test_container(list<test_type, new_alloc_type>());
#endif #endif
#ifdef TEST_T8 #ifdef TEST_T7
test_container(list<test_type, so_alloc_type>()); test_container(list<test_type, so_alloc_type>());
#endif #endif
#ifdef TEST_T9 #ifdef TEST_T8
test_container(list<test_type, bit_alloc_type>()); test_container(list<test_type, bit_alloc_type>());
#endif #endif
#ifdef TEST_T10 #ifdef TEST_T9
test_container(list<test_type, po_alloc_type>()); test_container(list<test_type, po_alloc_type>());
#endif #endif
#ifdef TEST_T11 #ifdef TEST_T10
test_container(map<test_type, test_type, compare_type, malloc_alloc_type>()); test_container(map<test_type, test_type, compare_type, malloc_alloc_type>());
#endif #endif
#ifdef TEST_T12 #ifdef TEST_T11
test_container(map<test_type, test_type, compare_type, new_alloc_type>()); test_container(map<test_type, test_type, compare_type, new_alloc_type>());
#endif #endif
#ifdef TEST_T13 #ifdef TEST_T12
test_container(map<test_type, test_type, compare_type, so_alloc_type>()); test_container(map<test_type, test_type, compare_type, so_alloc_type>());
#endif #endif
#ifdef TEST_T14 #ifdef TEST_T13
test_container(map<test_type, test_type, compare_type, bit_alloc_type>()); test_container(map<test_type, test_type, compare_type, bit_alloc_type>());
#endif #endif
#ifdef TEST_T15 #ifdef TEST_T14
test_container(map<test_type, test_type, compare_type, po_alloc_type>()); test_container(map<test_type, test_type, compare_type, po_alloc_type>());
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment