#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
* 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
/*
* 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.
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;
{
free(__p);
return;
- }
+ }
/*
* Round up to power of 2 and figure out which bin to use
}
/*
- * 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
}
/*
- * 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);
}
*/
if (__gthread_active_p())
{
- thread_record* freelist_pos;
+ thread_record* volatile freelist_pos;
if ((freelist_pos =
(thread_record*)__gthread_getspecific(_S_thread_key)) == NULL)
#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;
*/
#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;