From 2913770f6f690c75e205fc9d25d266d4b1669641 Mon Sep 17 00:00:00 2001 From: Stefan Olsson Date: Thu, 15 Jan 2004 19:18:35 +0000 Subject: [PATCH] mt_allocator.h: Reuse thread id's as soon as possible by changing the behaviour of... 2004-01-15 Stefan Olsson * include/ext/mt_allocator.h: Reuse thread id's as soon as possible by changing the behaviour of thread_freelist to do push_front when threads die instead of push_back. From-SVN: r75939 --- libstdc++-v3/ChangeLog | 6 +++++ libstdc++-v3/include/ext/mt_allocator.h | 30 ++++++++++--------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index aac5acf3ef19..4ea985bd8aee 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2004-01-15 Stefan Olsson + + * include/ext/mt_allocator.h: Reuse thread id's as soon as + possible by changing the behaviour of thread_freelist to do + push_front when threads die instead of push_back. + 2004-01-14 Paolo Carlini * include/bits/locale_facets.h (struct __numpunct_cache): diff --git a/libstdc++-v3/include/ext/mt_allocator.h b/libstdc++-v3/include/ext/mt_allocator.h index 5b69e6375aef..b4498feddf3c 100644 --- a/libstdc++-v3/include/ext/mt_allocator.h +++ b/libstdc++-v3/include/ext/mt_allocator.h @@ -122,7 +122,7 @@ namespace __gnu_cxx #ifdef __GTHREADS static __gthread_once_t _S_once_mt; #endif - static bool _S_initialized; + static bool volatile _S_initialized; /* * Using short int as type for the binmap implies we are never caching @@ -151,7 +151,7 @@ namespace __gnu_cxx * memory we remove the first record in this list and stores the address * in a __gthread_key. When initializing the __gthread_key * we specify a destructor. When this destructor (i.e. the thread dies) - * is called, we return the thread id to the back of this list. + * is called, we return the thread id to the front of this list. */ #ifdef __GTHREADS struct thread_record @@ -159,7 +159,7 @@ namespace __gnu_cxx /* * Points to next free thread id record. NULL if last record in list. */ - thread_record* next; + thread_record* volatile next; /* * Thread id ranging from 1 to _S_max_threads. @@ -167,8 +167,7 @@ namespace __gnu_cxx size_t id; }; - static thread_record* _S_thread_freelist_first; - static thread_record* _S_thread_freelist_last; + static thread_record* volatile _S_thread_freelist_first; static __gthread_mutex_t _S_thread_freelist_mutex; static void _S_thread_key_destr(void* freelist_pos); static __gthread_key_t _S_thread_key; @@ -412,7 +411,7 @@ namespace __gnu_cxx { free(__p); return; - } + } /* * Round up to power of 2 and figure out which bin to use @@ -599,11 +598,10 @@ namespace __gnu_cxx } /* - * Set last record and pointer to this + * Set last record */ _S_thread_freelist_first[i - 1].next = NULL; _S_thread_freelist_first[i - 1].id = i; - _S_thread_freelist_last = &_S_thread_freelist_first[i - 1]; /* * Initialize per thread key to hold pointer to @@ -708,12 +706,11 @@ namespace __gnu_cxx } /* - * Return this thread id record to thread_freelist + * Return this thread id record to front of thread_freelist */ __gthread_mutex_lock(&_S_thread_freelist_mutex); - _S_thread_freelist_last->next = (thread_record*)freelist_pos; - _S_thread_freelist_last = (thread_record*)freelist_pos; - _S_thread_freelist_last->next = NULL; + ((thread_record*)freelist_pos)->next = _S_thread_freelist_first; + _S_thread_freelist_first = (thread_record*)freelist_pos; __gthread_mutex_unlock(&_S_thread_freelist_mutex); } @@ -730,7 +727,7 @@ namespace __gnu_cxx */ if (__gthread_active_p()) { - thread_record* freelist_pos; + thread_record* volatile freelist_pos; if ((freelist_pos = (thread_record*)__gthread_getspecific(_S_thread_key)) == NULL) @@ -778,7 +775,7 @@ namespace __gnu_cxx #endif template bool - __mt_alloc<_Tp>::_S_initialized = false; + volatile __mt_alloc<_Tp>::_S_initialized = false; template typename __mt_alloc<_Tp>::binmap_type* __mt_alloc<_Tp>::_S_binmap = NULL; @@ -829,10 +826,7 @@ namespace __gnu_cxx */ #ifdef __GTHREADS template typename __mt_alloc<_Tp>::thread_record* - __mt_alloc<_Tp>::_S_thread_freelist_first = NULL; - - template typename __mt_alloc<_Tp>::thread_record* - __mt_alloc<_Tp>::_S_thread_freelist_last = NULL; + volatile __mt_alloc<_Tp>::_S_thread_freelist_first = NULL; template __gthread_mutex_t __mt_alloc<_Tp>::_S_thread_freelist_mutex = __GTHREAD_MUTEX_INIT;