This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
PATCH: _Atomic_swap implementation for g++-v3/bits/stl_threads.h
- To: gcc-patches at gcc dot gnu dot org
- Subject: PATCH: _Atomic_swap implementation for g++-v3/bits/stl_threads.h
- From: Loren James Rittle <rittle at latour dot rsch dot comm dot mot dot com>
- Date: Wed, 3 Oct 2001 16:21:36 -0500 (CDT)
- CC: libstdc++ at gcc dot gnu dot org, vyzo at media dot mit dot edu
- Reply-to: rittle at labs dot mot dot com
Tested by the author of the patch against more complex use cases
(including those involving threads which we have no current way to
include in the dejagnu testsuite in a portable manner). Tested by the
committer (i.e. me) by bootstrap and check (against new test case that
had failed) on i386-unknown-freebsd4.3. Approved by Benjamin and
myself. Thanks for the contribution Dimitris.
2001-10-03 Dimitris Vyzovitis <vyzo@media.mit.edu>
* include/bits/stl_threads.h (_Atomic_swap): New function.
(_Swap_lock_struct<__dummy>::_S_swap_lock): New data.
* testsuite/ext/rope.cc: New file.
Index: include/bits/stl_threads.h
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/include/bits/stl_threads.h,v
retrieving revision 1.8
diff -c -r1.8 stl_threads.h
*** stl_threads.h 2001/06/27 17:09:52 1.8
--- stl_threads.h 2001/10/03 21:18:21
***************
*** 202,207 ****
--- 202,229 ----
// 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<int __dummy>
+ struct _Swap_lock_struct {
+ static __gthread_mutex_t _S_swap_lock;
+ };
+
+ template<int __dummy>
+ __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
Index: testsuite/ext/rope.cc
===================================================================
RCS file: rope.cc
diff -N rope.cc
*** /dev/null Tue May 5 13:32:27 1998
--- rope.cc Wed Oct 3 14:18:21 2001
***************
*** 0 ****
--- 1,38 ----
+ // 2001-10-03 From: Dimitris Vyzovitis <vyzo@media.mit.edu>
+
+ // 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 <ext/rope>
+ #include <iostream>
+
+ void test01()
+ {
+ std::crope foo;
+ foo += "bar";
+ const char* data = foo.c_str();
+ std::cout << data << std::endl;
+ }
+
+ int main()
+ {
+ test01();
+ return 0;
+ }