+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):
// 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
};
// 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
// 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
};
}
__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
--__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));
}
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> >();
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> >();
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;
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