This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

PATCH: _Atomic_swap implementation for g++-v3/bits/stl_threads.h


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;
+ }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]