From 8bf4eeece3076a35dbfe8d7385b4fef2488337d6 Mon Sep 17 00:00:00 2001 From: Dimitris Vyzovitis Date: Wed, 3 Oct 2001 21:19:31 +0000 Subject: [PATCH] stl_threads.h (_Atomic_swap): New function. * include/bits/stl_threads.h (_Atomic_swap): New function. (_Swap_lock_struct<__dummy>::_S_swap_lock): New data. * testsuite/ext/rope.cc: New file. From-SVN: r45999 --- libstdc++-v3/ChangeLog | 6 ++++ libstdc++-v3/include/bits/stl_threads.h | 22 ++++++++++++++ libstdc++-v3/testsuite/ext/rope.cc | 38 +++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 libstdc++-v3/testsuite/ext/rope.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 65ec49e084f..bff34125434 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2001-10-03 Dimitris Vyzovitis + + * include/bits/stl_threads.h (_Atomic_swap): New function. + (_Swap_lock_struct<__dummy>::_S_swap_lock): New data. + * testsuite/ext/rope.cc: New file. + 2001-10-02 Benjamin Kosnik * config/locale/time_members_gnu.h: Remove. diff --git a/libstdc++-v3/include/bits/stl_threads.h b/libstdc++-v3/include/bits/stl_threads.h index b1278c1817f..dd27422f5c0 100644 --- a/libstdc++-v3/include/bits/stl_threads.h +++ b/libstdc++-v3/include/bits/stl_threads.h @@ -202,6 +202,28 @@ struct _Refcount_Base // later, if required. You can start by cloning the __STL_PTHREADS // path while making the obvious changes. Later it could be optimized // to use the atomicity.h abstraction layer from libstdc++-v3. +// vyzo: simple _Atomic_swap implementation following the guidelines above + // We use a template here only to get a unique initialized instance. + template + struct _Swap_lock_struct { + static __gthread_mutex_t _S_swap_lock; + }; + + template + __gthread_mutex_t + _Swap_lock_struct<__dummy>::_S_swap_lock = __GTHREAD_MUTEX_INIT; + + // This should be portable, but performance is expected + // to be quite awful. This really needs platform specific + // code. + inline unsigned long _Atomic_swap(unsigned long * __p, unsigned long __q) { + __gthread_mutex_lock(&_Swap_lock_struct<0>::_S_swap_lock); + unsigned long __result = *__p; + *__p = __q; + __gthread_mutex_unlock(&_Swap_lock_struct<0>::_S_swap_lock); + return __result; + } + #else // GCC extension end # ifdef __STL_SGI_THREADS diff --git a/libstdc++-v3/testsuite/ext/rope.cc b/libstdc++-v3/testsuite/ext/rope.cc new file mode 100644 index 00000000000..79eecf822b5 --- /dev/null +++ b/libstdc++-v3/testsuite/ext/rope.cc @@ -0,0 +1,38 @@ +// 2001-10-03 From: Dimitris Vyzovitis + +// Copyright (C) 2001 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// rope (SGI extension) + +#include +#include + +void test01() +{ + std::crope foo; + foo += "bar"; + const char* data = foo.c_str(); + std::cout << data << std::endl; +} + +int main() +{ + test01(); + return 0; +}