ios_base.h: Use _Atomic_word for reference counts.
authorAndrew Pollard <andrew@andypo.net>
Thu, 24 Jan 2002 21:14:41 +0000 (21:14 +0000)
committerLoren J. Rittle <ljrittle@gcc.gnu.org>
Thu, 24 Jan 2002 21:14:41 +0000 (21:14 +0000)
libstdc++/5432
* include/bits/ios_base.h: Use _Atomic_word for reference counts.
* include/bits/localefwd.h: Likewise.
Also use for std::locale::id::_S_highwater.
* src/ios.cc (ios_base::xalloc): Use _Atomic_word.
* src/locale.cc: Support new usage of _Atomic_word.
(std::locale::classic): Guard entire function against reentry.
* src/localename.cc: Support new usage of _Atomic_word.

From-SVN: r49195

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/ios_base.h
libstdc++-v3/include/bits/localefwd.h
libstdc++-v3/src/ios.cc
libstdc++-v3/src/locale.cc
libstdc++-v3/src/localename.cc

index e9e3282ad9fe63639c66cc9476eee3f182d60e20..5e849a4d0d29a62109268b0b0fa8022f7b5b88dd 100644 (file)
@@ -1,3 +1,15 @@
+2002-01-24  andrew@andypo.net
+           (tweaks, test and commit by Loren J. Rittle  <ljrittle@acm.org>)
+
+       libstdc++/5432
+       * include/bits/ios_base.h: Use _Atomic_word for reference counts.
+       * include/bits/localefwd.h: Likewise.
+       Also use for std::locale::id::_S_highwater.
+       * src/ios.cc (ios_base::xalloc): Use _Atomic_word.
+       * src/locale.cc: Support new usage of _Atomic_word.
+       (std::locale::classic): Guard entire function against reentry.
+       * src/localename.cc: Support new usage of _Atomic_word.
+
 2002-01-24   Benjamin Kosnik  <bkoz@redhat.com>
 
        * testsuite/22_locale/num_put_members_wchar_t.cc (test03): Use
index bf9fe693199c76eb4ff00f644f202a5e15abae72..7525e7d6f4cd621eb74366b494ec9d7cfa42316e 100644 (file)
@@ -1,6 +1,7 @@
 // Iostreams base classes -*- C++ -*-
 
-// Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
+// Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -41,6 +42,8 @@
 
 #pragma GCC system_header
 
+#include <bits/atomicity.h>
+
 namespace std
 {
   // The following definitions of bitmask types are enums, not ints,
@@ -244,17 +247,18 @@ namespace std
       _Callback_list*          _M_next;
       ios_base::event_callback         _M_fn;
       int                      _M_index;
-      int                      _M_refcount;  // 0 means one reference.
+      _Atomic_word             _M_refcount;  // 0 means one reference.
     
       _Callback_list(ios_base::event_callback __fn, int __index, 
                     _Callback_list* __cb)
       : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { }
       
       void 
-      _M_add_reference() { ++_M_refcount; } // XXX MT
-      
+      _M_add_reference() { __atomic_add(&_M_refcount, 1); }
+
       int 
-      _M_remove_reference() { return _M_refcount--; }  // 0 => OK to delete
+      _M_remove_reference() { return __exchange_and_add(&_M_refcount, -1); }
+      // 0 => OK to delete
     };
 
      _Callback_list*   _M_callbacks;
index be7f7e65e26a77809aeebcd802990dfffe951969..bcb60b7e4e41caa92eb798e7fb17bfd97a6144a6 100644 (file)
@@ -49,6 +49,8 @@
 #include <string>              // For string
 #include <bits/functexcept.h>
 
