diff options
author | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-11-05 19:17:37 +0000 |
---|---|---|
committer | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-11-05 19:17:37 +0000 |
commit | 95168ca53c3d547977698967e2ce5b67710b026b (patch) | |
tree | 951abaef5b170fb73ebd43f7f61ebdd780d1fa85 | |
parent | 9d67a43bd1a2b8be32ebfe991d8dfa6023327912 (diff) | |
download | gcc-95168ca53c3d547977698967e2ce5b67710b026b.tar.gz |
* config/os/hpux/os_defines.h (_GLIBCPP_INST_ATOMICITY_LOCK): Define.
* src/misc-inst.cc (std): Instantiate atomicity lock when
_GLIBCPP_INST_ATOMICITY_LOCK is defined.
* config/cpu/hppa/atomicity.h: New file.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58831 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/config/cpu/hppa/atomicity.h | 87 | ||||
-rw-r--r-- | libstdc++-v3/config/os/hpux/os_defines.h | 4 | ||||
-rw-r--r-- | libstdc++-v3/src/misc-inst.cc | 4 |
4 files changed, 102 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 5b8a5bb5f19..5d53a7bb9a4 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2002-11-05 John David Anglin <dave@hiauly1.hia.nrc.ca> + + * config/os/hpux/os_defines.h (_GLIBCPP_INST_ATOMICITY_LOCK): Define. + * src/misc-inst.cc (std): Instantiate atomicity lock when + _GLIBCPP_INST_ATOMICITY_LOCK is defined. + * config/cpu/hppa/atomicity.h: New file. + 2002-11-05 Benjamin Kosnik <bkoz@redhat.com> PR libstdc++/8463 diff --git a/libstdc++-v3/config/cpu/hppa/atomicity.h b/libstdc++-v3/config/cpu/hppa/atomicity.h new file mode 100644 index 00000000000..eefb32d4a8e --- /dev/null +++ b/libstdc++-v3/config/cpu/hppa/atomicity.h @@ -0,0 +1,87 @@ +/* Low-level functions for atomic operations. PA-RISC version. -*- C++ -*- + Copyright 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_ATOMICITY_H +#define _BITS_ATOMICITY_H 1 + +typedef int _Atomic_word; + +template <int __inst> +struct __Atomicity_lock +{ + static volatile int __attribute__ ((aligned (16))) _S_atomicity_lock; +}; + +template <int __inst> +volatile int __Atomicity_lock<__inst>::_S_atomicity_lock = 1; + +/* Because of the lack of weak support when using the hpux + som linker, we explicitly instantiate the atomicity lock + in src/misc-inst.cc when _GLIBCPP_INST_ATOMICITY_LOCK + is defined. */ +#ifndef _GLIBCPP_INST_ATOMICITY_LOCK +template volatile int __Atomicity_lock<0>::_S_atomicity_lock; +#endif + +static inline int +__attribute__ ((__unused__)) +__exchange_and_add (volatile _Atomic_word* __mem, int __val) +{ + _Atomic_word result; + int tmp; + volatile int& lock = __Atomicity_lock<0>::_S_atomicity_lock; + + __asm__ __volatile__ ("ldcw 0(%1),%0\n\t" + "cmpib,<>,n 0,%0,.+20\n\t" + "ldw 0(%1),%0\n\t" + "cmpib,= 0,%0,.-4\n\t" + "nop\n\t" + "b,n .-20" + : "=&r" (tmp) + : "r" (&lock)); + + result = *__mem; + *__mem = result + __val; + __asm__ __volatile__(""); + lock = tmp; + return result; +} + +static inline void +__attribute__ ((__unused__)) +__atomic_add (_Atomic_word* __mem, int __val) +{ + int tmp; + volatile int& lock = __Atomicity_lock<0>::_S_atomicity_lock; + + __asm__ __volatile__ ("ldcw 0(%1),%0\n\t" + "cmpib,<>,n 0,%0,.+20\n\t" + "ldw 0(%1),%0\n\t" + "cmpib,= 0,%0,.-4\n\t" + "nop\n\t" + "b,n .-20" + : "=&r" (tmp) + : "r" (&lock)); + + *__mem += __val; + __asm__ __volatile__(""); + lock = tmp; +} + +#endif diff --git a/libstdc++-v3/config/os/hpux/os_defines.h b/libstdc++-v3/config/os/hpux/os_defines.h index 5deef5f9edb..aae9998c552 100644 --- a/libstdc++-v3/config/os/hpux/os_defines.h +++ b/libstdc++-v3/config/os/hpux/os_defines.h @@ -84,4 +84,8 @@ namespace std typedef long int __padding_type; #endif +/* We need explicit instantiation of the atomicity lock on 32-bit HPUX. */ +#ifndef __LP64__ +#define _GLIBCPP_INST_ATOMICITY_LOCK 1 +#endif #endif diff --git a/libstdc++-v3/src/misc-inst.cc b/libstdc++-v3/src/misc-inst.cc index ff899102009..74224b1d983 100644 --- a/libstdc++-v3/src/misc-inst.cc +++ b/libstdc++-v3/src/misc-inst.cc @@ -37,6 +37,7 @@ #include <ostream> #include <algorithm> #include <vector> +#include <bits/atomicity.h> namespace std { @@ -67,6 +68,9 @@ namespace std basic_istream<wchar_t>& getline(basic_istream<wchar_t>&, wstring&); #endif +#ifdef _GLIBCPP_INST_ATOMICITY_LOCK + template volatile int __Atomicity_lock<0>::_S_atomicity_lock; +#endif #if 1 // XXX |