OSDN Git Service

2004-01-15 Stefan Olsson <stefan@snon.net>
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Jan 2004 19:18:35 +0000 (19:18 +0000)
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Jan 2004 19:18:35 +0000 (19:18 +0000)
* 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

libstdc++-v3/ChangeLog
libstdc++-v3/include/ext/mt_allocator.h

index aac5acf..4ea985b 100644 (file)
@@ -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):
index 5b69e63..b4498fe 100644 (file)
@@ -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;