aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorPhil Edwards <pme@gcc.gnu.org>2003-02-13 04:02:20 +0000
committerPhil Edwards <pme@gcc.gnu.org>2003-02-13 04:02:20 +0000
commit8d55a4aa3bf047fcec347cac893772a37f08324f (patch)
treefafc83f42b8ec16ea233bdbf4e663bb360b327e4 /libstdc++-v3
parent6a540f3ca384b19191464678e75c0e34154560dd (diff)
downloadgcc-8d55a4aa3bf047fcec347cac893772a37f08324f.zip
gcc-8d55a4aa3bf047fcec347cac893772a37f08324f.tar.gz
gcc-8d55a4aa3bf047fcec347cac893772a37f08324f.tar.bz2
atomicity.h (_Atomic_add_mutex): Fix declaration.
2003-02-12 Phil Edwards <pme@gcc.gnu.org> * config/cpu/generic/atomicity.h (_Atomic_add_mutex): Fix declaration. (_GLIBCPP_NEED_GENERIC_MUTEX): Define for this file. (_Atomic_add_mutex_once, __gthread_atomic_add_mutex_once): Declare when we don't have static mutex initialization. (__exchange_and_add): Use _Atomic_add_mutex_once. * src/misc-inst.cc: Definitions of all the above. From-SVN: r62818
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog9
-rw-r--r--libstdc++-v3/config/cpu/generic/atomicity.h25
-rw-r--r--libstdc++-v3/src/misc-inst.cc18
3 files changed, 45 insertions, 7 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 1cefd52..78182b9 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,12 @@
+2003-02-12 Phil Edwards <pme@gcc.gnu.org>
+
+ * config/cpu/generic/atomicity.h (_Atomic_add_mutex): Fix declaration.
+ (_GLIBCPP_NEED_GENERIC_MUTEX): Define for this file.
+ (_Atomic_add_mutex_once, __gthread_atomic_add_mutex_once): Declare
+ when we don't have static mutex initialization.
+ (__exchange_and_add): Use _Atomic_add_mutex_once.
+ * src/misc-inst.cc: Definitions of all the above.
+
2003-02-12 Paolo Carlini <pcarlini@unitus.it>
PR libstdc++/9563
diff --git a/libstdc++-v3/config/cpu/generic/atomicity.h b/libstdc++-v3/config/cpu/generic/atomicity.h
index 2cf6c3c..829a77c 100644
--- a/libstdc++-v3/config/cpu/generic/atomicity.h
+++ b/libstdc++-v3/config/cpu/generic/atomicity.h
@@ -1,6 +1,6 @@
// Low-level functions for atomic operations: Generic version -*- C++ -*-
-// Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
+// Copyright (C) 1999, 2001, 2002, 2003 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
@@ -32,24 +32,35 @@
#include <bits/gthr.h>
+#define _GLIBCPP_NEED_GENERIC_MUTEX
+
typedef int _Atomic_word;
namespace __gnu_cxx
{
- __gthread_mutex_t _Atomic_add_mutex __attribute__ ((__weak__))
- = __GTHREAD_MUTEX_INIT;
+ extern __gthread_mutex_t _Atomic_add_mutex;
+
+#ifndef __GTHREAD_MUTEX_INIT
+ extern __gthread_once_t _Atomic_add_mutex_once;
+ extern void __gthread_atomic_add_mutex_once();
+#endif
}
static inline _Atomic_word
__attribute__ ((__unused__))
__exchange_and_add (volatile _Atomic_word* __mem, int __val)
{
- _Atomic_word __result;
+#ifndef __GTHREAD_MUTEX_INIT
+ __gthread_once (&__gnu_cxx::_Atomic_add_mutex_once,
+ __gnu_cxx::__gthread_atomic_add_mutex_once);
+#endif
+
+ _Atomic_word __result;
- __gthread_mutex_lock (&__gnu_cxx::_Atomic_add_mutex);
+ __gthread_mutex_lock (&__gnu_cxx::_Atomic_add_mutex);
- __result = *__mem;
- *__mem += __val;
+ __result = *__mem;
+ *__mem += __val;
__gthread_mutex_unlock (&__gnu_cxx::_Atomic_add_mutex);
return __result;
diff --git a/libstdc++-v3/src/misc-inst.cc b/libstdc++-v3/src/misc-inst.cc
index e612aa4..df2949d0 100644
--- a/libstdc++-v3/src/misc-inst.cc
+++ b/libstdc++-v3/src/misc-inst.cc
@@ -72,3 +72,21 @@ namespace std
template volatile int __Atomicity_lock<0>::_S_atomicity_lock;
#endif
} // namespace std
+
+#ifdef _GLIBCPP_NEED_GENERIC_MUTEX
+namespace __gnu_cxx
+{
+#ifdef __GTHREAD_MUTEX_INIT
+ __gthread_mutex_t _Atomic_add_mutex = __GTHREAD_MUTEX_INIT;
+#else
+ // generic atomicity.h without static initialization
+ __gthread_mutex_t _Atomic_add_mutex;
+ __gthread_once_t _Atomic_add_mutex_once = __GTHREAD_ONCE_INIT;
+ void __gthread_atomic_add_mutex_once()
+ {
+ __GTHREAD_MUTEX_INIT_FUNCTION (&_Atomic_add_mutex);
+ }
+#endif
+} // namespace __gnu_cxx
+#endif // _GLIBCPP_NEED_GLOBAL_MUTEX
+