diff options
author | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-01-15 19:18:35 +0000 |
---|---|---|
committer | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-01-15 19:18:35 +0000 |
commit | dc7b73336d43e2ed737de8150959ac5b108e6844 (patch) | |
tree | 7b86fb407c38d5f1fa1be30b21cdeded74b715eb /libstdc++-v3/include/ext | |
parent | 92362d197fc3fe5cf494adf8af6212401346bfaa (diff) | |
download | gcc-dc7b73336d43e2ed737de8150959ac5b108e6844.tar.gz |
2004-01-15 Stefan Olsson <stefan@snon.net>
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@75939 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/ext')
-rw-r--r-- | libstdc++-v3/include/ext/mt_allocator.h | 30 |
1 files changed, 12 insertions, 18 deletions
diff --git a/libstdc++-v3/include/ext/mt_allocator.h b/libstdc++-v3/include/ext/mt_allocator.h index 5b69e6375ae..b4498feddf3 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<typename _Tp> bool - __mt_alloc<_Tp>::_S_initialized = false; + volatile __mt_alloc<_Tp>::_S_initialized = false; template<typename _Tp> typename __mt_alloc<_Tp>::binmap_type* __mt_alloc<_Tp>::_S_binmap = NULL; @@ -829,10 +826,7 @@ namespace __gnu_cxx */ #ifdef __GTHREADS template<typename _Tp> typename __mt_alloc<_Tp>::thread_record* - __mt_alloc<_Tp>::_S_thread_freelist_first = NULL; - - template<typename _Tp> typename __mt_alloc<_Tp>::thread_record* - __mt_alloc<_Tp>::_S_thread_freelist_last = NULL; + volatile __mt_alloc<_Tp>::_S_thread_freelist_first = NULL; template<typename _Tp> __gthread_mutex_t __mt_alloc<_Tp>::_S_thread_freelist_mutex = __GTHREAD_MUTEX_INIT; |