diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 3248c3243bc..39cfd05674a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,15 @@ +2004-04-03 Paolo Carlini + + * 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 * 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 d69b0e1ebd9..401fc3f0d45 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(__block) + sizeof(_Block_record); return static_cast<_Tp*>(static_cast(__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 f39e814752a..317a615b436 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 >(); #endif #ifdef TEST_S2 - do_test >(); + do_test<__mt_alloc >(); #endif #ifdef TEST_S3 - do_test<__mt_alloc >(); + do_test >(); #endif #ifdef TEST_S4 do_test<__pool_alloc >(); 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 35bba56e473..2ee20f23d68 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 >(); #endif #ifdef TEST_T2 - exec_tests >(); + exec_tests<__mt_alloc >(); #endif #ifdef TEST_T3 - exec_tests<__mt_alloc >(); + exec_tests >(); #endif #ifdef TEST_T4 exec_tests<__pool_alloc >(); 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 667d50b171e..c9cf34c6096 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 int main(void) { -#ifdef TEST_T1 +#ifdef TEST_T0 test_container(map()); #endif -#ifdef TEST_T2 +#ifdef TEST_T1 test_container(map, new_allocator >()); #endif -#ifdef TEST_T3 +#ifdef TEST_T2 test_container(map, malloc_allocator >()); #endif -#ifdef TEST_T4 +#ifdef TEST_T3 test_container(map, __mt_alloc< pair > >()); #endif -#ifdef TEST_T5 +#ifdef TEST_T4 test_container(map, bitmap_allocator >()); #endif -#ifdef TEST_T6 +#ifdef TEST_T5 test_container(map, __pool_alloc >()); #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 4e13a5cc0b2..98f39c19709 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 int main(void) { -#ifdef TEST_T1 +#ifdef TEST_T0 test_container(vector()); #endif -#ifdef TEST_T2 +#ifdef TEST_T1 test_container(vector()); #endif -#ifdef TEST_T3 +#ifdef TEST_T2 test_container(vector()); #endif -#ifdef TEST_T4 +#ifdef TEST_T3 test_container(vector()); #endif -#ifdef TEST_T5 +#ifdef TEST_T4 test_container(vector()); #endif -#ifdef TEST_T6 +#ifdef TEST_T5 test_container(list()); #endif -#ifdef TEST_T7 +#ifdef TEST_T6 test_container(list()); #endif -#ifdef TEST_T8 +#ifdef TEST_T7 test_container(list()); #endif -#ifdef TEST_T9 +#ifdef TEST_T8 test_container(list()); #endif -#ifdef TEST_T10 +#ifdef TEST_T9 test_container(list()); #endif -#ifdef TEST_T11 +#ifdef TEST_T10 test_container(map()); #endif -#ifdef TEST_T12 +#ifdef TEST_T11 test_container(map()); #endif -#ifdef TEST_T13 +#ifdef TEST_T12 test_container(map()); #endif -#ifdef TEST_T14 +#ifdef TEST_T13 test_container(map()); #endif -#ifdef TEST_T15 +#ifdef TEST_T14 test_container(map()); #endif