+#include <bits/atomicity.h>
+
 namespace std
 {
   // NB: Don't instantiate required wchar_t facets if no wchar_t support.
@@ -317,7 +319,7 @@ namespace std
 
   private:
     // Data Members.
-    size_t                             _M_references;
+    _Atomic_word                       _M_references;
     __vec_facet*                       _M_facets;
     string                             _M_names[_S_num_categories];
     static const locale::id* const     _S_id_ctype[];
@@ -330,12 +332,12 @@ namespace std
 
     inline void 
     _M_add_reference() throw()
-    { ++_M_references; }  // XXX MT
+    { __atomic_add(&_M_references, 1); }
 
     inline void 
     _M_remove_reference() throw()
     {
-      if (--_M_references == 0)  // XXX MT
+      if (__exchange_and_add(&_M_references, -1) == 1)
        {
          try 
            { delete this; } 
@@ -392,7 +394,7 @@ namespace std
     friend class __enc_traits;
 
   private:
-    size_t _M_references;
+    _Atomic_word _M_references;
 
   protected:
     // Contains data from the underlying "C" library for default "C"
@@ -447,7 +449,7 @@ namespace std
     mutable size_t     _M_index;
 
     // Last id number assigned
-    static size_t      _S_highwater;   
+    static _Atomic_word        _S_highwater;   
 
     void 
     operator=(const id&);  // not defined
index 6ca59572fba80b3a57e0d670e2ce8b72959ed377..e8122bb2b77b310e71fb350f0196a262efad96ab 100644 (file)
@@ -1,6 +1,7 @@
 // Iostreams base classes -*- C++ -*-
 
-// Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
+// Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -36,6 +37,8 @@
 #include <istream>
 #include <fstream>
 
+#include <bits/atomicity.h>
+
 namespace std 
 {
   // Extern declarations for global objects in src/globals.cc.
@@ -224,10 +227,11 @@ namespace std
   int 
   ios_base::xalloc() throw()
   {
-    // XXX MT
     // XXX should be a symbol. (Reserve 0..3 for builtins.)
-    static int top = 4; 
-    return top++;
+    static _Atomic_word top = 0; 
+    return __exchange_and_add(&top, 1) + 4;
+    // Implementation note: Initialize top to zero to ensure that
+    // initialization occurs before main() is started.
   }
 
   // 27.4.2.5  iword/pword storage
index 630805ee0fa5e21e4aabf19879bf095c0f60b4ec..52091827259f597a275bac4be31a13a51d2d6fed 100644 (file)
@@ -41,6 +41,8 @@
 # include <cwctype>     // for towupper, etc.
 #endif
 
+#include <bits/atomicity.h>
+
 namespace std 
 {
   // Defined in globals.cc.
@@ -72,7 +74,7 @@ namespace std
 #endif
 
   // Definitions for static const data members of locale::id
-  size_t locale::id::_S_highwater;  // init'd to 0 by linker
+  _Atomic_word locale::id::_S_highwater;  // init'd to 0 by linker
 
   // Definitions for static const data members of locale::_Impl
   const locale::id* const
@@ -187,7 +189,7 @@ namespace std
   { 
     _S_initialize(); 
     (_M_impl = _S_global)->_M_add_reference(); 
-  } // XXX MT
+  }
 
   locale::locale(const locale& __other) throw()
   { (_M_impl = __other._M_impl)->_M_add_reference(); }
@@ -283,7 +285,9 @@ namespace std
   locale const&
   locale::classic()
   {
-    // XXX MT
+    static _STL_mutex_lock __lock __STL_MUTEX_INITIALIZER;
+    _STL_auto_lock __auto(__lock);
+
     if (!_S_classic)
       {
        try 
@@ -364,13 +368,13 @@ namespace std
   void  
   locale::facet::
   _M_add_reference() throw()
-  { ++_M_references; }  // XXX MT
+  { __atomic_add(&_M_references, 1); }
 
   void  
   locale::facet::
   _M_remove_reference() throw()
   {
-    if (_M_references-- == 0)
+    if (__exchange_and_add(&_M_references, -1) == 0)
       {
         try 
          { delete this; }  
index 45c4732d007fe1dbfff8fbefacab771961698b17..816f7581c121853dc97389f19eec7c417810b6ff 100644 (file)
@@ -178,7 +178,7 @@ namespace std
       {
        size_t& __index = __idp->_M_index;
        if (!__index)
-         __index = ++locale::id::_S_highwater;  // XXX MT
+         __index = 1 + __exchange_and_add(&locale::id::_S_highwater, 1);
        
        if (__index >= _M_facets->size())
          _M_facets->resize(__index + 1, 0);  // might throw