aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Kosnik <bkoz@redhat.com>2006-09-14 09:48:15 +0000
committerBenjamin Kosnik <bkoz@redhat.com>2006-09-14 09:48:15 +0000
commitdde46786c6bfd2b6d389e0bf9da55a8045a81453 (patch)
treeeef2837703208f056261f360e2ea7f39d3036693
parent5655bb6978381469722d7a5bb894f2952422e390 (diff)
2006-09-13 Benjamin Kosnik <bkoz@redhat.com>
* include/bits/atomicity.h: Move to... * include/ext/atomicity.h: ...here. * include/bits/concurrence.h: Move to... * include/ext/concurrence.h: ...here. * include/Makefile.am (ext_headers): Additions. (bits_headers): Subtractions. * include/Makefile.in: Regenerate. * include/ext/bitmap_allocator.h (_Mutex), __threads_enabled, _Lock, _Auto_Lock): Subsume into... * include/bits/concurrence.h (__mutex): ..this. Error check locking and unlocking. (lock): Uglify to... (__scoped_lock): Use __mutex. (__glibcxx_mutex_define_initialized): Remove. (__glibcxx_mutex_type): Remove. * include/tr1/boost_shared_ptr.h: Formating tweaks, adjustments. (_Lock_policy): Move from here... * include/ext/concurrence.h: ... to here. (__shared_ptr_default_lock_mode): To __default_lock_policy. (_S_lockfree): To _S_atomic. Document. * libsupc++/guard.cc (static_mutex): Subsume into and fixup for... * include/ext/concurrence.h (__recursive_mutex): ...this. Error check locking and unlocking. * libsupc++/eh_alloc.cc: Use __scoped_lock. * config/os/aix/atomicity.h: Fixups for include paths, mutex to __scoped_mutex change, removal of locking defines. * config/os/irix/atomicity.h: Same. * config/cpu/cris/atomicity.h: Same. * config/cpu/m68k/atomicity.h: Same. * config/cpu/hppa/atomicity.h: Same. * config/cpu/mips/atomicity.h: Same. * config/cpu/sparc/atomicity.h: Same. * config/cpu/i386/atomicity.h: Same. * config/cpu/i486/atomicity.h: Same. * config/cpu/sh/atomicity.h: Same. * config/cpu/generic/atomicity_mutex/atomicity.h: Same. * include/ext/pool_allocator.h: Same. * include/ext/bitmap_allocator.h: Same. * include/ext/rc_string_base.h: Same. * include/ext/mt_allocator.h: Same. * include/bits/locale_classes.h: Same. * include/bits/basic_string.h: Same. * include/bits/ios_base.h: Same. * include/tr1/memory: Same. * src/pool_allocator.cc: Same. * src/mt_allocator.cc: Same. * src/locale_init.cc: Same. * src/ios.cc: Same. * src/locale.cc: Same. * src/bitmap_allocator.cc: Same. * src/ios_init.cc: Same. * src/debug.cc: Same. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@116942 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libstdc++-v3/ChangeLog60
-rw-r--r--libstdc++-v3/config/cpu/cris/atomicity.h2
-rw-r--r--libstdc++-v3/config/cpu/generic/atomicity_mutex/atomicity.h9
-rw-r--r--libstdc++-v3/config/cpu/hppa/atomicity.h2
-rw-r--r--libstdc++-v3/config/cpu/i386/atomicity.h2
-rw-r--r--libstdc++-v3/config/cpu/i486/atomicity.h2
-rw-r--r--libstdc++-v3/config/cpu/m68k/atomicity.h2
-rw-r--r--libstdc++-v3/config/cpu/mips/atomicity.h2
-rw-r--r--libstdc++-v3/config/cpu/sh/atomicity.h9
-rw-r--r--libstdc++-v3/config/cpu/sparc/atomicity.h2
-rw-r--r--libstdc++-v3/config/os/aix/atomicity.h10
-rw-r--r--libstdc++-v3/config/os/irix/atomicity.h2
-rw-r--r--libstdc++-v3/include/Makefile.am4
-rw-r--r--libstdc++-v3/include/Makefile.in4
-rw-r--r--libstdc++-v3/include/bits/basic_string.h2
-rw-r--r--libstdc++-v3/include/bits/concurrence.h101
-rw-r--r--libstdc++-v3/include/bits/ios_base.h2
-rw-r--r--libstdc++-v3/include/bits/locale_classes.h3
-rw-r--r--libstdc++-v3/include/ext/atomicity.h (renamed from libstdc++-v3/include/bits/atomicity.h)10
-rw-r--r--libstdc++-v3/include/ext/bitmap_allocator.h208
-rw-r--r--libstdc++-v3/include/ext/concurrence.h184
-rw-r--r--libstdc++-v3/include/ext/mt_allocator.h3
-rw-r--r--libstdc++-v3/include/ext/pool_allocator.h10
-rw-r--r--libstdc++-v3/include/ext/rc_string_base.h2
-rw-r--r--libstdc++-v3/include/tr1/boost_shared_ptr.h553
-rw-r--r--libstdc++-v3/include/tr1/memory7
-rw-r--r--libstdc++-v3/libsupc++/eh_alloc.cc41
-rw-r--r--libstdc++-v3/libsupc++/guard.cc69
-rw-r--r--libstdc++-v3/src/bitmap_allocator.cc45
-rw-r--r--libstdc++-v3/src/debug.cc10
-rw-r--r--libstdc++-v3/src/ios.cc1
-rw-r--r--libstdc++-v3/src/ios_init.cc1
-rw-r--r--libstdc++-v3/src/locale.cc10
-rw-r--r--libstdc++-v3/src/locale_init.cc10
-rw-r--r--libstdc++-v3/src/mt_allocator.cc15
-rw-r--r--libstdc++-v3/src/pool_allocator.cc6
36 files changed, 602 insertions, 803 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 830adbf3066..3d5f8798bd5 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,63 @@
+2006-09-13 Benjamin Kosnik <bkoz@redhat.com>
+
+ * include/bits/atomicity.h: Move to...
+ * include/ext/atomicity.h: ...here.
+ * include/bits/concurrence.h: Move to...
+ * include/ext/concurrence.h: ...here.
+ * include/Makefile.am (ext_headers): Additions.
+ (bits_headers): Subtractions.
+ * include/Makefile.in: Regenerate.
+
+ * include/ext/bitmap_allocator.h (_Mutex), __threads_enabled,
+ _Lock, _Auto_Lock): Subsume into...
+ * include/bits/concurrence.h (__mutex): ..this. Error check
+ locking and unlocking.
+ (lock): Uglify to...
+ (__scoped_lock): Use __mutex.
+ (__glibcxx_mutex_define_initialized): Remove.
+ (__glibcxx_mutex_type): Remove.
+
+ * include/tr1/boost_shared_ptr.h: Formating tweaks, adjustments.
+ (_Lock_policy): Move from here...
+ * include/ext/concurrence.h: ... to here.
+ (__shared_ptr_default_lock_mode): To __default_lock_policy.
+ (_S_lockfree): To _S_atomic.
+ Document.
+
+ * libsupc++/guard.cc (static_mutex): Subsume into and fixup for...
+ * include/ext/concurrence.h (__recursive_mutex): ...this. Error
+ check locking and unlocking.
+ * libsupc++/eh_alloc.cc: Use __scoped_lock.
+
+ * config/os/aix/atomicity.h: Fixups for include paths, mutex to
+ __scoped_mutex change, removal of locking defines.
+ * config/os/irix/atomicity.h: Same.
+ * config/cpu/cris/atomicity.h: Same.
+ * config/cpu/m68k/atomicity.h: Same.
+ * config/cpu/hppa/atomicity.h: Same.
+ * config/cpu/mips/atomicity.h: Same.
+ * config/cpu/sparc/atomicity.h: Same.
+ * config/cpu/i386/atomicity.h: Same.
+ * config/cpu/i486/atomicity.h: Same.
+ * config/cpu/sh/atomicity.h: Same.
+ * config/cpu/generic/atomicity_mutex/atomicity.h: Same.
+ * include/ext/pool_allocator.h: Same.
+ * include/ext/bitmap_allocator.h: Same.
+ * include/ext/rc_string_base.h: Same.
+ * include/ext/mt_allocator.h: Same.
+ * include/bits/locale_classes.h: Same.
+ * include/bits/basic_string.h: Same.
+ * include/bits/ios_base.h: Same.
+ * include/tr1/memory: Same.
+ * src/pool_allocator.cc: Same.
+ * src/mt_allocator.cc: Same.
+ * src/locale_init.cc: Same.
+ * src/ios.cc: Same.
+ * src/locale.cc: Same.
+ * src/bitmap_allocator.cc: Same.
+ * src/ios_init.cc: Same.
+ * src/debug.cc: Same.
+
2006-09-12 Benjamin Kosnik <bkoz@redhat.com>
* libsupc++/eh_globals.cc: Remove __gnu_internal.
diff --git a/libstdc++-v3/config/cpu/cris/atomicity.h b/libstdc++-v3/config/cpu/cris/atomicity.h
index 0384b42a3d0..da16a1aacee 100644
--- a/libstdc++-v3/config/cpu/cris/atomicity.h
+++ b/libstdc++-v3/config/cpu/cris/atomicity.h
@@ -27,7 +27,7 @@
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
diff --git a/libstdc++-v3/config/cpu/generic/atomicity_mutex/atomicity.h b/libstdc++-v3/config/cpu/generic/atomicity_mutex/atomicity.h
index e62c5ae6f28..b54309ea2bb 100644
--- a/libstdc++-v3/config/cpu/generic/atomicity_mutex/atomicity.h
+++ b/libstdc++-v3/config/cpu/generic/atomicity_mutex/atomicity.h
@@ -28,12 +28,12 @@
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
-#include <bits/atomicity.h>
-#include <bits/concurrence.h>
+#include <ext/atomicity.h>
+#include <ext/concurrence.h>
namespace
{
- __glibcxx_mutex_define_initialized(atomic_mutex);
+ __gnu_cxx::__mutex atomic_mutex;
} // anonymous namespace
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
@@ -42,11 +42,10 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
__attribute__ ((__unused__))
__exchange_and_add(volatile _Atomic_word* __mem, int __val)
{
- __glibcxx_mutex_lock(atomic_mutex);
+ __gnu_cxx::__scoped_lock sentry(atomic_mutex);
_Atomic_word __result;
__result = *__mem;
*__mem += __val;
- __glibcxx_mutex_unlock(atomic_mutex);
return __result;
}
diff --git a/libstdc++-v3/config/cpu/hppa/atomicity.h b/libstdc++-v3/config/cpu/hppa/atomicity.h
index 1b1c883188f..76c09e046fb 100644
--- a/libstdc++-v3/config/cpu/hppa/atomicity.h
+++ b/libstdc++-v3/config/cpu/hppa/atomicity.h
@@ -28,7 +28,7 @@
// the GNU General Public License.
#include <bits/c++config.h>
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
diff --git a/libstdc++-v3/config/cpu/i386/atomicity.h b/libstdc++-v3/config/cpu/i386/atomicity.h
index 1b31c2d73ae..7232b5b26e4 100644
--- a/libstdc++-v3/config/cpu/i386/atomicity.h
+++ b/libstdc++-v3/config/cpu/i386/atomicity.h
@@ -27,7 +27,7 @@
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
diff --git a/libstdc++-v3/config/cpu/i486/atomicity.h b/libstdc++-v3/config/cpu/i486/atomicity.h
index c2cf509ab55..4d8f6529358 100644
--- a/libstdc++-v3/config/cpu/i486/atomicity.h
+++ b/libstdc++-v3/config/cpu/i486/atomicity.h
@@ -27,7 +27,7 @@
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
diff --git a/libstdc++-v3/config/cpu/m68k/atomicity.h b/libstdc++-v3/config/cpu/m68k/atomicity.h
index 370d77f925e..f63b582a976 100644
--- a/libstdc++-v3/config/cpu/m68k/atomicity.h
+++ b/libstdc++-v3/config/cpu/m68k/atomicity.h
@@ -27,7 +27,7 @@
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
diff --git a/libstdc++-v3/config/cpu/mips/atomicity.h b/libstdc++-v3/config/cpu/mips/atomicity.h
index 33582a3d34c..2989fa44278 100644
--- a/libstdc++-v3/config/cpu/mips/atomicity.h
+++ b/libstdc++-v3/config/cpu/mips/atomicity.h
@@ -28,7 +28,7 @@
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
diff --git a/libstdc++-v3/config/cpu/sh/atomicity.h b/libstdc++-v3/config/cpu/sh/atomicity.h
index 2294c5d13ac..d200818f66d 100644
--- a/libstdc++-v3/config/cpu/sh/atomicity.h
+++ b/libstdc++-v3/config/cpu/sh/atomicity.h
@@ -74,12 +74,12 @@ __atomic_add (volatile _Atomic_word* __mem, int __val)
/* This is generic/atomicity.h */
-#include <bits/atomicity.h>
-#include <bits/concurrence.h>
+#include <ext/atomicity.h>
+#include <ext/concurrence.h>
namespace
{
- __glibcxx_mutex_define_initialized(atomic_mutex);
+ __gnu_cxx::__mutex atomic_mutex;
} // anonymous namespace
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
@@ -88,11 +88,10 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
__attribute__ ((__unused__))
__exchange_and_add(volatile _Atomic_word* __mem, int __val)
{
- __glibcxx_mutex_lock(atomic_mutex);
+ __gnu_cxx::__scoped_lock sentry(atomic_mutex);
_Atomic_word __result;
__result = *__mem;
*__mem += __val;
- __glibcxx_mutex_unlock(atomic_mutex);
return __result;
}
diff --git a/libstdc++-v3/config/cpu/sparc/atomicity.h b/libstdc++-v3/config/cpu/sparc/atomicity.h
index ad43760dffa..5fec033e6a7 100644
--- a/libstdc++-v3/config/cpu/sparc/atomicity.h
+++ b/libstdc++-v3/config/cpu/sparc/atomicity.h
@@ -28,7 +28,7 @@
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
diff --git a/libstdc++-v3/config/os/aix/atomicity.h b/libstdc++-v3/config/os/aix/atomicity.h
index b44e630486b..38c1ee368a9 100644
--- a/libstdc++-v3/config/os/aix/atomicity.h
+++ b/libstdc++-v3/config/os/aix/atomicity.h
@@ -27,7 +27,7 @@
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
/* We cannot use the cpu/powerpc/bits/atomicity.h inline assembly
definitions for these operations since they depend on operations
@@ -48,15 +48,11 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
_Atomic_word
__attribute__ ((__unused__))
__exchange_and_add (volatile _Atomic_word* __mem, int __val)
- {
- return ::fetch_and_add (const_cast<atomic_p>(__mem), __val);
- }
+ { return ::fetch_and_add(const_cast<atomic_p>(__mem), __val); }
void
__attribute__ ((__unused__))
__atomic_add (volatile _Atomic_word* __mem, int __val)
- {
- (void) ::fetch_and_add (const_cast<atomic_p>(__mem), __val);
- }
+ { (void) ::fetch_and_add(const_cast<atomic_p>(__mem), __val); }
_GLIBCXX_END_NAMESPACE
diff --git a/libstdc++-v3/config/os/irix/atomicity.h b/libstdc++-v3/config/os/irix/atomicity.h
index 9261d26fdbe..ebb3dfb5e8a 100644
--- a/libstdc++-v3/config/os/irix/atomicity.h
+++ b/libstdc++-v3/config/os/irix/atomicity.h
@@ -28,7 +28,7 @@
// the GNU General Public License.
#include <mutex.h>
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
index 271de28d162..0940be8f7f8 100644
--- a/libstdc++-v3/include/Makefile.am
+++ b/libstdc++-v3/include/Makefile.am
@@ -93,7 +93,6 @@ bits_srcdir = ${glibcxx_srcdir}/include/bits
bits_builddir = ./bits
bits_headers = \
${bits_srcdir}/allocator.h \
- ${bits_srcdir}/atomicity.h \
${bits_srcdir}/basic_ios.h \
${bits_srcdir}/basic_ios.tcc \
${bits_srcdir}/basic_string.h \
@@ -102,7 +101,6 @@ bits_headers = \
${bits_srcdir}/char_traits.h \
${bits_srcdir}/codecvt.h \
${bits_srcdir}/concept_check.h \
- ${bits_srcdir}/concurrence.h \
${bits_srcdir}/cpp_type_traits.h \
${bits_srcdir}/deque.tcc \
${bits_srcdir}/fstream.tcc \
@@ -529,9 +527,11 @@ ext_srcdir = ${glibcxx_srcdir}/include/ext
ext_builddir = ./ext
ext_headers = \
${ext_srcdir}/algorithm \
+ ${ext_srcdir}/atomicity.h \
${ext_srcdir}/array_allocator.h \
${ext_srcdir}/bitmap_allocator.h \
${ext_srcdir}/codecvt_specializations.h \
+ ${ext_srcdir}/concurrence.h \
${ext_srcdir}/debug_allocator.h \
${ext_srcdir}/stdio_filebuf.h \
${ext_srcdir}/stdio_sync_filebuf.h \
diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
index a53f9252a2c..51ad224e45b 100644
--- a/libstdc++-v3/include/Makefile.in
+++ b/libstdc++-v3/include/Makefile.in
@@ -318,7 +318,6 @@ bits_srcdir = ${glibcxx_srcdir}/include/bits
bits_builddir = ./bits
bits_headers = \
${bits_srcdir}/allocator.h \
- ${bits_srcdir}/atomicity.h \
${bits_srcdir}/basic_ios.h \
${bits_srcdir}/basic_ios.tcc \
${bits_srcdir}/basic_string.h \
@@ -327,7 +326,6 @@ bits_headers = \
${bits_srcdir}/char_traits.h \
${bits_srcdir}/codecvt.h \
${bits_srcdir}/concept_check.h \
- ${bits_srcdir}/concurrence.h \
${bits_srcdir}/cpp_type_traits.h \
${bits_srcdir}/deque.tcc \
${bits_srcdir}/fstream.tcc \
@@ -750,9 +748,11 @@ ext_srcdir = ${glibcxx_srcdir}/include/ext
ext_builddir = ./ext
ext_headers = \
${ext_srcdir}/algorithm \
+ ${ext_srcdir}/atomicity.h \
${ext_srcdir}/array_allocator.h \
${ext_srcdir}/bitmap_allocator.h \
${ext_srcdir}/codecvt_specializations.h \
+ ${ext_srcdir}/concurrence.h \
${ext_srcdir}/debug_allocator.h \
${ext_srcdir}/stdio_filebuf.h \
${ext_srcdir}/stdio_sync_filebuf.h \
diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h
index 4a703ce2b10..3e4f19d7275 100644
--- a/libstdc++-v3/include/bits/basic_string.h
+++ b/libstdc++-v3/include/bits/basic_string.h
@@ -42,7 +42,7 @@
#pragma GCC system_header
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
#include <debug/debug.h>
_GLIBCXX_BEGIN_NAMESPACE(std)
diff --git a/libstdc++-v3/include/bits/concurrence.h b/libstdc++-v3/include/bits/concurrence.h
deleted file mode 100644
index 81bf2a6215a..00000000000
--- a/libstdc++-v3/include/bits/concurrence.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Support for concurrent programing -*- C++ -*-
-
-// Copyright (C) 2003, 2004, 2005
-// 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
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License. This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
-
-/** @file concurrence.h
- * This is an internal header file, included by other library headers.
- * You should not attempt to use it directly.
- */
-
-#ifndef _CONCURRENCE_H
-#define _CONCURRENCE_H 1
-
-// GCC's thread abstraction layer
-#include "bits/gthr.h"
-
-#if __GTHREADS
-
-# ifdef __GTHREAD_MUTEX_INIT
-# define __glibcxx_mutex_type __gthread_mutex_t
-# define __glibcxx_mutex_define_initialized(NAME) \
-__gthread_mutex_t NAME = __GTHREAD_MUTEX_INIT
-# define __glibcxx_mutex_lock(NAME) \
-__gthread_mutex_lock(&NAME)
-# else
-// Implies __GTHREAD_MUTEX_INIT_FUNCTION
-struct __glibcxx_mutex : public __gthread_mutex_t
-{
- __glibcxx_mutex() { __GTHREAD_MUTEX_INIT_FUNCTION(this); }
-};
-
-# define __glibcxx_mutex_type __glibcxx_mutex
-# define __glibcxx_mutex_define_initialized(NAME) \
-__glibcxx_mutex NAME
-# define __glibcxx_mutex_lock(NAME) \
-__gthread_mutex_lock(&NAME)
-# endif
-
-# define __glibcxx_mutex_unlock(NAME) __gthread_mutex_unlock(&NAME)
-
-#else
-
-# define __glibcxx_mutex_type __gthread_mutex_t
-# define __glibcxx_mutex_define_initialized(NAME) __gthread_mutex_t NAME
-# define __glibcxx_mutex_lock(NAME)
-# define __glibcxx_mutex_unlock(NAME)
-
-#endif
-
-_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
-
- typedef __glibcxx_mutex_type mutex_type;
-
- /// @brief Scoped lock idiom.
- // Acquire the mutex here with a constructor call, then release with
- // the destructor call in accordance with RAII style.
- class lock
- {
- // Externally defined and initialized.
- mutex_type& device;
-
- public:
- explicit lock(mutex_type& name) : device(name)
- { __glibcxx_mutex_lock(device); }
-
- ~lock() throw()
- { __glibcxx_mutex_unlock(device); }
-
- private:
- lock(const lock&);
- lock& operator=(const lock&);
- };
-
-_GLIBCXX_END_NAMESPACE
-
-#endif
diff --git a/libstdc++-v3/include/bits/ios_base.h b/libstdc++-v3/include/bits/ios_base.h
index dbaa74d87c0..5cbdfab4e77 100644
--- a/libstdc++-v3/include/bits/ios_base.h
+++ b/libstdc++-v3/include/bits/ios_base.h
@@ -42,7 +42,7 @@
#pragma GCC system_header
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
#include <bits/localefwd.h>
#include <bits/locale_classes.h>
diff --git a/libstdc++-v3/include/bits/locale_classes.h b/libstdc++-v3/include/bits/locale_classes.h
index ab5efb7466f..9fbac9e2ac7 100644
--- a/libstdc++-v3/include/bits/locale_classes.h
+++ b/libstdc++-v3/include/bits/locale_classes.h
@@ -45,8 +45,7 @@
#include <bits/localefwd.h>
#include <cstring> // For strcmp.
#include <string>
-#include <bits/atomicity.h>
-#include <bits/gthr.h>
+#include <ext/atomicity.h>
_GLIBCXX_BEGIN_NAMESPACE(std)
diff --git a/libstdc++-v3/include/bits/atomicity.h b/libstdc++-v3/include/ext/atomicity.h
index 79af99ec724..975121e876b 100644
--- a/libstdc++-v3/include/bits/atomicity.h
+++ b/libstdc++-v3/include/ext/atomicity.h
@@ -1,4 +1,4 @@
-// Low-level functions for atomic operations -*- C++ -*-
+// Support for atomic operations -*- C++ -*-
// Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
//
@@ -41,6 +41,10 @@
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
+ // Functions for portable atomic access.
+ // To abstract locking primatives across all thread policies, use:
+ // __exchange_and_add_dispatch
+ // __atomic_add_dispatch
#ifdef _GLIBCXX_ATOMIC_BUILTINS
static inline _Atomic_word
__exchange_and_add(volatile _Atomic_word* __mem, int __val)
@@ -52,11 +56,11 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
#else
_Atomic_word
__attribute__ ((__unused__))
- __exchange_and_add(volatile _Atomic_word* __mem, int __val);
+ __exchange_and_add(volatile _Atomic_word*, int);
void
__attribute__ ((__unused__))
- __atomic_add(volatile _Atomic_word* __mem, int __val);
+ __atomic_add(volatile _Atomic_word*, int);
#endif
static inline _Atomic_word
diff --git a/libstdc++-v3/include/ext/bitmap_allocator.h b/libstdc++-v3/include/ext/bitmap_allocator.h
index 6452cb8f69c..5dbe28600eb 100644
--- a/libstdc++-v3/include/ext/bitmap_allocator.h
+++ b/libstdc++-v3/include/ext/bitmap_allocator.h
@@ -34,25 +34,13 @@
#ifndef _BITMAP_ALLOCATOR_H
#define _BITMAP_ALLOCATOR_H 1
-// For std::size_t, and ptrdiff_t.
-#include <cstddef>
-
-// For __throw_bad_alloc().
-#include <bits/functexcept.h>
-
-// For std::pair.
-#include <utility>
-
-// For greater_equal, and less_equal.
-#include <functional>
-
-// For operator new.
-#include <new>
-
-// For __gthread_mutex_t, __gthread_mutex_lock and __gthread_mutex_unlock.
-#include <bits/gthr.h>
-
+#include <cstddef> // For std::size_t, and ptrdiff_t.
+#include <bits/functexcept.h> // For __throw_bad_alloc().
+#include <utility> // For std::pair.
+#include <functional> // For greater_equal, and less_equal.
+#include <new> // For operator new.
#include <debug/debug.h> // _GLIBCXX_DEBUG_ASSERT
+#include <ext/concurrence.h>
/** @brief The constant in the expression below is the alignment
@@ -65,144 +53,6 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
using std::size_t;
using std::ptrdiff_t;
-#if defined __GTHREADS
- namespace
- {
- /** @brief If true, then the application being compiled will be
- * using threads, so use mutexes as a synchronization primitive,
- * else do no use any synchronization primitives.
- */
- bool const __threads_enabled = __gthread_active_p();
- } // anonymous namespace
-#endif
-
-#if defined __GTHREADS
- /** @class _Mutex bitmap_allocator.h bitmap_allocator.h
- *
- * @brief _Mutex is an OO-Wrapper for __gthread_mutex_t.
- *
- * It does not allow you to copy or assign an already initialized
- * mutex. This is used merely as a convenience for the locking
- * classes.
- */
- class _Mutex
- {
- __gthread_mutex_t _M_mut;
-
- // Prevent Copying and assignment.
- _Mutex(_Mutex const&);
- _Mutex& operator=(_Mutex const&);
-
- public:
- _Mutex()
- {
- if (__threads_enabled)
- {
-#if !defined __GTHREAD_MUTEX_INIT
- __GTHREAD_MUTEX_INIT_FUNCTION(&_M_mut);
-#else
- __gthread_mutex_t __mtemp = __GTHREAD_MUTEX_INIT;
- _M_mut = __mtemp;
-#endif
- }
- }
-
- ~_Mutex()
- {
- // Gthreads does not define a Mutex Destruction Function.
- }
-
- __gthread_mutex_t*
- _M_get() { return &_M_mut; }
- };
-
- /** @class _Lock bitmap_allocator.h bitmap_allocator.h
- *
- * @brief _Lock is a simple manual locking class which allows you to
- * manually lock and unlock a mutex associated with the lock.
- *
- * There is no automatic locking or unlocking happening without the
- * programmer's explicit instructions. This class unlocks the mutex
- * ONLY if it has not been locked. However, this check does not
- * apply for locking, and wayward use may cause dead-locks.
- */
- class _Lock
- {
- _Mutex* _M_pmt;
- bool _M_locked;
-
- // Prevent Copying and assignment.
- _Lock(_Lock const&);
- _Lock& operator=(_Lock const&);
-
- public:
- _Lock(_Mutex* __mptr)
- : _M_pmt(__mptr), _M_locked(false)
- { }
-
- void
- _M_lock()
- {
- if (__threads_enabled)
- {
- _M_locked = true;
- __gthread_mutex_lock(_M_pmt->_M_get());
- }
- }
-
- void
- _M_unlock()
- {
- if (__threads_enabled)
- {
- if (__builtin_expect(_M_locked, true))
- {
- __gthread_mutex_unlock(_M_pmt->_M_get());
- _M_locked = false;
- }
- }
- }
-
- ~_Lock() { }
- };
-
- /** @class _Auto_Lock bitmap_allocator.h bitmap_allocator.h
- *
- * @brief _Auto_Lock locks the associated mutex on construction, and
- * unlocks on destruction.
- *
- * There are no checks performed, and this class follows the RAII
- * principle.
- */
- class _Auto_Lock
- {
- _Mutex* _M_pmt;
- // Prevent Copying and assignment.
- _Auto_Lock(_Auto_Lock const&);
- _Auto_Lock& operator=(_Auto_Lock const&);
-
- void
- _M_lock()
- {
- if (__threads_enabled)
- __gthread_mutex_lock(_M_pmt->_M_get());
- }
-
- void
- _M_unlock()
- {
- if (__threads_enabled)
- __gthread_mutex_unlock(_M_pmt->_M_get());
- }
-
- public:
- _Auto_Lock(_Mutex* __mptr) : _M_pmt(__mptr)
- { this->_M_lock(); }
-
- ~_Auto_Lock() { this->_M_unlock(); }
- };
-#endif
-
namespace balloc
{
/** @class __mini_vector bitmap_allocator.h bitmap_allocator.h
@@ -699,9 +549,10 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
*/
class free_list
{
- typedef size_t* value_type;
- typedef balloc::__mini_vector<value_type> vector_type;
- typedef vector_type::iterator iterator;
+ typedef size_t* value_type;
+ typedef balloc::__mini_vector<value_type> vector_type;
+ typedef vector_type::iterator iterator;
+ typedef __mutex mutex_type;
struct _LT_pointer_compare
{
@@ -712,11 +563,11 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
};
#if defined __GTHREADS
- _Mutex*
+ mutex_type&
_M_get_mutex()
{
- static _Mutex _S_mutex;
- return &_S_mutex;
+ static mutex_type _S_mutex;
+ return _S_mutex;
}
#endif
@@ -807,7 +658,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
_M_insert(size_t* __addr) throw()
{
#if defined __GTHREADS
- _Auto_Lock __bfl_lock(_M_get_mutex());
+ __gnu_cxx::__scoped_lock __bfl_lock(_M_get_mutex());
#endif
// Call _M_validate to decide what should be done with
// this particular free list.
@@ -859,13 +710,15 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
class bitmap_allocator : private free_list
{
public:
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef _Tp* pointer;
- typedef const _Tp* const_pointer;
- typedef _Tp& reference;
- typedef const _Tp& const_reference;
- typedef _Tp value_type;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ typedef free_list::mutex_type mutex_type;
+
template<typename _Tp1>
struct rebind
{
@@ -971,7 +824,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
_Bitmap_counter<_Alloc_block*> _S_last_request;
static typename _BPVector::size_type _S_last_dealloc_index;
#if defined __GTHREADS
- static _Mutex _S_mut;
+ static mutex_type _S_mut;
#endif
public:
@@ -993,7 +846,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
_M_allocate_single_object() throw(std::bad_alloc)
{
#if defined __GTHREADS
- _Auto_Lock __bit_lock(&_S_mut);
+ __gnu_cxx::__scoped_lock __bit_lock(_S_mut);
#endif
// The algorithm is something like this: The last_request
@@ -1091,7 +944,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
_M_deallocate_single_object(pointer __p) throw()
{
#if defined __GTHREADS
- _Auto_Lock __bit_lock(&_S_mut);
+ __gnu_cxx::__scoped_lock __bit_lock(_S_mut);
#endif
_Alloc_block* __real_p = reinterpret_cast<_Alloc_block*>(__p);
@@ -1105,8 +958,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
if (__gnu_cxx::balloc::_Inclusive_between<_Alloc_block*>
- (__real_p)
- (_S_mem_blocks[_S_last_dealloc_index]))
+ (__real_p) (_S_mem_blocks[_S_last_dealloc_index]))
{
_GLIBCXX_DEBUG_ASSERT(_S_last_dealloc_index <= _S_mem_blocks.size() - 1);
@@ -1116,8 +968,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
}
else
{
- _Iterator _iter =
- __gnu_cxx::balloc::
+ _Iterator _iter = __gnu_cxx::balloc::
__find_if(_S_mem_blocks.begin(),
_S_mem_blocks.end(),
__gnu_cxx::balloc::
@@ -1276,7 +1127,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
#if defined __GTHREADS
template<typename _Tp>
- __gnu_cxx::_Mutex
+ typename bitmap_allocator<_Tp>::mutex_type
bitmap_allocator<_Tp>::_S_mut;
#endif
@@ -1284,4 +1135,3 @@ _GLIBCXX_END_NAMESPACE
#endif
-// LocalWords: namespace GTHREADS bool const gthread endif Mutex mutex
diff --git a/libstdc++-v3/include/ext/concurrence.h b/libstdc++-v3/include/ext/concurrence.h
new file mode 100644
index 00000000000..54d21e595ae
--- /dev/null
+++ b/libstdc++-v3/include/ext/concurrence.h
@@ -0,0 +1,184 @@
+// Support for concurrent programing -*- C++ -*-
+
+// Copyright (C) 2003, 2004, 2005, 2006
+// 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction. Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License. This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+/** @file concurrence.h
+ * This is an internal header file, included by other library headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _CONCURRENCE_H
+#define _CONCURRENCE_H 1
+
+#include <bits/gthr.h>
+#include <bits/functexcept.h>
+
+_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
+
+ // Available locking policies:
+ // _S_single single-threaded code that doesn't need to be locked.
+ // _S_mutex multi-threaded code that requires additional support
+ // from gthr.h or abstraction layers in concurrance.h.
+ // _S_atomic multi-threaded code using atomic operations.
+ enum _Lock_policy { _S_single, _S_mutex, _S_atomic };
+
+ // Compile time constant that indicates prefered locking policy in
+ // the current configuration.
+ static const _Lock_policy __default_lock_policy =
+#ifdef __GTHREADS
+ // NB: This macro doesn't actually exist yet in the compiler, but is
+ // set somewhat haphazardly at configure time.
+#ifdef _GLIBCXX_ATOMIC_BUILTINS
+ _S_atomic;
+#else
+ _S_mutex;
+#endif
+#else
+ _S_single;
+#endif
+
+ class __mutex
+ {
+ private:
+ __gthread_mutex_t _M_mutex;
+
+ __mutex(const __mutex&);
+ __mutex& operator=(const __mutex&);
+
+ public:
+ __mutex()
+ {
+#if __GTHREADS
+ if (__gthread_active_p())
+ {
+#if defined __GTHREAD_MUTEX_INIT
+ __gthread_mutex_t __tmp = __GTHREAD_MUTEX_INIT;
+ _M_mutex = __tmp;
+#else
+ __GTHREAD_MUTEX_INIT_FUNCTION(_M_mutex);
+#endif
+ }
+#endif
+ }
+
+ void lock()
+ {
+#if __GTHREADS
+ if (__gthread_active_p())
+ {
+ if (__gthread_mutex_lock(&_M_mutex) != 0)
+ std::__throw_runtime_error("__mutex::lock");
+ }
+#endif
+ }
+
+ void unlock()
+ {
+#if __GTHREADS
+ if (__gthread_active_p())
+ {
+ if (__gthread_mutex_unlock(&_M_mutex) != 0)
+ std::__throw_runtime_error("__mutex::unlock");
+ }
+#endif
+ }
+ };
+
+ class __recursive_mutex
+ {
+ private:
+ __gthread_recursive_mutex_t _M_mutex;
+
+ __recursive_mutex(const __recursive_mutex&);
+ __recursive_mutex& operator=(const __recursive_mutex&);
+
+ public:
+ __recursive_mutex()
+ {
+#if __GTHREADS
+ if (__gthread_active_p())
+ {
+#if defined __GTHREAD_RECURSIVE_MUTEX_INIT
+ __gthread_recursive_mutex_t __tmp = __GTHREAD_RECURSIVE_MUTEX_INIT;
+ _M_mutex = __tmp;
+#else
+ __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION(_M_mutex);
+#endif
+ }
+#endif
+ }
+
+ void lock()
+ {
+#if __GTHREADS
+ if (__gthread_active_p())
+ {
+ if (__gthread_recursive_mutex_lock(&_M_mutex) != 0)
+ std::__throw_runtime_error("__recursive_mutex::lock");
+ }
+#endif
+ }
+
+ void unlock()
+ {
+#if __GTHREADS
+ if (__gthread_active_p())
+ {
+ if (__gthread_recursive_mutex_unlock(&_M_mutex) != 0)
+ std::__throw_runtime_error("__recursive_mutex::unlock");
+ }
+#endif
+ }
+ };
+
+ /// @brief Scoped lock idiom.
+ // Acquire the mutex here with a constructor call, then release with
+ // the destructor call in accordance with RAII style.
+ class __scoped_lock
+ {
+ public:
+ typedef __mutex mutex_type;
+
+ private:
+ mutex_type& _M_device;
+
+ __scoped_lock(const __scoped_lock&);
+ __scoped_lock& operator=(const __scoped_lock&);
+
+ public:
+ explicit __scoped_lock(mutex_type& __name) : _M_device(__name)
+ { _M_device.lock(); }
+
+ ~__scoped_lock() throw()
+ { _M_device.unlock(); }
+ };
+
+_GLIBCXX_END_NAMESPACE
+
+#endif
diff --git a/libstdc++-v3/include/ext/mt_allocator.h b/libstdc++-v3/include/ext/mt_allocator.h
index 2379d82c031..4dcd4373e4e 100644
--- a/libstdc++-v3/include/ext/mt_allocator.h
+++ b/libstdc++-v3/include/ext/mt_allocator.h
@@ -37,8 +37,7 @@
#include <new>
#include <cstdlib>
#include <bits/functexcept.h>
-#include <bits/gthr.h>
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
diff --git a/libstdc++-v3/include/ext/pool_allocator.h b/libstdc++-v3/include/ext/pool_allocator.h
index d12831018ce..e78bf21778c 100644
--- a/libstdc++-v3/include/ext/pool_allocator.h
+++ b/libstdc++-v3/include/ext/pool_allocator.h
@@ -52,8 +52,8 @@
#include <cstdlib>
#include <new>
#include <bits/functexcept.h>
-#include <bits/atomicity.h>
-#include <bits/concurrence.h>
+#include <ext/atomicity.h>
+#include <ext/concurrence.h>
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
@@ -106,7 +106,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
_Obj* volatile*
_M_get_free_list(size_t __bytes);
- mutex_type&
+ __mutex&
_M_get_mutex();
// Returns an object of size __n, and optionally adds to size __n
@@ -218,7 +218,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
{
_Obj* volatile* __free_list = _M_get_free_list(__bytes);
- lock sentry(_M_get_mutex());
+ __scoped_lock sentry(_M_get_mutex());
_Obj* __restrict__ __result = *__free_list;
if (__builtin_expect(__result == 0, 0))
__ret = static_cast<_Tp*>(_M_refill(_M_round_up(__bytes)));
@@ -248,7 +248,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
_Obj* volatile* __free_list = _M_get_free_list(__bytes);
_Obj* __q = reinterpret_cast<_Obj*>(__p);
- lock sentry(_M_get_mutex());
+ __scoped_lock sentry(_M_get_mutex());
__q ->_M_free_list_link = *__free_list;
*__free_list = __q;
}
diff --git a/libstdc++-v3/include/ext/rc_string_base.h b/libstdc++-v3/include/ext/rc_string_base.h
index 1a896d827fe..3d41fe5dde1 100644
--- a/libstdc++-v3/include/ext/rc_string_base.h
+++ b/libstdc++-v3/include/ext/rc_string_base.h
@@ -36,7 +36,7 @@
#ifndef _RC_STRING_BASE_H
#define _RC_STRING_BASE_H 1
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
diff --git a/libstdc++-v3/include/tr1/boost_shared_ptr.h b/libstdc++-v3/include/tr1/boost_shared_ptr.h
index 9b22bd9a5d7..dfe5f171b6d 100644
--- a/libstdc++-v3/include/tr1/boost_shared_ptr.h
+++ b/libstdc++-v3/include/tr1/boost_shared_ptr.h
@@ -1,6 +1,6 @@
// <tr1/boost_shared_ptr.h> -*- C++ -*-
-// Copyright (C) 2005 Free Software Foundation, Inc.
+// Copyright (C) 2005, 2006 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
@@ -54,40 +54,18 @@
#ifndef _BOOST_SHARED_PTR_H
#define _BOOST_SHARED_PTR_H 1
-// namespace std::tr1
namespace std
{
-
_GLIBCXX_BEGIN_NAMESPACE(tr1)
-// TODO This should go into a separate header really.
-enum _Lock_policy { _S_lockfree, _S_mutex, _S_single };
-
-static const _Lock_policy __shared_ptr_default_lock_mode =
-#ifdef __GTHREADS
-// NOTE: This doesn't actually exist yet in the compiler.
-#ifdef _GLIBCXX_ATOMIC_BUILTINS
- _S_lockfree;
-#else
- _S_mutex;
-#endif
-#else
- _S_single;
-#endif
-
-// END TODO
-
class bad_weak_ptr : public std::exception
{
public:
-
virtual char const*
- what() const throw()
- { return "tr1::bad_weak_ptr"; }
+ what() const throw() { return "tr1::bad_weak_ptr"; }
};
-// Helper for exception objects in <tr1/memory>
-// TODO this should be defined in a different file.
+ // Substitute for bad_weak_ptr object in the case of -fno-exceptions.
inline void
__throw_bad_weak_ptr()
{
@@ -98,6 +76,11 @@ __throw_bad_weak_ptr()
#endif
}
+using __gnu_cxx::_Lock_policy;
+using __gnu_cxx::__default_lock_policy;
+using __gnu_cxx::_S_single;
+using __gnu_cxx::_S_mutex;
+using __gnu_cxx::_S_atomic;
template<typename _Tp>
struct _Sp_deleter
@@ -111,64 +94,41 @@ template<typename _Tp>
};
// Empty helper class except when the template argument is _S_mutex.
-template <_Lock_policy __l>
+template<_Lock_policy _Lp>
class _Mutex_base
- {
- };
+ { };
-template <>
- class _Mutex_base<_S_mutex>
- {
- public:
- __gnu_cxx::mutex_type _M_mutex;
-
- _Mutex_base()
- {
- // For the case of __GTHREAD_MUTEX_INIT we haven't initialised
- // the mutex yet, so do it now.
-#if defined(__GTHREADS) && defined(__GTHREAD_MUTEX_INIT)
- __gthread_mutex_t __tmp = __GTHREAD_MUTEX_INIT;
- _M_mutex = __tmp;
-#endif
- }
- };
+template<>
+ class _Mutex_base<_S_mutex> : public __gnu_cxx::__mutex
+ { };
-template <_Lock_policy __l = __shared_ptr_default_lock_mode>
- class _Sp_counted_base
- : public _Mutex_base<__l>
+template<_Lock_policy _Lp = __default_lock_policy>
+ class _Sp_counted_base : public _Mutex_base<_Lp>
{
- public:
-
- _Sp_counted_base()
- : _M_use_count(1), _M_weak_count(1)
- {
- }
+ public:
+ _Sp_counted_base() : _M_use_count(1), _M_weak_count(1) { }
virtual
- ~_Sp_counted_base() // nothrow
+ ~_Sp_counted_base() // nothrow
{ }
- // dispose() is called when _M_use_count drops to zero, to release
- // the resources managed by *this.
+ // Called when _M_use_count drops to zero, to release the resources
+ // managed by *this.
virtual void
dispose() = 0; // nothrow
- // destroy() is called when _M_weak_count drops to zero.
+ // Called when _M_weak_count drops to zero.
virtual void
destroy() // nothrow
- {
- delete this;
- }
+ { delete this; }
virtual void*
get_deleter(const std::type_info&) = 0;
void
add_ref_copy()
- {
- __gnu_cxx::__atomic_add(&_M_use_count, 1);
- }
+ { __gnu_cxx::__atomic_add(&_M_use_count, 1); }
void
add_ref_lock();
@@ -190,9 +150,7 @@ template <_Lock_policy __l = __shared_ptr_default_lock_mode>
void
weak_add_ref() // nothrow
- {
- __gnu_cxx::__atomic_add(&_M_weak_count, 1);
- }
+ { __gnu_cxx::__atomic_add(&_M_weak_count, 1); }
void
weak_release() // nothrow
@@ -209,12 +167,9 @@ template <_Lock_policy __l = __shared_ptr_default_lock_mode>
long
use_count() const // nothrow
- {
- return _M_use_count; // XXX is this MT safe?
- }
-
- private:
+ { return _M_use_count; } // XXX is this MT safe?
+ private:
_Sp_counted_base(_Sp_counted_base const&);
_Sp_counted_base& operator=(_Sp_counted_base const&);
@@ -223,8 +178,7 @@ template <_Lock_policy __l = __shared_ptr_default_lock_mode>
};
template<>
- inline
- void
+ inline void
_Sp_counted_base<_S_single>::add_ref_lock()
{
if (__gnu_cxx::__exchange_and_add(&_M_use_count, 1) == 0)
@@ -236,11 +190,10 @@ template<>
#ifdef __GTHREADS
template<>
- inline
- void
+ inline void
_Sp_counted_base<_S_mutex>::add_ref_lock()
{
- __gnu_cxx::lock lock(_M_mutex);
+ __gnu_cxx::__scoped_lock sentry(*this);
if (__gnu_cxx::__exchange_and_add(&_M_use_count, 1) == 0)
{
_M_use_count = 0;
@@ -250,9 +203,8 @@ template<>
#endif
template<>
- inline
- void
- _Sp_counted_base<_S_lockfree>::add_ref_lock()
+ inline void
+ _Sp_counted_base<_S_atomic>::add_ref_lock()
{
// Perform lock-free add-if-not-zero operation.
_Atomic_word __count;
@@ -260,40 +212,32 @@ template<>
{
__count = _M_use_count;
if (__count == 0)
- {
- __throw_bad_weak_ptr();
- }
- /* Replace the current counter value with the old value + 1, as long
- * as it's not changed meanwhile. */
+ __throw_bad_weak_ptr();
+
+ // Replace the current counter value with the old value + 1, as
+ // long as it's not changed meanwhile.
}
while (!__sync_bool_compare_and_swap(&_M_use_count, __count, __count + 1));
}
-template<typename _Ptr, typename _Deleter, _Lock_policy __l>
- class _Sp_counted_base_impl
- : public _Sp_counted_base<__l>
+template<typename _Ptr, typename _Deleter, _Lock_policy _Lp>
+ class _Sp_counted_base_impl : public _Sp_counted_base<_Lp>
{
public:
-
/**
* @brief
* @pre d(p) must not throw.
*/
_Sp_counted_base_impl(_Ptr __p, _Deleter __d)
- : _M_ptr(__p), _M_del(__d)
- { }
+ : _M_ptr(__p), _M_del(__d) { }
virtual void
dispose() // nothrow
- {
- _M_del(_M_ptr);
- }
+ { _M_del(_M_ptr); }
virtual void*
get_deleter(const std::type_info& __ti)
- {
- return __ti == typeid(_Deleter) ? &_M_del : 0;
- }
+ { return __ti == typeid(_Deleter) ? &_M_del : 0; }
private:
_Sp_counted_base_impl(const _Sp_counted_base_impl&);
@@ -303,49 +247,44 @@ template<typename _Ptr, typename _Deleter, _Lock_policy __l>
_Deleter _M_del; // copy constructor must not throw
};
-template<_Lock_policy __l = __shared_ptr_default_lock_mode>
+template<_Lock_policy _Lp = __default_lock_policy>
class weak_count;
-template<_Lock_policy __l = __shared_ptr_default_lock_mode>
+template<_Lock_policy _Lp = __default_lock_policy>
class shared_count
{
- private:
+ private:
+ _Sp_counted_base<_Lp>* _M_pi;
- _Sp_counted_base<__l>* _M_pi;
+ friend class weak_count<_Lp>;
- friend class weak_count<__l>;
-
- public:
-
- shared_count()
- : _M_pi(0) // nothrow
+ public:
+ shared_count() : _M_pi(0) // nothrow
{ }
template<typename _Ptr, typename _Deleter>
- shared_count(_Ptr __p, _Deleter __d)
- : _M_pi(0)
+ shared_count(_Ptr __p, _Deleter __d) : _M_pi(0)
{
try
{
- _M_pi = new _Sp_counted_base_impl<_Ptr, _Deleter, __l>(__p, __d);
+ _M_pi = new _Sp_counted_base_impl<_Ptr, _Deleter, _Lp>(__p, __d);
}
catch(...)
{
- __d(__p); // delete __p
+ __d(__p); // Call _Deleter on __p.
__throw_exception_again;
}
}
- // auto_ptr<_Tp> is special cased to provide the strong guarantee
-
+ // Special case for auto_ptr<_Tp> to provide the strong guarantee.
template<typename _Tp>
explicit shared_count(std::auto_ptr<_Tp>& __r)
: _M_pi(new _Sp_counted_base_impl<_Tp*,
- _Sp_deleter<_Tp>, __l >(__r.get(), _Sp_deleter<_Tp>()))
+ _Sp_deleter<_Tp>, _Lp >(__r.get(), _Sp_deleter<_Tp>()))
{ __r.release(); }
- // throws bad_weak_ptr when __r.use_count() == 0
- explicit shared_count(const weak_count<__l>& __r);
+ // Throw bad_weak_ptr when __r.use_count() == 0.
+ explicit shared_count(const weak_count<_Lp>& __r);
~shared_count() // nothrow
{
@@ -363,13 +302,12 @@ template<_Lock_policy __l = __shared_ptr_default_lock_mode>
shared_count&
operator=(const shared_count& __r) // nothrow
{
- _Sp_counted_base<__l>* __tmp = __r._M_pi;
-
- if(__tmp != _M_pi)
+ _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
+ if (__tmp != _M_pi)
{
- if(__tmp != 0)
+ if (__tmp != 0)
__tmp->add_ref_copy();
- if(_M_pi != 0)
+ if (_M_pi != 0)
_M_pi->release();
_M_pi = __tmp;
}
@@ -378,7 +316,7 @@ template<_Lock_policy __l = __shared_ptr_default_lock_mode>
void swap(shared_count& __r) // nothrow
{
- _Sp_counted_base<__l>* __tmp = __r._M_pi;
+ _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
__r._M_pi = _M_pi;
_M_pi = __tmp;
}
@@ -397,36 +335,34 @@ template<_Lock_policy __l = __shared_ptr_default_lock_mode>
friend inline bool
operator<(const shared_count& __a, const shared_count& __b)
- { return std::less<_Sp_counted_base<__l>*>()(__a._M_pi, __b._M_pi); }
+ { return std::less<_Sp_counted_base<_Lp>*>()(__a._M_pi, __b._M_pi); }
void*
get_deleter(const std::type_info& __ti) const
{ return _M_pi ? _M_pi->get_deleter(__ti) : 0; }
};
-template<_Lock_policy __l>
+template<_Lock_policy _Lp>
class weak_count
{
- private:
-
- _Sp_counted_base<__l>* _M_pi;
-
- friend class shared_count<__l>;
+ private:
+ _Sp_counted_base<_Lp>* _M_pi;
- public:
+ friend class shared_count<_Lp>;
+ public:
weak_count()
: _M_pi(0) // nothrow
{ }
- weak_count(const shared_count<__l>& __r)
+ weak_count(const shared_count<_Lp>& __r)
: _M_pi(__r._M_pi) // nothrow
{
if (_M_pi != 0)
_M_pi->weak_add_ref();
}
- weak_count(const weak_count<__l>& __r)
+ weak_count(const weak_count<_Lp>& __r)
: _M_pi(__r._M_pi) // nothrow
{
if (_M_pi != 0)
@@ -439,36 +375,34 @@ template<_Lock_policy __l>
_M_pi->weak_release();
}
- weak_count<__l>&
- operator=(const shared_count<__l>& __r) // nothrow
+ weak_count<_Lp>&
+ operator=(const shared_count<_Lp>& __r) // nothrow
{
- _Sp_counted_base<__l>* __tmp = __r._M_pi;
+ _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
if (__tmp != 0)
__tmp->weak_add_ref();
if (_M_pi != 0)
_M_pi->weak_release();
- _M_pi = __tmp;
-
+ _M_pi = __tmp;
return *this;
}
- weak_count<__l>&
- operator=(const weak_count<__l>& __r) // nothrow
+ weak_count<_Lp>&
+ operator=(const weak_count<_Lp>& __r) // nothrow
{
- _Sp_counted_base<__l> * __tmp = __r._M_pi;
+ _Sp_counted_base<_Lp> * __tmp = __r._M_pi;
if (__tmp != 0)
__tmp->weak_add_ref();
if (_M_pi != 0)
_M_pi->weak_release();
_M_pi = __tmp;
-
return *this;
}
void
- swap(weak_count<__l>& __r) // nothrow
+ swap(weak_count<_Lp>& __r) // nothrow
{
- _Sp_counted_base<__l> * __tmp = __r._M_pi;
+ _Sp_counted_base<_Lp> * __tmp = __r._M_pi;
__r._M_pi = _M_pi;
_M_pi = __tmp;
}
@@ -478,17 +412,17 @@ template<_Lock_policy __l>
{ return _M_pi != 0 ? _M_pi->use_count() : 0; }
friend inline bool
- operator==(const weak_count<__l>& __a, const weak_count<__l>& __b)
+ operator==(const weak_count<_Lp>& __a, const weak_count<_Lp>& __b)
{ return __a._M_pi == __b._M_pi; }
friend inline bool
- operator<(const weak_count<__l>& __a, const weak_count<__l>& __b)
- { return std::less<_Sp_counted_base<__l>*>()(__a._M_pi, __b._M_pi); }
+ operator<(const weak_count<_Lp>& __a, const weak_count<_Lp>& __b)
+ { return std::less<_Sp_counted_base<_Lp>*>()(__a._M_pi, __b._M_pi); }
};
-template<_Lock_policy __l>
+template<_Lock_policy _Lp>
inline
- shared_count<__l>::shared_count(const weak_count<__l>& __r)
+ shared_count<_Lp>::shared_count(const weak_count<_Lp>& __r)
: _M_pi(__r._M_pi)
{
if (_M_pi != 0)
@@ -498,20 +432,20 @@ template<_Lock_policy __l>
}
-// fwd decls
-template<typename _Tp, _Lock_policy __l = __shared_ptr_default_lock_mode>
+// Forward decls.
+template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
class __shared_ptr;
-template<typename _Tp, _Lock_policy __l = __shared_ptr_default_lock_mode>
+template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
class __weak_ptr;
-template<typename _Tp, _Lock_policy __l>
+template<typename _Tp, _Lock_policy _Lp>
class __enable_shared_from_this;
-struct __static_cast_tag {};
-struct __const_cast_tag {};
-struct __dynamic_cast_tag {};
-struct __polymorphic_cast_tag {};
+struct __static_cast_tag { };
+struct __const_cast_tag { };
+struct __dynamic_cast_tag { };
+struct __polymorphic_cast_tag { };
template<class _Tp>
struct shared_ptr_traits
@@ -534,24 +468,25 @@ template<>
{ typedef void reference; };
-// enable_shared_from_this support
+// Support for enable_shared_from_this.
-// friend of __enable_shared_from_this
-template<_Lock_policy __l, typename _Tp1, typename _Tp2>
+// Friend of __enable_shared_from_this.
+template<_Lock_policy _Lp, typename _Tp1, typename _Tp2>
void
- __enable_shared_from_this_helper(const shared_count<__l>& __pn,
- const __enable_shared_from_this<_Tp1, __l>* __pe,
- const _Tp2* __px );
+ __enable_shared_from_this_helper(const shared_count<_Lp>&,
+ const __enable_shared_from_this<_Tp1, _Lp>*,
+ const _Tp2*);
-template<_Lock_policy __l>
+template<_Lock_policy _Lp>
inline void
- __enable_shared_from_this_helper(const shared_count<__l>&, ...)
+ __enable_shared_from_this_helper(const shared_count<_Lp>&, ...)
{ }
-// get_deleter must be declared before friend declaration by shared_ptr.
-template<typename _Del, typename _Tp, _Lock_policy __l>
- _Del* get_deleter(const __shared_ptr<_Tp, __l>&);
+// Function get_deleter must be declared before friend declaration by
+// shared_ptr.
+template<typename _Del, typename _Tp, _Lock_policy _Lp>
+ _Del* get_deleter(const __shared_ptr<_Tp, _Lp>&);
/**
* @class shared_ptr <tr1/memory>
@@ -560,13 +495,12 @@ template<typename _Del, typename _Tp, _Lock_policy __l>
* The object pointed to is deleted when the last shared_ptr pointing to it
* is destroyed or reset.
*/
-template<typename _Tp, _Lock_policy __l>
+template<typename _Tp, _Lock_policy _Lp>
class __shared_ptr
{
typedef typename shared_ptr_traits<_Tp>::reference _Reference;
public:
-
typedef _Tp element_type;
/** @brief Construct an empty %__shared_ptr.
@@ -587,7 +521,6 @@ template<typename _Tp, _Lock_policy __l>
{
__glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
// __glibcxx_function_requires(_CompleteConcept<_Tp1*>)
-
__enable_shared_from_this_helper( _M_refcount, __p, __p );
}
@@ -609,7 +542,6 @@ template<typename _Tp, _Lock_policy __l>
{
__glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
// TODO requires D is CopyConstructible and d(p) well-formed
-
__enable_shared_from_this_helper( _M_refcount, __p, __p );
}
@@ -622,11 +554,9 @@ template<typename _Tp, _Lock_policy __l>
* @throw std::bad_alloc, in which case
*/
template<typename _Tp1>
- __shared_ptr(const __shared_ptr<_Tp1, __l>& __r)
+ __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r)
: _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
- {
- __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
- }
+ { __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
/** @brief Constructs a %__shared_ptr that shares ownership with @a r
* and stores a copy of the pointer stored in @a r.
@@ -636,12 +566,12 @@ template<typename _Tp, _Lock_policy __l>
* in which case the constructor has no effect.
*/
template<typename _Tp1>
- explicit __shared_ptr(const __weak_ptr<_Tp1, __l>& __r)
+ explicit __shared_ptr(const __weak_ptr<_Tp1, _Lp>& __r)
: _M_refcount(__r._M_refcount) // may throw
{
__glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
- // it is now safe to copy r__._M_ptr, as _M_refcount(__r._M_refcount)
- // did not throw
+ // It is now safe to copy r__._M_ptr, as _M_refcount(__r._M_refcount)
+ // did not throw.
_M_ptr = __r._M_ptr;
}
@@ -655,35 +585,34 @@ template<typename _Tp, _Lock_policy __l>
// TODO requires r.release() convertible to _Tp*, Tp1 is complete,
// delete r.release() well-formed
_Tp1 * __tmp = __r.get();
- _M_refcount = shared_count<__l>(__r);
-
+ _M_refcount = shared_count<_Lp>(__r);
__enable_shared_from_this_helper( _M_refcount, __tmp, __tmp );
}
template<typename _Tp1>
- __shared_ptr(const __shared_ptr<_Tp1, __l>& __r, __static_cast_tag)
+ __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r, __static_cast_tag)
: _M_ptr(static_cast<element_type*>(__r._M_ptr)),
_M_refcount(__r._M_refcount)
{ }
template<typename _Tp1>
- __shared_ptr(const __shared_ptr<_Tp1, __l>& __r, __const_cast_tag)
+ __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r, __const_cast_tag)
: _M_ptr(const_cast<element_type*>(__r._M_ptr)),
_M_refcount(__r._M_refcount)
{ }
template<typename _Tp1>
- __shared_ptr(const __shared_ptr<_Tp1, __l>& __r, __dynamic_cast_tag)
+ __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r, __dynamic_cast_tag)
: _M_ptr(dynamic_cast<element_type*>(__r._M_ptr)),
_M_refcount(__r._M_refcount)
{
if (_M_ptr == 0) // need to allocate new counter -- the cast failed
- _M_refcount = shared_count<__l>();
+ _M_refcount = shared_count<_Lp>();
}
template<typename _Tp1>
__shared_ptr&
- operator=(const __shared_ptr<_Tp1, __l>& __r) // never throws
+ operator=(const __shared_ptr<_Tp1, _Lp>& __r) // never throws
{
_M_ptr = __r._M_ptr;
_M_refcount = __r._M_refcount; // shared_count::op= doesn't throw
@@ -704,10 +633,10 @@ template<typename _Tp, _Lock_policy __l>
template<typename _Tp1>
void
- reset(_Tp1* __p) // _Tp1 must be complete
+ reset(_Tp1* __p) // _Tp1 must be complete.
{
- _GLIBCXX_DEBUG_ASSERT(__p == 0 || __p != _M_ptr); // catch self-reset
- // errors
+ // Catch self-reset errors.
+ _GLIBCXX_DEBUG_ASSERT(__p == 0 || __p != _M_ptr);
__shared_ptr(__p).swap(*this);
}
@@ -716,7 +645,7 @@ template<typename _Tp, _Lock_policy __l>
reset(_Tp1 * __p, _Deleter __d)
{ __shared_ptr(__p, __d).swap(*this); }
- // error to instantiate if _Tp is [cv-qual] void
+ // Error to instantiate if _Tp is [cv-qual] void.
_Reference
operator*() const // never throws
{
@@ -735,7 +664,7 @@ template<typename _Tp, _Lock_policy __l>
get() const // never throws
{ return _M_ptr; }
- // implicit conversion to "bool"
+ // Implicit conversion to "bool"
private:
typedef _Tp* __shared_ptr::*__unspecified_bool_type;
@@ -752,7 +681,7 @@ template<typename _Tp, _Lock_policy __l>
{ return _M_refcount.use_count(); }
void
- swap(__shared_ptr<_Tp, __l>& __other) // never throws
+ swap(__shared_ptr<_Tp, _Lp>& __other) // never throws
{
std::swap(_M_ptr, __other._M_ptr);
_M_refcount.swap(__other._M_refcount);
@@ -763,41 +692,41 @@ template<typename _Tp, _Lock_policy __l>
_M_get_deleter(const std::type_info& __ti) const
{ return _M_refcount.get_deleter(__ti); }
- template<typename _Tp1, _Lock_policy __l1>
+ template<typename _Tp1, _Lock_policy _Lp1>
bool
- _M_less(const __shared_ptr<_Tp1, __l1>& __rhs) const
+ _M_less(const __shared_ptr<_Tp1, _Lp1>& __rhs) const
{ return _M_refcount < __rhs._M_refcount; }
- template<typename _Tp1, _Lock_policy __l1> friend class __shared_ptr;
- template<typename _Tp1, _Lock_policy __l1> friend class __weak_ptr;
+ template<typename _Tp1, _Lock_policy _Lp1> friend class __shared_ptr;
+ template<typename _Tp1, _Lock_policy _Lp1> friend class __weak_ptr;
- template<typename _Del, typename _Tp1, _Lock_policy __l1>
- friend _Del* get_deleter(const __shared_ptr<_Tp1, __l1>&);
+ template<typename _Del, typename _Tp1, _Lock_policy _Lp1>
+ friend _Del* get_deleter(const __shared_ptr<_Tp1, _Lp1>&);
- // friends injected into enclosing namespace and found by ADL:
+ // Friends injected into enclosing namespace and found by ADL:
template<typename _Tp1>
friend inline bool
- operator==(const __shared_ptr& __a, const __shared_ptr<_Tp1, __l>& __b)
+ operator==(const __shared_ptr& __a, const __shared_ptr<_Tp1, _Lp>& __b)
{ return __a.get() == __b.get(); }
template<typename _Tp1>
friend inline bool
- operator!=(const __shared_ptr& __a, const __shared_ptr<_Tp1, __l>& __b)
+ operator!=(const __shared_ptr& __a, const __shared_ptr<_Tp1, _Lp>& __b)
{ return __a.get() != __b.get(); }
template<typename _Tp1>
friend inline bool
- operator<(const __shared_ptr& __a, const __shared_ptr<_Tp1, __l>& __b)
+ operator<(const __shared_ptr& __a, const __shared_ptr<_Tp1, _Lp>& __b)
{ return __a._M_less(__b); }
- _Tp* _M_ptr; // contained pointer
- shared_count<__l> _M_refcount; // reference counter
- }; // __shared_ptr
+ _Tp* _M_ptr; // Contained pointer.
+ shared_count<_Lp> _M_refcount; // Reference counter.
+ };
// 2.2.3.8 shared_ptr specialized algorithms.
-template<typename _Tp, _Lock_policy __l>
+template<typename _Tp, _Lock_policy _Lp>
inline void
- swap(__shared_ptr<_Tp, __l>& __a, __shared_ptr<_Tp, __l>& __b)
+ swap(__shared_ptr<_Tp, _Lp>& __a, __shared_ptr<_Tp, _Lp>& __b)
{ __a.swap(__b); }
// 2.2.3.9 shared_ptr casts
@@ -806,85 +735,75 @@ template<typename _Tp, _Lock_policy __l>
* will eventually result in undefined behaviour,
* attempting to delete the same object twice.
*/
-template<typename _Tp, typename _Tp1, _Lock_policy __l>
- __shared_ptr<_Tp, __l>
- static_pointer_cast(const __shared_ptr<_Tp1, __l>& __r)
- {
- return __shared_ptr<_Tp, __l>(__r, __static_cast_tag());
- }
+template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
+ __shared_ptr<_Tp, _Lp>
+ static_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r)
+ { return __shared_ptr<_Tp, _Lp>(__r, __static_cast_tag()); }
/** @warning The seemingly equivalent
* <code>shared_ptr<T>(const_cast<T*>(r.get()))</code>
* will eventually result in undefined behaviour,
* attempting to delete the same object twice.
*/
-template<typename _Tp, typename _Tp1, _Lock_policy __l>
- __shared_ptr<_Tp, __l>
- const_pointer_cast(const __shared_ptr<_Tp1, __l>& __r)
- {
- return __shared_ptr<_Tp, __l>(__r, __const_cast_tag());
- }
+template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
+ __shared_ptr<_Tp, _Lp>
+ const_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r)
+ { return __shared_ptr<_Tp, _Lp>(__r, __const_cast_tag()); }
/** @warning The seemingly equivalent
* <code>shared_ptr<T>(dynamic_cast<T*>(r.get()))</code>
* will eventually result in undefined behaviour,
* attempting to delete the same object twice.
*/
-template<typename _Tp, typename _Tp1, _Lock_policy __l>
- __shared_ptr<_Tp, __l>
- dynamic_pointer_cast(const __shared_ptr<_Tp1, __l>& __r)
- {
- return __shared_ptr<_Tp, __l>(__r, __dynamic_cast_tag());
- }
+template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
+ __shared_ptr<_Tp, _Lp>
+ dynamic_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r)
+ { return __shared_ptr<_Tp, _Lp>(__r, __dynamic_cast_tag()); }
// 2.2.3.7 shared_ptr I/O
-template<typename _Ch, typename _Tr, typename _Tp, _Lock_policy __l>
+template<typename _Ch, typename _Tr, typename _Tp, _Lock_policy _Lp>
std::basic_ostream<_Ch, _Tr>&
- operator<<(std::basic_ostream<_Ch, _Tr>& __os, const __shared_ptr<_Tp, __l>& __p)
+ operator<<(std::basic_ostream<_Ch, _Tr>& __os,
+ const __shared_ptr<_Tp, _Lp>& __p)
{
__os << __p.get();
return __os;
}
// 2.2.3.10 shared_ptr get_deleter (experimental)
-template<typename _Del, typename _Tp, _Lock_policy __l>
+template<typename _Del, typename _Tp, _Lock_policy _Lp>
inline _Del*
- get_deleter(const __shared_ptr<_Tp, __l>& __p)
+ get_deleter(const __shared_ptr<_Tp, _Lp>& __p)
{ return static_cast<_Del*>(__p._M_get_deleter(typeid(_Del))); }
-template<typename _Tp, _Lock_policy __l>
+template<typename _Tp, _Lock_policy _Lp>
class __weak_ptr
{
public:
-
typedef _Tp element_type;
- __weak_ptr()
- : _M_ptr(0), _M_refcount() // never throws
+ __weak_ptr() : _M_ptr(0), _M_refcount() // never throws
{ }
- // generated copy constructor, assignment, destructor are fine
+ // Generated copy constructor, assignment, destructor are fine.
- //
- // The "obvious" converting constructor implementation:
+ // The "obvious" converting constructor implementation:
//
// template<class Y>
// __weak_ptr(__weak_ptr<Y> const & r)
// : _M_ptr(r._M_ptr), _M_refcount(r._M_refcount) // never throws
// { }
//
- // has a serious problem.
+ // has a serious problem.
//
// r._M_ptr may already have been invalidated. The _M_ptr(r._M_ptr)
// conversion may require access to *r._M_ptr (virtual inheritance).
//
- // It is not possible to avoid spurious access violations since
- // in multithreaded programs r._M_ptr may be invalidated at any point.
- //
-
+ // It is not possible to avoid spurious access violations since
+ // in multithreaded programs r._M_ptr may be invalidated at any point.
template<typename _Tp1>
- __weak_ptr(const __weak_ptr<_Tp1, __l>& r)
+ __weak_ptr(const __weak_ptr<_Tp1, _Lp>& r)
: _M_refcount(r._M_refcount) // never throws
{
__glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
@@ -892,15 +811,13 @@ template<typename _Tp, _Lock_policy __l>
}
template<typename _Tp1>
- __weak_ptr(const __shared_ptr<_Tp1, __l>& r)
+ __weak_ptr(const __shared_ptr<_Tp1, _Lp>& r)
: _M_ptr(r._M_ptr), _M_refcount(r._M_refcount) // never throws
- {
- __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
- }
+ { __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
template<typename _Tp1>
__weak_ptr&
- operator=(const __weak_ptr<_Tp1, __l>& r) // never throws
+ operator=(const __weak_ptr<_Tp1, _Lp>& r) // never throws
{
_M_ptr = r.lock().get();
_M_refcount = r._M_refcount;
@@ -909,39 +826,37 @@ template<typename _Tp, _Lock_policy __l>
template<typename _Tp1>
__weak_ptr&
- operator=(const __shared_ptr<_Tp1, __l>& r) // never throws
+ operator=(const __shared_ptr<_Tp1, _Lp>& r) // never throws
{
_M_ptr = r._M_ptr;
_M_refcount = r._M_refcount;
return *this;
}
- __shared_ptr<_Tp, __l>
+ __shared_ptr<_Tp, _Lp>
lock() const // never throws
{
#ifdef __GTHREADS
-
- // optimization: avoid throw overhead
+ // Optimization: avoid throw overhead.
if (expired())
- return __shared_ptr<element_type, __l>();
+ return __shared_ptr<element_type, _Lp>();
try
{
- return __shared_ptr<element_type, __l>(*this);
+ return __shared_ptr<element_type, _Lp>(*this);
}
catch (const bad_weak_ptr&)
{
- // Q: how can we get here?
- // A: another thread may have invalidated r after the
+ // Q: How can we get here?
+ // A: Another thread may have invalidated r after the
// use_count test above.
return __shared_ptr<element_type>();
}
#else
-
- // optimization: avoid try/catch overhead when single threaded
- return expired() ? __shared_ptr<element_type, __l>()
- : __shared_ptr<element_type, __l>(*this);
+ // Optimization: avoid try/catch overhead when single threaded.
+ return expired() ? __shared_ptr<element_type, _Lp>()
+ : __shared_ptr<element_type, _Lp>(*this);
#endif
} // XXX MT
@@ -966,118 +881,105 @@ template<typename _Tp, _Lock_policy __l>
}
private:
-
template<typename _Tp1>
bool
- _M_less(const __weak_ptr<_Tp1, __l>& __rhs) const
+ _M_less(const __weak_ptr<_Tp1, _Lp>& __rhs) const
{ return _M_refcount < __rhs._M_refcount; }
- // used by __enable_shared_from_this
+ // Used by __enable_shared_from_this.
void
- _M_assign(_Tp* __ptr, const shared_count<__l>& __refcount)
+ _M_assign(_Tp* __ptr, const shared_count<_Lp>& __refcount)
{
_M_ptr = __ptr;
_M_refcount = __refcount;
}
- // friend injected into namespace and found by ADL
-
+ // Friend injected into namespace and found by ADL.
template<typename _Tp1>
friend inline bool
- operator<(const __weak_ptr& __lhs, const __weak_ptr<_Tp1, __l>& __rhs)
+ operator<(const __weak_ptr& __lhs, const __weak_ptr<_Tp1, _Lp>& __rhs)
{ return __lhs._M_less(__rhs); }
- template<typename _Tp1, _Lock_policy __l1> friend class __weak_ptr;
- template<typename _Tp1, _Lock_policy __l1> friend class __shared_ptr;
- friend class __enable_shared_from_this<_Tp, __l>;
+ template<typename _Tp1, _Lock_policy _Lp1> friend class __weak_ptr;
+ template<typename _Tp1, _Lock_policy _Lp1> friend class __shared_ptr;
+ friend class __enable_shared_from_this<_Tp, _Lp>;
- _Tp* _M_ptr; // contained pointer
- weak_count<__l> _M_refcount; // reference counter
-
- }; // __weak_ptr
+ _Tp* _M_ptr; // Contained pointer.
+ weak_count<_Lp> _M_refcount; // Reference counter.
+ };
// 2.2.4.7 weak_ptr specialized algorithms.
-template<typename _Tp, _Lock_policy __l>
+template<typename _Tp, _Lock_policy _Lp>
void
- swap(__weak_ptr<_Tp, __l>& __a, __weak_ptr<_Tp, __l>& __b)
+ swap(__weak_ptr<_Tp, _Lp>& __a, __weak_ptr<_Tp, _Lp>& __b)
{ __a.swap(__b); }
-template<typename _Tp, _Lock_policy __l = __shared_ptr_default_lock_mode>
+template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
class __enable_shared_from_this
{
protected:
+ __enable_shared_from_this() { }
- __enable_shared_from_this()
- { }
-
- __enable_shared_from_this(const __enable_shared_from_this&)
- { }
+ __enable_shared_from_this(const __enable_shared_from_this&) { }
__enable_shared_from_this&
operator=(const __enable_shared_from_this&)
{ return *this; }
- ~__enable_shared_from_this()
- { }
+ ~__enable_shared_from_this() { }
public:
-
- __shared_ptr<_Tp, __l>
+ __shared_ptr<_Tp, _Lp>
shared_from_this()
{
- __shared_ptr<_Tp, __l> __p(this->_M_weak_this);
+ __shared_ptr<_Tp, _Lp> __p(this->_M_weak_this);
return __p;
}
- __shared_ptr<const _Tp, __l>
+ __shared_ptr<const _Tp, _Lp>
shared_from_this() const
{
- __shared_ptr<const _Tp, __l> __p(this->_M_weak_this);
+ __shared_ptr<const _Tp, _Lp> __p(this->_M_weak_this);
return __p;
}
private:
template<typename _Tp1>
void
- _M_weak_assign(_Tp1* __p, const shared_count<__l>& __n) const
+ _M_weak_assign(_Tp1* __p, const shared_count<_Lp>& __n) const
{ _M_weak_this._M_assign(__p, __n); }
template<typename _Tp1>
friend void
- __enable_shared_from_this_helper(const shared_count<__l>& __pn,
+ __enable_shared_from_this_helper(const shared_count<_Lp>& __pn,
const __enable_shared_from_this* __pe,
const _Tp1* __px)
{
- if(__pe != 0)
+ if (__pe != 0)
__pe->_M_weak_assign(const_cast<_Tp1*>(__px), __pn);
}
- mutable __weak_ptr<_Tp, __l> _M_weak_this;
+ mutable __weak_ptr<_Tp, _Lp> _M_weak_this;
};
template<typename _Tp>
class shared_ptr;
-// The actual TR1 weak_ptr, with forwarding constructors and assignment operators.
+// The actual TR1 weak_ptr, with forwarding constructors and
+// assignment operators.
template<typename _Tp>
- class weak_ptr
- : public __weak_ptr<_Tp>
+ class weak_ptr : public __weak_ptr<_Tp>
{
public:
- weak_ptr()
- : __weak_ptr<_Tp>()
- { }
+ weak_ptr() : __weak_ptr<_Tp>() { }
template<typename _Tp1>
- weak_ptr(const __weak_ptr<_Tp1>& r)
- : __weak_ptr<_Tp>(r)
- { }
+ weak_ptr(const __weak_ptr<_Tp1>& r) : __weak_ptr<_Tp>(r) { }
template<typename _Tp1>
- weak_ptr(const __shared_ptr<_Tp1>& r)
- : __weak_ptr<_Tp>(r)
- { }
+ weak_ptr(const __shared_ptr<_Tp1>& r) : __weak_ptr<_Tp>(r) { }
+
template<typename _Tp1>
weak_ptr&
operator=(const weak_ptr<_Tp1>& r) // never throws
@@ -1095,53 +997,46 @@ template<typename _Tp>
}
};
-// The actual TR1 shared_ptr, with forwarding constructors and assignment operators.
+// The actual TR1 shared_ptr, with forwarding constructors and
+// assignment operators.
template<typename _Tp>
- class shared_ptr
- : public __shared_ptr<_Tp>
+ class shared_ptr : public __shared_ptr<_Tp>
{
public:
- shared_ptr()
- : __shared_ptr<_Tp>()
- { }
+ shared_ptr() : __shared_ptr<_Tp>() { }
template<typename _Tp1>
explicit shared_ptr(_Tp1* __p)
- : __shared_ptr<_Tp>(__p)
- { }
+ : __shared_ptr<_Tp>(__p) { }
template<typename _Tp1, typename _Deleter>
shared_ptr(_Tp1* __p, _Deleter __d)
- : __shared_ptr<_Tp>(__p, __d)
- { }
+ : __shared_ptr<_Tp>(__p, __d) { }
template<typename _Tp1>
shared_ptr(const __shared_ptr<_Tp1>& __r)
- : __shared_ptr<_Tp>(__r)
- { }
+ : __shared_ptr<_Tp>(__r) { }
template<typename _Tp1>
explicit shared_ptr(const __weak_ptr<_Tp1>& __r)
- : __shared_ptr<_Tp>(__r)
- { }
+ : __shared_ptr<_Tp>(__r) { }
template<typename _Tp1>
explicit shared_ptr(std::auto_ptr<_Tp1>& __r)
- : __shared_ptr<_Tp>(__r)
- { }
+ : __shared_ptr<_Tp>(__r) { }
+
template<typename _Tp1>
shared_ptr(const __shared_ptr<_Tp1>& __r, __static_cast_tag)
- : __shared_ptr<_Tp>(__r, __static_cast_tag())
- { }
+ : __shared_ptr<_Tp>(__r, __static_cast_tag()) { }
+
template<typename _Tp1>
shared_ptr(const __shared_ptr<_Tp1>& __r, __const_cast_tag)
- : __shared_ptr<_Tp>(__r, __const_cast_tag())
- { }
+ : __shared_ptr<_Tp>(__r, __const_cast_tag()) { }
template<typename _Tp1>
shared_ptr(const __shared_ptr<_Tp1>& __r, __dynamic_cast_tag)
- : __shared_ptr<_Tp>(__r, __dynamic_cast_tag())
- { }
+ : __shared_ptr<_Tp>(__r, __dynamic_cast_tag()) { }
+
// Additional non-base assignment operators to avoid excessive errors.
template<typename _Tp1>
shared_ptr&
@@ -1150,6 +1045,7 @@ template<typename _Tp>
this->__shared_ptr<_Tp>::operator=(__r);
return *this;
}
+
template<typename _Tp1>
shared_ptr&
operator=(const shared_ptr<_Tp1>& __r) // never throws
@@ -1160,17 +1056,14 @@ template<typename _Tp>
};
template<typename _Tp>
- class enable_shared_from_this
- : public __enable_shared_from_this<_Tp>
+ class enable_shared_from_this : public __enable_shared_from_this<_Tp>
{
protected:
enable_shared_from_this()
- : __enable_shared_from_this<_Tp>()
- { }
+ : __enable_shared_from_this<_Tp>() { }
enable_shared_from_this(const enable_shared_from_this&)
- : __enable_shared_from_this<_Tp>(enable_shared_from_this<_Tp>())
- { }
+ : __enable_shared_from_this<_Tp>(enable_shared_from_this<_Tp>()) { }
};
_GLIBCXX_END_NAMESPACE
diff --git a/libstdc++-v3/include/tr1/memory b/libstdc++-v3/include/tr1/memory
index 498fbe64fb2..6befb91c6fa 100644
--- a/libstdc++-v3/include/tr1/memory
+++ b/libstdc++-v3/include/tr1/memory
@@ -1,6 +1,6 @@
// <tr1/memory> -*- C++ -*-
-// Copyright (C) 2005 Free Software Foundation, Inc.
+// Copyright (C) 2005, 2006 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
@@ -40,10 +40,9 @@
#include <iosfwd> // std::basic_ostream
#include <cstdlib> // std::abort
-#include <bits/gthr.h>
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
+#include <ext/concurrence.h>
#include <bits/functexcept.h>
-#include <bits/concurrence.h>
#include <debug/debug.h>
#include <tr1/boost_shared_ptr.h>
diff --git a/libstdc++-v3/libsupc++/eh_alloc.cc b/libstdc++-v3/libsupc++/eh_alloc.cc
index 97ecd6dadd5..217a8cd8043 100644
--- a/libstdc++-v3/libsupc++/eh_alloc.cc
+++ b/libstdc++-v3/libsupc++/eh_alloc.cc
@@ -39,7 +39,7 @@
#include <climits>
#include <exception>
#include "unwind-cxx.h"
-#include "bits/gthr.h"
+#include <ext/concurrence.h>
#if _GLIBCXX_HOSTED
using std::free;
@@ -89,23 +89,11 @@ typedef char one_buffer[EMERGENCY_OBJ_SIZE] __attribute__((aligned));
static one_buffer emergency_buffer[EMERGENCY_OBJ_COUNT];
static bitmask_type emergency_used;
-
-#ifdef __GTHREADS
-#ifdef __GTHREAD_MUTEX_INIT
-static __gthread_mutex_t emergency_mutex =__GTHREAD_MUTEX_INIT;
-#else
-static __gthread_mutex_t emergency_mutex;
-#endif
-
-#ifdef __GTHREAD_MUTEX_INIT_FUNCTION
-static void
-emergency_mutex_init ()
+namespace
{
- __GTHREAD_MUTEX_INIT_FUNCTION (&emergency_mutex);
+ // A single mutex controlling emergency allocations.
+ __gnu_cxx::__mutex emergency_mutex;
}
-#endif
-#endif
-
extern "C" void *
__cxxabiv1::__cxa_allocate_exception(std::size_t thrown_size) throw()
@@ -117,13 +105,7 @@ __cxxabiv1::__cxa_allocate_exception(std::size_t thrown_size) throw()
if (! ret)
{
-#ifdef __GTHREADS
-#ifdef __GTHREAD_MUTEX_INIT_FUNCTION
- static __gthread_once_t once = __GTHREAD_ONCE_INIT;
- __gthread_once (&once, emergency_mutex_init);
-#endif
- __gthread_mutex_lock (&emergency_mutex);
-#endif
+ __gnu_cxx::__scoped_lock sentry(emergency_mutex);
bitmask_type used = emergency_used;
unsigned int which = 0;
@@ -141,9 +123,7 @@ __cxxabiv1::__cxa_allocate_exception(std::size_t thrown_size) throw()
ret = &emergency_buffer[which][0];
failed:;
-#ifdef __GTHREADS
- __gthread_mutex_unlock (&emergency_mutex);
-#endif
+
if (!ret)
std::terminate ();
}
@@ -167,16 +147,11 @@ __cxxabiv1::__cxa_free_exception(void *vptr) throw()
if (ptr >= &emergency_buffer[0][0]
&& ptr < &emergency_buffer[0][0] + sizeof (emergency_buffer))
{
- unsigned int which
+ const unsigned int which
= (unsigned)(ptr - &emergency_buffer[0][0]) / EMERGENCY_OBJ_SIZE;
-#ifdef __GTHREADS
- __gthread_mutex_lock (&emergency_mutex);
+ __gnu_cxx::__scoped_lock sentry(emergency_mutex);
emergency_used &= ~((bitmask_type)1 << which);
- __gthread_mutex_unlock (&emergency_mutex);
-#else
- emergency_used &= ~((bitmask_type)1 << which);
-#endif
}
else
free (ptr - sizeof (__cxa_exception));
diff --git a/libstdc++-v3/libsupc++/guard.cc b/libstdc++-v3/libsupc++/guard.cc
index e7fe2b6e7b9..a56fe15e7ee 100644
--- a/libstdc++-v3/libsupc++/guard.cc
+++ b/libstdc++-v3/libsupc++/guard.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2002 Free Software Foundation, Inc.
+// Copyright (C) 2002, 2004, 2006 Free Software Foundation, Inc.
//
// This file is part of GCC.
//
@@ -32,8 +32,8 @@
#include <bits/c++config.h>
#include <cxxabi.h>
#include <exception>
-#include <bits/gthr.h>
-#include <bits/atomicity.h>
+#include <ext/atomicity.h>
+#include <ext/concurrence.h>
// The IA64/generic ABI uses the first byte of the guard variable.
// The ARM EABI uses the least significant bit.
@@ -42,49 +42,8 @@
#ifdef __GTHREADS
namespace
{
- // static_mutex is a single mutex controlling all static initializations.
- // This is a static class--the need for a static initialization function
- // to pass to __gthread_once precludes creating multiple instances, though
- // I suppose you could achieve the same effect with a template.
- class static_mutex
- {
- static __gthread_recursive_mutex_t mutex;
-
-#ifdef __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION
- static void init();
-#endif
-
- public:
- static void lock();
- static void unlock();
- };
-
- __gthread_recursive_mutex_t static_mutex::mutex
-#ifdef __GTHREAD_RECURSIVE_MUTEX_INIT
- = __GTHREAD_RECURSIVE_MUTEX_INIT
-#endif
- ;
-
-#ifdef __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION
- void static_mutex::init()
- {
- __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION (&mutex);
- }
-#endif
-
- void static_mutex::lock()
- {
-#ifdef __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION
- static __gthread_once_t once = __GTHREAD_ONCE_INIT;
- __gthread_once (&once, init);
-#endif
- __gthread_recursive_mutex_lock (&mutex);
- }
-
- void static_mutex::unlock ()
- {
- __gthread_recursive_mutex_unlock (&mutex);
- }
+ // A single mutex controlling all static initializations.
+ __gnu_cxx::__recursive_mutex static_mutex;
}
#ifndef _GLIBCXX_GUARD_TEST_AND_ACQUIRE
@@ -125,14 +84,14 @@ namespace __gnu_cxx
// as well check for this situation and throw an exception.
// We use the second byte of the guard variable to remember that we're
// in the middle of an initialization.
- class recursive_init: public std::exception
+ class recursive_init_error: public std::exception
{
public:
- recursive_init() throw() { }
- virtual ~recursive_init() throw ();
+ recursive_init_error() throw() { }
+ virtual ~recursive_init_error() throw ();
};
- recursive_init::~recursive_init() throw() { }
+ recursive_init_error::~recursive_init_error() throw() { }
}
namespace __cxxabiv1
@@ -158,7 +117,7 @@ namespace __cxxabiv1
if (recursion_push (g))
{
#ifdef __EXCEPTIONS
- throw __gnu_cxx::recursive_init();
+ throw __gnu_cxx::recursive_init_error();
#else
// Use __builtin_trap so we don't require abort().
__builtin_trap ();
@@ -185,12 +144,12 @@ namespace __cxxabiv1
bool unlock;
mutex_wrapper (): unlock(true)
{
- static_mutex::lock ();
+ static_mutex.lock();
}
~mutex_wrapper ()
{
if (unlock)
- static_mutex::unlock ();
+ static_mutex.unlock();
}
} mw;
@@ -213,7 +172,7 @@ namespace __cxxabiv1
recursion_pop (g);
#ifdef __GTHREADS
if (__gthread_active_p ())
- static_mutex::unlock ();
+ static_mutex.unlock();
#endif
}
@@ -224,7 +183,7 @@ namespace __cxxabiv1
_GLIBCXX_GUARD_SET_AND_RELEASE (g);
#ifdef __GTHREADS
if (__gthread_active_p ())
- static_mutex::unlock ();
+ static_mutex.unlock();
#endif
}
}
diff --git a/libstdc++-v3/src/bitmap_allocator.cc b/libstdc++-v3/src/bitmap_allocator.cc
index 761ec613623..63208df60f9 100644
--- a/libstdc++-v3/src/bitmap_allocator.cc
+++ b/libstdc++-v3/src/bitmap_allocator.cc
@@ -33,19 +33,12 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
namespace balloc
{
- template class __mini_vector<std::pair
- <bitmap_allocator<char>::_Alloc_block*,
- bitmap_allocator<char>::_Alloc_block*> >;
-
- template class __mini_vector<std::pair
- <bitmap_allocator<wchar_t>::_Alloc_block*,
- bitmap_allocator<wchar_t>::_Alloc_block*> >;
-
+ template class __mini_vector<std::pair<bitmap_allocator<char>::_Alloc_block*, bitmap_allocator<char>::_Alloc_block*> >;
+ template class __mini_vector<std::pair<bitmap_allocator<wchar_t>::_Alloc_block*, bitmap_allocator<wchar_t>::_Alloc_block*> >;
template class __mini_vector<size_t*>;
- template size_t** __lower_bound
- (size_t**, size_t**,
- size_t const&, free_list::_LT_pointer_compare);
+ template size_t** __lower_bound(size_t**, size_t**, size_t const&,
+ free_list::_LT_pointer_compare);
}
size_t*
@@ -53,25 +46,24 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
_M_get(size_t __sz) throw(std::bad_alloc)
{
#if defined __GTHREADS
- _Lock __bfl_lock(_M_get_mutex());
- __bfl_lock._M_lock();
+ mutex_type& __bfl_mutex = _M_get_mutex();
#endif
- iterator __temp =
- __gnu_cxx::balloc::__lower_bound
- (_M_get_free_list().begin(), _M_get_free_list().end(),
- __sz, _LT_pointer_compare());
+ const vector_type& __free_list = _M_get_free_list();
+ using __gnu_cxx::balloc::__lower_bound;
+ iterator __tmp = __lower_bound(__free_list.begin(), __free_list.end(),
+ __sz, _LT_pointer_compare());
- if (__temp == _M_get_free_list().end() || !_M_should_i_give(**__temp, __sz))
+ if (__tmp == __free_list.end() || !_M_should_i_give(**__tmp, __sz))
{
// We release the lock here, because operator new is
// guaranteed to be thread-safe by the underlying
// implementation.
#if defined __GTHREADS
- __bfl_lock._M_unlock();
+ __bfl_mutex.unlock();
#endif
// Try twice to get the memory: once directly, and the 2nd
- // time after clearing the free list. If both fail, then
- // throw std::bad_alloc().
+ // time after clearing the free list. If both fail, then throw
+ // std::bad_alloc().
int __ctr = 2;
while (__ctr)
{
@@ -79,8 +71,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
--__ctr;
try
{
- __ret = reinterpret_cast<size_t*>
- (::operator new(__sz + sizeof(size_t)));
+ __ret = reinterpret_cast<size_t*>(::operator new(__sz + sizeof(size_t)));
}
catch(...)
{
@@ -95,10 +86,10 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
}
else
{
- size_t* __ret = *__temp;
- _M_get_free_list().erase(__temp);
+ size_t* __ret = *__tmp;
+ _M_get_free_list().erase(__tmp);
#if defined __GTHREADS
- __bfl_lock._M_unlock();
+ __bfl_mutex.unlock();
#endif
return __ret + 1;
}
@@ -109,7 +100,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
_M_clear()
{
#if defined __GTHREADS
- _Auto_Lock __bfl_lock(_M_get_mutex());
+ __gnu_cxx::__scoped_lock __bfl_lock(_M_get_mutex());
#endif
vector_type& __free_list = _M_get_free_list();
iterator __iter = __free_list.begin();
diff --git a/libstdc++-v3/src/debug.cc b/libstdc++-v3/src/debug.cc
index 94845563d05..c43acd6e727 100644
--- a/libstdc++-v3/src/debug.cc
+++ b/libstdc++-v3/src/debug.cc
@@ -35,14 +35,14 @@
#include <cassert>
#include <cstring>
#include <cctype>
-#include <bits/concurrence.h>
+#include <ext/concurrence.h>
using namespace std;
namespace
{
- static __glibcxx_mutex_define_initialized(iterator_base_mutex);
-}
+ __gnu_cxx::__mutex iterator_base_mutex;
+} // anonymous namespace
namespace __gnu_debug
{
@@ -192,7 +192,7 @@ namespace __gnu_debug
// Attach to the new sequence (if there is one)
if (__seq)
{
- __gnu_cxx::lock sentry(iterator_base_mutex);
+ __gnu_cxx::__scoped_lock sentry(iterator_base_mutex);
_M_sequence = __seq;
_M_version = _M_sequence->_M_version;
_M_prior = 0;
@@ -217,7 +217,7 @@ namespace __gnu_debug
_Safe_iterator_base::
_M_detach()
{
- __gnu_cxx::lock sentry(iterator_base_mutex);
+ __gnu_cxx::__scoped_lock sentry(iterator_base_mutex);
if (_M_sequence)
{
// Remove us from this sequence's list
diff --git a/libstdc++-v3/src/ios.cc b/libstdc++-v3/src/ios.cc
index e22c681e905..3fbee2cad4e 100644
--- a/libstdc++-v3/src/ios.cc
+++ b/libstdc++-v3/src/ios.cc
@@ -34,7 +34,6 @@
#include <ios>
#include <limits>
-#include <bits/atomicity.h>
_GLIBCXX_BEGIN_NAMESPACE(std)
diff --git a/libstdc++-v3/src/ios_init.cc b/libstdc++-v3/src/ios_init.cc
index 955a1f5cdff..5c7ab2e8322 100644
--- a/libstdc++-v3/src/ios_init.cc
+++ b/libstdc++-v3/src/ios_init.cc
@@ -36,7 +36,6 @@
#include <ostream>
#include <istream>
#include <fstream>
-#include <bits/atomicity.h>
#include <ext/stdio_filebuf.h>
#include <ext/stdio_sync_filebuf.h>
diff --git a/libstdc++-v3/src/locale.cc b/libstdc++-v3/src/locale.cc
index 7bcf51d8e30..12070eb2eb2 100644
--- a/libstdc++-v3/src/locale.cc
+++ b/libstdc++-v3/src/locale.cc
@@ -32,14 +32,12 @@
#include <cctype>
#include <cwctype> // For towupper, etc.
#include <locale>
-#include <bits/atomicity.h>
-#include <bits/concurrence.h>
+#include <ext/concurrence.h>
namespace
{
- // Mutex object for cache access.
- static __glibcxx_mutex_define_initialized(locale_cache_mutex);
-}
+ __gnu_cxx::__mutex locale_cache_mutex;
+} // anonymous namespace
// XXX GLIBCXX_ABI Deprecated
#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
@@ -391,7 +389,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
locale::_Impl::
_M_install_cache(const facet* __cache, size_t __index)
{
- __gnu_cxx::lock sentry(locale_cache_mutex);
+ __gnu_cxx::__scoped_lock sentry(locale_cache_mutex);
if (_M_caches[__index] != 0)
{
// Some other thread got in first.
diff --git a/libstdc++-v3/src/locale_init.cc b/libstdc++-v3/src/locale_init.cc
index 3a4b6d15aaf..2b6b4af2694 100644
--- a/libstdc++-v3/src/locale_init.cc
+++ b/libstdc++-v3/src/locale_init.cc
@@ -32,8 +32,7 @@
#include <cctype>
#include <cwctype> // For towupper, etc.
#include <locale>
-#include <bits/atomicity.h>
-#include <bits/concurrence.h>
+#include <ext/concurrence.h>
namespace
{
@@ -200,8 +199,7 @@ namespace
fake_time_cache_w timepunct_cache_w;
#endif
- // Mutex object for locale initialization.
- static __glibcxx_mutex_define_initialized(locale_mutex);
+ __gnu_cxx::__mutex locale_mutex;
} // anonymous namespace
_GLIBCXX_BEGIN_NAMESPACE(std)
@@ -209,7 +207,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
locale::locale() throw() : _M_impl(0)
{
_S_initialize();
- __gnu_cxx::lock sentry(locale_mutex);
+ __gnu_cxx::__scoped_lock sentry(locale_mutex);
_S_global->_M_add_reference();
_M_impl = _S_global;
}
@@ -220,7 +218,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
_S_initialize();
_Impl* __old;
{
- __gnu_cxx::lock sentry(locale_mutex);
+ __gnu_cxx::__scoped_lock sentry(locale_mutex);
__old = _S_global;
__other._M_impl->_M_add_reference();
_S_global = __other._M_impl;
diff --git a/libstdc++-v3/src/mt_allocator.cc b/libstdc++-v3/src/mt_allocator.cc
index 6b5403dc652..4385fbc84bf 100644
--- a/libstdc++-v3/src/mt_allocator.cc
+++ b/libstdc++-v3/src/mt_allocator.cc
@@ -32,7 +32,7 @@
//
#include <bits/c++config.h>
-#include <bits/concurrence.h>
+#include <ext/concurrence.h>
#include <ext/mt_allocator.h>
#include <cstring>
@@ -59,13 +59,13 @@ namespace
// Ensure freelist is constructed first.
static __freelist freelist;
- static __glibcxx_mutex_define_initialized(freelist_mutex);
+ __gnu_cxx::__mutex freelist_mutex;
static void
_M_destroy_thread_key(void* __id)
{
// Return this thread id record to the front of thread_freelist.
- __gnu_cxx::lock sentry(freelist_mutex);
+ __gnu_cxx::__scoped_lock sentry(freelist_mutex);
size_t _M_id = reinterpret_cast<size_t>(__id);
typedef __gnu_cxx::__pool<true>::_Thread_record _Thread_record;
@@ -497,11 +497,10 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
if (__gthread_active_p())
{
{
- __gnu_cxx::lock sentry(freelist_mutex);
+ __gnu_cxx::__scoped_lock sentry(freelist_mutex);
if (!freelist._M_thread_freelist_array
- || freelist._M_max_threads
- < _M_options._M_max_threads)
+ || freelist._M_max_threads < _M_options._M_max_threads)
{
const size_t __k = sizeof(_Thread_record)
* _M_options._M_max_threads;
@@ -622,7 +621,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
if (_M_id == 0)
{
{
- __gnu_cxx::lock sentry(freelist_mutex);
+ __gnu_cxx::__scoped_lock sentry(freelist_mutex);
if (freelist._M_thread_freelist)
{
_M_id = freelist._M_thread_freelist->_M_id;
@@ -695,7 +694,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
if (__gthread_active_p())
{
{
- __gnu_cxx::lock sentry(freelist_mutex);
+ __gnu_cxx::__scoped_lock sentry(freelist_mutex);
if (!freelist._M_thread_freelist_array
|| freelist._M_max_threads
diff --git a/libstdc++-v3/src/pool_allocator.cc b/libstdc++-v3/src/pool_allocator.cc
index 30441383cc4..c7593271b1d 100644
--- a/libstdc++-v3/src/pool_allocator.cc
+++ b/libstdc++-v3/src/pool_allocator.cc
@@ -37,8 +37,8 @@
namespace
{
- static __glibcxx_mutex_define_initialized(palloc_init_mutex);
-}
+ __gnu_cxx::__mutex palloc_init_mutex;
+} // anonymous namespace
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
@@ -50,7 +50,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
return _S_free_list + __i;
}
- mutex_type&
+ __mutex&
__pool_alloc_base::_M_get_mutex()
{ return palloc_init_mutex; }