diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 3248c3243bcaf963f97320efb3cbb1abe7a48ea3..39cfd05674a196a652ffd267e2f6a1710ec2147d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,15 @@ +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> * include/ext/mt_allocator.h (__mt_alloc<>::deallocate): diff --git a/libstdc++-v3/include/ext/mt_allocator.h b/libstdc++-v3/include/ext/mt_allocator.h index d69b0e1ebd9152c1ac9246d4b3d7190ca1f73ac0..401fc3f0d45ab7abdaf8c0befe88f1572ceb9dd2 100644 --- a/libstdc++-v3/include/ext/mt_allocator.h +++ b/libstdc++-v3/include/ext/mt_allocator.h @@ -228,8 +228,8 @@ namespace __gnu_cxx // Points to the block_record of the next free block. _Block_record* volatile _M_next; - // The thread id of the thread which has requested this block. #ifdef __GTHREADS + // The thread id of the thread which has requested this block. size_t _M_thread_id; #endif }; @@ -241,6 +241,7 @@ namespace __gnu_cxx // for _S_max_threads + global pool 0. _Block_record** volatile _M_first; +#ifdef __GTHREADS // An "array" of counters used to keep track of the amount of // blocks that are on the freelist/used for each thread id. // Memory to these "arrays" is allocated in _S_initialize() for @@ -251,7 +252,6 @@ namespace __gnu_cxx // Each bin has its own mutex which is used to ensure data // integrity while changing "ownership" on a block. The mutex // is initialized in _S_initialize(). -#ifdef __GTHREADS __gthread_mutex_t* _M_mutex; #endif }; @@ -359,14 +359,6 @@ namespace __gnu_cxx } __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 #endif @@ -384,28 +376,20 @@ namespace __gnu_cxx --__block_count; } __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]; - __bin._M_first[__thread_id] = __bin._M_first[__thread_id]->_M_next; + __block = __bin._M_first[__thread_id]; + __bin._M_first[__thread_id] = __bin._M_first[__thread_id]->_M_next; #ifdef __GTHREADS - if (__gthread_active_p()) - { - __block->_M_thread_id = __thread_id; - --__bin._M_free[__thread_id]; - ++__bin._M_used[__thread_id]; - } -#endif + if (__gthread_active_p()) + { + __block->_M_thread_id = __thread_id; + --__bin._M_free[__thread_id]; + ++__bin._M_used[__thread_id]; } +#endif + char* __c = reinterpret_cast<char*>(__block) + sizeof(_Block_record); return static_cast<_Tp*>(static_cast<void*>(__c)); } diff --git a/libstdc++-v3/testsuite/performance/20_util/allocator/list_sort_search.cc b/libstdc++-v3/testsuite/performance/20_util/allocator/list_sort_search.cc index f39e814752aaaa7df66050940e34283d2b5cef8a..317a615b4362a621bb845de8cff37d6f631c32ef 100644 --- a/libstdc++-v3/testsuite/performance/20_util/allocator/list_sort_search.cc +++ b/libstdc++-v3/testsuite/performance/20_util/allocator/list_sort_search.cc @@ -116,10 +116,10 @@ int main () do_test<malloc_allocator<int> >(); #endif #ifdef TEST_S2 - do_test<bitmap_allocator<int> >(); + do_test<__mt_alloc<int> >(); #endif #ifdef TEST_S3 - do_test<__mt_alloc<int> >(); + do_test<bitmap_allocator<int> >(); #endif #ifdef TEST_S4 do_test<__pool_alloc<int> >(); diff --git a/libstdc++-v3/testsuite/performance/20_util/allocator/map_mt_find.cc b/libstdc++-v3/testsuite/performance/20_util/allocator/map_mt_find.cc index 35bba56e473bdc2597bd56bde19ea19a4b39ecd7..2ee20f23d687886ab20bd2a475bb513665d48316 100644 --- a/libstdc++-v3/testsuite/performance/20_util/allocator/map_mt_find.cc +++ b/libstdc++-v3/testsuite/performance/20_util/allocator/map_mt_find.cc @@ -142,10 +142,10 @@ int main() exec_tests<malloc_allocator<int> >(); #endif #ifdef TEST_T2 - exec_tests<bitmap_allocator<int> >(); + exec_tests<__mt_alloc<int> >(); #endif #ifdef TEST_T3 - exec_tests<__mt_alloc<int> >(); + exec_tests<bitmap_allocator<int> >(); #endif #ifdef TEST_T4 exec_tests<__pool_alloc<int> >(); diff --git a/libstdc++-v3/testsuite/performance/20_util/allocator/map_thread.cc b/libstdc++-v3/testsuite/performance/20_util/allocator/map_thread.cc index 667d50b171e4b092758cd62c82b69de92bb91e4e..c9cf34c6096218523b10a69e4f63ca2811c3a997 100644 --- a/libstdc++-v3/testsuite/performance/20_util/allocator/map_thread.cc +++ b/libstdc++-v3/testsuite/performance/20_util/allocator/map_thread.cc @@ -111,23 +111,23 @@ template<typename Container> int main(void) { -#ifdef TEST_T1 +#ifdef TEST_T0 test_container(map<int, int>()); #endif -#ifdef TEST_T2 +#ifdef TEST_T1 test_container(map<int, int, less<const int>, new_allocator<int> >()); #endif -#ifdef TEST_T3 +#ifdef TEST_T2 test_container(map<int, int, less<const int>, malloc_allocator<int> >()); #endif -#ifdef TEST_T4 +#ifdef TEST_T3 test_container(map<int, int, less<const int>, __mt_alloc< pair<const int, int> > >()); #endif -#ifdef TEST_T5 +#ifdef TEST_T4 test_container(map<int, int, less<const int>, bitmap_allocator<int> >()); #endif -#ifdef TEST_T6 +#ifdef TEST_T5 test_container(map<int, int, less<const int>, __pool_alloc<int> >()); #endif return 0; diff --git a/libstdc++-v3/testsuite/performance/20_util/allocator/producer_consumer.cc b/libstdc++-v3/testsuite/performance/20_util/allocator/producer_consumer.cc index 4e13a5cc0b2f6f9c0fb3e0213212b36fb2309fee..98f39c19709f685a7c4434a38ad4f38f2451dd16 100644 --- a/libstdc++-v3/testsuite/performance/20_util/allocator/producer_consumer.cc +++ b/libstdc++-v3/testsuite/performance/20_util/allocator/producer_consumer.cc @@ -290,51 +290,51 @@ template<typename Container> int main(void) { -#ifdef TEST_T1 +#ifdef TEST_T0 test_container(vector<test_type, malloc_alloc_type>()); #endif -#ifdef TEST_T2 +#ifdef TEST_T1 test_container(vector<test_type, new_alloc_type>()); #endif -#ifdef TEST_T3 +#ifdef TEST_T2 test_container(vector<test_type, so_alloc_type>()); #endif -#ifdef TEST_T4 +#ifdef TEST_T3 test_container(vector<test_type, bit_alloc_type>()); #endif -#ifdef TEST_T5 +#ifdef TEST_T4 test_container(vector<test_type, po_alloc_type>()); #endif -#ifdef TEST_T6 +#ifdef TEST_T5 test_container(list<test_type, malloc_alloc_type>()); #endif -#ifdef TEST_T7 +#ifdef TEST_T6 test_container(list<test_type, new_alloc_type>()); #endif -#ifdef TEST_T8 +#ifdef TEST_T7 test_container(list<test_type, so_alloc_type>()); #endif -#ifdef TEST_T9 +#ifdef TEST_T8 test_container(list<test_type, bit_alloc_type>()); #endif -#ifdef TEST_T10 +#ifdef TEST_T9 test_container(list<test_type, po_alloc_type>()); #endif -#ifdef TEST_T11 +#ifdef TEST_T10 test_container(map<test_type, test_type, compare_type, malloc_alloc_type>()); #endif -#ifdef TEST_T12 +#ifdef TEST_T11 test_container(map<test_type, test_type, compare_type, new_alloc_type>()); #endif -#ifdef TEST_T13 +#ifdef TEST_T12 test_container(map<test_type, test_type, compare_type, so_alloc_type>()); #endif -#ifdef TEST_T14 +#ifdef TEST_T13 test_container(map<test_type, test_type, compare_type, bit_alloc_type>()); #endif -#ifdef TEST_T15 +#ifdef TEST_T14 test_container(map<test_type, test_type, compare_type, po_alloc_type>()); #endif