aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Olsson <stefan@snon.net>2004-01-15 19:18:35 +0000
committerBenjamin Kosnik <bkoz@redhat.com>2004-01-15 19:18:35 +0000
commit4015a84827e392e763f262aae9a9c16fc0ec1fda (patch)
tree7b86fb407c38d5f1fa1be30b21cdeded74b715eb
parent181a5cf05c96092b3060c90e30d3670e355a0639 (diff)
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: https://gcc.gnu.org/svn/gcc/trunk@75939 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/include/ext/mt_allocator.h30
2 files changed, 18 insertions, 18 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index aac5acf3ef1..4ea985bd8ae 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
2004-01-14 Paolo Carlini <pcarlini@suse.de>
* 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 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;