From: Davi Arnaut Date: July 5 2010 12:00pm Subject: bzr commit into mysql-5.1-bugteam branch (davi:3463) Bug#22320 List-Archive: http://lists.mysql.com/commits/112882 X-Bug: 22320 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============3466350272576763440==" --===============3466350272576763440== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline # At a local mysql-5.1-bugteam repository of davi 3463 Davi Arnaut 2010-07-05 Bug#22320: my_atomic-t unit test fails The atomic operations implementation on 5.1 has a few problems, which might cause tests to abort randomly. Since no code in 5.1 uses atomic operations, simply remove the code. removed: include/atomic/ include/atomic/gcc_builtins.h include/atomic/nolock.h include/atomic/rwlock.h include/atomic/x86-gcc.h include/atomic/x86-msvc.h include/my_atomic.h mysys/my_atomic.c unittest/mysys/my_atomic-t.c modified: include/Makefile.am include/my_pthread.h mysys/Makefile.am storage/ibmdb2i/db2i_file.h unittest/mysys/Makefile.am === modified file 'include/Makefile.am' --- a/include/Makefile.am 2009-03-20 11:18:29 +0000 +++ b/include/Makefile.am 2010-07-05 12:00:39 +0000 @@ -36,10 +36,8 @@ noinst_HEADERS = config-win.h config-net my_nosys.h my_alarm.h queues.h rijndael.h sha1.h \ my_aes.h my_tree.h my_trie.h hash.h thr_alarm.h \ thr_lock.h t_ctype.h violite.h my_md5.h base64.h \ - my_handler.h my_time.h \ - my_vle.h my_user.h my_atomic.h atomic/nolock.h \ - atomic/rwlock.h atomic/x86-gcc.h atomic/x86-msvc.h \ - atomic/gcc_builtins.h my_libwrap.h my_stacktrace.h + my_handler.h my_time.h my_vle.h my_user.h \ + my_libwrap.h my_stacktrace.h EXTRA_DIST = mysql.h.pp mysql/plugin.h.pp === removed directory 'include/atomic' === removed file 'include/atomic/gcc_builtins.h' --- a/include/atomic/gcc_builtins.h 2008-01-11 22:34:36 +0000 +++ b/include/atomic/gcc_builtins.h 1970-01-01 00:00:00 +0000 @@ -1,33 +0,0 @@ -/* Copyright (C) 2008 MySQL AB - - This program 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; version 2 of the License. - - This program 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 program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#define make_atomic_add_body(S) \ - v= __sync_fetch_and_add(a, v); -#define make_atomic_swap_body(S) \ - v= __sync_lock_test_and_set(a, v); -#define make_atomic_cas_body(S) \ - int ## S sav; \ - sav= __sync_val_compare_and_swap(a, *cmp, set); \ - if (!(ret= (sav == *cmp))) *cmp= sav; - -#ifdef MY_ATOMIC_MODE_DUMMY -#define make_atomic_load_body(S) ret= *a -#define make_atomic_store_body(S) *a= v -#else -#define make_atomic_load_body(S) \ - ret= __sync_fetch_and_or(a, 0); -#define make_atomic_store_body(S) \ - (void) __sync_lock_test_and_set(a, v); -#endif === removed file 'include/atomic/nolock.h' --- a/include/atomic/nolock.h 2008-01-11 22:34:36 +0000 +++ b/include/atomic/nolock.h 1970-01-01 00:00:00 +0000 @@ -1,44 +0,0 @@ -/* Copyright (C) 2006 MySQL AB - - This program 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; version 2 of the License. - - This program 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 program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#if defined(__i386__) || defined(_M_IX86) || defined(HAVE_GCC_ATOMIC_BUILTINS) - -#ifdef MY_ATOMIC_MODE_DUMMY -# define LOCK "" -#else -# define LOCK "lock" -#endif - -#ifdef HAVE_GCC_ATOMIC_BUILTINS -#include "gcc_builtins.h" -#elif __GNUC__ -#include "x86-gcc.h" -#elif defined(_MSC_VER) -#include "x86-msvc.h" -#endif -#endif - -#ifdef make_atomic_cas_body - -typedef struct { } my_atomic_rwlock_t; -#define my_atomic_rwlock_destroy(name) -#define my_atomic_rwlock_init(name) -#define my_atomic_rwlock_rdlock(name) -#define my_atomic_rwlock_wrlock(name) -#define my_atomic_rwlock_rdunlock(name) -#define my_atomic_rwlock_wrunlock(name) - -#endif - === removed file 'include/atomic/rwlock.h' --- a/include/atomic/rwlock.h 2006-12-27 01:23:51 +0000 +++ b/include/atomic/rwlock.h 1970-01-01 00:00:00 +0000 @@ -1,48 +0,0 @@ -/* Copyright (C) 2006 MySQL AB - - This program 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; version 2 of the License. - - This program 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 program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -typedef struct {pthread_rwlock_t rw;} my_atomic_rwlock_t; - -#ifdef MY_ATOMIC_MODE_DUMMY -/* - the following can never be enabled by ./configure, one need to put #define in - a source to trigger the following warning. The resulting code will be broken, - it only makes sense to do it to see now test_atomic detects broken - implementations (another way is to run a UP build on an SMP box). -*/ -#warning MY_ATOMIC_MODE_DUMMY and MY_ATOMIC_MODE_RWLOCKS are incompatible -#define my_atomic_rwlock_destroy(name) -#define my_atomic_rwlock_init(name) -#define my_atomic_rwlock_rdlock(name) -#define my_atomic_rwlock_wrlock(name) -#define my_atomic_rwlock_rdunlock(name) -#define my_atomic_rwlock_wrunlock(name) -#define MY_ATOMIC_MODE "dummy (non-atomic)" -#else -#define my_atomic_rwlock_destroy(name) pthread_rwlock_destroy(& (name)->rw) -#define my_atomic_rwlock_init(name) pthread_rwlock_init(& (name)->rw, 0) -#define my_atomic_rwlock_rdlock(name) pthread_rwlock_rdlock(& (name)->rw) -#define my_atomic_rwlock_wrlock(name) pthread_rwlock_wrlock(& (name)->rw) -#define my_atomic_rwlock_rdunlock(name) pthread_rwlock_unlock(& (name)->rw) -#define my_atomic_rwlock_wrunlock(name) pthread_rwlock_unlock(& (name)->rw) -#define MY_ATOMIC_MODE "rwlocks" -#endif - -#define make_atomic_add_body(S) int ## S sav; sav= *a; *a+= v; v=sav; -#define make_atomic_swap_body(S) int ## S sav; sav= *a; *a= v; v=sav; -#define make_atomic_cas_body(S) if ((ret= (*a == *cmp))) *a= set; else *cmp=*a; -#define make_atomic_load_body(S) ret= *a; -#define make_atomic_store_body(S) *a= v; - === removed file 'include/atomic/x86-gcc.h' --- a/include/atomic/x86-gcc.h 2006-12-27 01:23:51 +0000 +++ b/include/atomic/x86-gcc.h 1970-01-01 00:00:00 +0000 @@ -1,58 +0,0 @@ -/* Copyright (C) 2006 MySQL AB - - This program 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; version 2 of the License. - - This program 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 program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -/* - XXX 64-bit atomic operations can be implemented using - cmpxchg8b, if necessary. Though I've heard that not all 64-bit - architectures support double-word (128-bit) cas. -*/ - -#ifdef MY_ATOMIC_NO_XADD -#define MY_ATOMIC_MODE "gcc-x86" LOCK "-no-xadd" -#else -#define MY_ATOMIC_MODE "gcc-x86" LOCK -#endif - -/* fix -ansi errors while maintaining readability */ -#ifndef asm -#define asm __asm__ -#endif - -#ifndef MY_ATOMIC_NO_XADD -#define make_atomic_add_body(S) \ - asm volatile (LOCK "; xadd %0, %1;" : "+r" (v) , "+m" (*a)) -#endif -#define make_atomic_swap_body(S) \ - asm volatile ("; xchg %0, %1;" : "+r" (v) , "+m" (*a)) -#define make_atomic_cas_body(S) \ - asm volatile (LOCK "; cmpxchg %3, %0; setz %2;" \ - : "+m" (*a), "+a" (*cmp), "=q" (ret): "r" (set)) - -#ifdef MY_ATOMIC_MODE_DUMMY -#define make_atomic_load_body(S) ret=*a -#define make_atomic_store_body(S) *a=v -#else -/* - Actually 32-bit reads/writes are always atomic on x86 - But we add LOCK here anyway to force memory barriers -*/ -#define make_atomic_load_body(S) \ - ret=0; \ - asm volatile (LOCK "; cmpxchg %2, %0" \ - : "+m" (*a), "+a" (ret): "r" (ret)) -#define make_atomic_store_body(S) \ - asm volatile ("; xchg %0, %1;" : "+m" (*a) : "r" (v)) -#endif - === removed file 'include/atomic/x86-msvc.h' --- a/include/atomic/x86-msvc.h 2006-12-27 01:23:51 +0000 +++ b/include/atomic/x86-msvc.h 1970-01-01 00:00:00 +0000 @@ -1,96 +0,0 @@ -/* Copyright (C) 2006 MySQL AB - - This program 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; version 2 of the License. - - This program 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 program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -/* - XXX 64-bit atomic operations can be implemented using - cmpxchg8b, if necessary -*/ - -// Would it be better to use intrinsics ? -// (InterlockedCompareExchange, InterlockedCompareExchange16 -// InterlockedExchangeAdd, InterlockedExchange) - -#ifndef _atomic_h_cleanup_ -#define _atomic_h_cleanup_ "atomic/x86-msvc.h" - -#define MY_ATOMIC_MODE "msvc-x86" LOCK - -#define make_atomic_add_body(S) \ - _asm { \ - _asm mov reg_ ## S, v \ - _asm LOCK xadd *a, reg_ ## S \ - _asm movzx v, reg_ ## S \ - } -#define make_atomic_cas_body(S) \ - _asm { \ - _asm mov areg_ ## S, *cmp \ - _asm mov reg2_ ## S, set \ - _asm LOCK cmpxchg *a, reg2_ ## S \ - _asm mov *cmp, areg_ ## S \ - _asm setz al \ - _asm movzx ret, al \ - } -#define make_atomic_swap_body(S) \ - _asm { \ - _asm mov reg_ ## S, v \ - _asm xchg *a, reg_ ## S \ - _asm mov v, reg_ ## S \ - } - -#ifdef MY_ATOMIC_MODE_DUMMY -#define make_atomic_load_body(S) ret=*a -#define make_atomic_store_body(S) *a=v -#else -/* - Actually 32-bit reads/writes are always atomic on x86 - But we add LOCK here anyway to force memory barriers -*/ -#define make_atomic_load_body(S) \ - _asm { \ - _asm mov areg_ ## S, 0 \ - _asm mov reg2_ ## S, areg_ ## S \ - _asm LOCK cmpxchg *a, reg2_ ## S \ - _asm mov ret, areg_ ## S \ - } -#define make_atomic_store_body(S) \ - _asm { \ - _asm mov reg_ ## S, v \ - _asm xchg *a, reg_ ## S \ - } -#endif - -#define reg_8 al -#define reg_16 ax -#define reg_32 eax -#define areg_8 al -#define areg_16 ax -#define areg_32 eax -#define reg2_8 bl -#define reg2_16 bx -#define reg2_32 ebx - -#else /* cleanup */ - -#undef reg_8 -#undef reg_16 -#undef reg_32 -#undef areg_8 -#undef areg_16 -#undef areg_32 -#undef reg2_8 -#undef reg2_16 -#undef reg2_32 -#endif - === removed file 'include/my_atomic.h' --- a/include/my_atomic.h 2007-10-16 15:03:13 +0000 +++ b/include/my_atomic.h 1970-01-01 00:00:00 +0000 @@ -1,142 +0,0 @@ -/* Copyright (C) 2006 MySQL AB - - This program 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; version 2 of the License. - - This program 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 program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef my_atomic_rwlock_init - -#define intptr void * - -#ifndef MY_ATOMIC_MODE_RWLOCKS -#include "atomic/nolock.h" -#endif - -#ifndef make_atomic_cas_body -#include "atomic/rwlock.h" -#endif - -#ifndef make_atomic_add_body -#define make_atomic_add_body(S) \ - int ## S tmp=*a; \ - while (!my_atomic_cas ## S(a, &tmp, tmp+v)); \ - v=tmp; -#endif - -#ifdef HAVE_INLINE - -#define make_atomic_add(S) \ -STATIC_INLINE int ## S my_atomic_add ## S( \ - int ## S volatile *a, int ## S v) \ -{ \ - make_atomic_add_body(S); \ - return v; \ -} - -#define make_atomic_swap(S) \ -STATIC_INLINE int ## S my_atomic_swap ## S( \ - int ## S volatile *a, int ## S v) \ -{ \ - make_atomic_swap_body(S); \ - return v; \ -} - -#define make_atomic_cas(S) \ -STATIC_INLINE int my_atomic_cas ## S(int ## S volatile *a, \ - int ## S *cmp, int ## S set) \ -{ \ - int8 ret; \ - make_atomic_cas_body(S); \ - return ret; \ -} - -#define make_atomic_load(S) \ -STATIC_INLINE int ## S my_atomic_load ## S(int ## S volatile *a) \ -{ \ - int ## S ret; \ - make_atomic_load_body(S); \ - return ret; \ -} - -#define make_atomic_store(S) \ -STATIC_INLINE void my_atomic_store ## S( \ - int ## S volatile *a, int ## S v) \ -{ \ - make_atomic_store_body(S); \ -} - -#else /* no inline functions */ - -#define make_atomic_add(S) \ -extern int ## S my_atomic_add ## S(int ## S volatile *a, int ## S v); - -#define make_atomic_swap(S) \ -extern int ## S my_atomic_swap ## S(int ## S volatile *a, int ## S v); - -#define make_atomic_cas(S) \ -extern int my_atomic_cas ## S(int ## S volatile *a, int ## S *cmp, int ## S set); - -#define make_atomic_load(S) \ -extern int ## S my_atomic_load ## S(int ## S volatile *a); - -#define make_atomic_store(S) \ -extern void my_atomic_store ## S(int ## S volatile *a, int ## S v); - -#endif - -make_atomic_cas( 8) -make_atomic_cas(16) -make_atomic_cas(32) -make_atomic_cas(ptr) - -make_atomic_add( 8) -make_atomic_add(16) -make_atomic_add(32) - -make_atomic_load( 8) -make_atomic_load(16) -make_atomic_load(32) -make_atomic_load(ptr) - -make_atomic_store( 8) -make_atomic_store(16) -make_atomic_store(32) -make_atomic_store(ptr) - -make_atomic_swap( 8) -make_atomic_swap(16) -make_atomic_swap(32) -make_atomic_swap(ptr) - -#undef make_atomic_add -#undef make_atomic_cas -#undef make_atomic_load -#undef make_atomic_store -#undef make_atomic_swap -#undef make_atomic_add_body -#undef make_atomic_cas_body -#undef make_atomic_load_body -#undef make_atomic_store_body -#undef make_atomic_swap_body -#undef intptr - -#ifdef _atomic_h_cleanup_ -#include _atomic_h_cleanup_ -#undef _atomic_h_cleanup_ -#endif - -#define MY_ATOMIC_OK 0 -#define MY_ATOMIC_NOT_1CPU 1 -extern int my_atomic_initialize(); - -#endif - === modified file 'include/my_pthread.h' --- a/include/my_pthread.h 2009-12-12 18:11:25 +0000 +++ b/include/my_pthread.h 2010-07-05 12:00:39 +0000 @@ -715,7 +715,7 @@ extern uint thd_lib_detected; The implementation is guaranteed to be thread safe, on all platforms. Note that the calling code should *not* assume the counter is protected by the mutex given, as the implementation of these helpers may change - to use my_atomic operations instead. + to use atomic operations instead. */ /* === modified file 'mysys/Makefile.am' --- a/mysys/Makefile.am 2009-10-06 11:04:51 +0000 +++ b/mysys/Makefile.am 2010-07-05 12:00:39 +0000 @@ -30,8 +30,7 @@ libmysys_a_SOURCES = my_init.c my_get mf_tempdir.c my_lock.c mf_brkhant.c my_alarm.c \ my_malloc.c my_realloc.c my_once.c mulalloc.c \ my_alloc.c safemalloc.c my_new.cc \ - my_vle.c my_atomic.c \ - my_fopen.c my_fstream.c my_getsystime.c \ + my_vle.c my_fopen.c my_fstream.c my_getsystime.c \ my_error.c errors.c my_div.c my_messnc.c \ mf_format.c mf_same.c mf_dirname.c mf_fn_ext.c \ my_symlink.c my_symlink2.c \ === removed file 'mysys/my_atomic.c' --- a/mysys/my_atomic.c 2007-10-11 15:07:40 +0000 +++ b/mysys/my_atomic.c 1970-01-01 00:00:00 +0000 @@ -1,45 +0,0 @@ -/* Copyright (C) 2006 MySQL AB - - This program 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; version 2 of the License. - - This program 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 program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include - -#ifndef HAVE_INLINE -/* the following will cause all inline functions to be instantiated */ -#define HAVE_INLINE -#undef STATIC_INLINE -#define STATIC_INLINE extern -#endif - -#include - -/* - checks that the current build of atomic ops - can run on this machine - - RETURN - ATOMIC_xxx values, see my_atomic.h -*/ -int my_atomic_initialize() -{ - compile_time_assert(sizeof(intptr) == sizeof(void *)); - /* currently the only thing worth checking is SMP/UP issue */ -#ifdef MY_ATOMIC_MODE_DUMMY - return my_getncpus() == 1 ? MY_ATOMIC_OK : MY_ATOMIC_NOT_1CPU; -#else - return MY_ATOMIC_OK; -#endif -} - === modified file 'storage/ibmdb2i/db2i_file.h' --- a/storage/ibmdb2i/db2i_file.h 2009-03-09 21:20:14 +0000 +++ b/storage/ibmdb2i/db2i_file.h 2010-07-05 12:00:39 +0000 @@ -40,7 +40,6 @@ OF SUCH DAMAGE. #include "db2i_global.h" #include "db2i_ileBridge.h" #include "db2i_validatedPointer.h" -#include "my_atomic.h" #include "db2i_iconv.h" #include "db2i_charsetSupport.h" === modified file 'unittest/mysys/Makefile.am' --- a/unittest/mysys/Makefile.am 2009-09-17 16:34:24 +0000 +++ b/unittest/mysys/Makefile.am 2010-07-05 12:00:39 +0000 @@ -23,12 +23,5 @@ LDADD = $(top_builddir)/unittest/mytap noinst_PROGRAMS = bitmap-t base64-t -if NEED_THREAD -# my_atomic-t is used to check thread functions, so it is safe to -# ignore the file in non-threaded builds. -# In fact, it will not compile without thread support. -noinst_PROGRAMS += my_atomic-t -endif - # Don't update the files from bitkeeper %::SCCS/s.% === removed file 'unittest/mysys/my_atomic-t.c' --- a/unittest/mysys/my_atomic-t.c 2007-12-20 22:58:09 +0000 +++ b/unittest/mysys/my_atomic-t.c 1970-01-01 00:00:00 +0000 @@ -1,205 +0,0 @@ -/* Copyright (C) 2006 MySQL AB - - This program 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; version 2 of the License. - - This program 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 program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include - -/* at least gcc 3.4.5 and 3.4.6 (but not 3.2.3) on RHEL */ -#if __GNUC__ == 3 && __GNUC_MINOR__ == 4 -#define GCC_BUG_WORKAROUND volatile -#else -#define GCC_BUG_WORKAROUND -#endif - -int32 a32,b32,c32; -my_atomic_rwlock_t rwl; - -pthread_attr_t thr_attr; -pthread_mutex_t mutex; -pthread_cond_t cond; -int N; - -/* add and sub a random number in a loop. Must get 0 at the end */ -pthread_handler_t test_atomic_add_handler(void *arg) -{ - int m=*(int *)arg; - GCC_BUG_WORKAROUND int32 x; - for (x=((int)((long)(&m))); m ; m--) - { - x=x*m+0x87654321; - my_atomic_rwlock_wrlock(&rwl); - my_atomic_add32(&a32, x); - my_atomic_rwlock_wrunlock(&rwl); - - my_atomic_rwlock_wrlock(&rwl); - my_atomic_add32(&a32, -x); - my_atomic_rwlock_wrunlock(&rwl); - } - pthread_mutex_lock(&mutex); - N--; - if (!N) pthread_cond_signal(&cond); - pthread_mutex_unlock(&mutex); - return 0; -} - -/* - 1. generate thread number 0..N-1 from b32 - 2. add it to a32 - 3. swap thread numbers in c32 - 4. (optionally) one more swap to avoid 0 as a result - 5. subtract result from a32 - must get 0 in a32 at the end -*/ -pthread_handler_t test_atomic_swap_handler(void *arg) -{ - int m=*(int *)arg; - int32 x; - - my_atomic_rwlock_wrlock(&rwl); - x=my_atomic_add32(&b32, 1); - my_atomic_rwlock_wrunlock(&rwl); - - my_atomic_rwlock_wrlock(&rwl); - my_atomic_add32(&a32, x); - my_atomic_rwlock_wrunlock(&rwl); - - for (; m ; m--) - { - my_atomic_rwlock_wrlock(&rwl); - x=my_atomic_swap32(&c32, x); - my_atomic_rwlock_wrunlock(&rwl); - } - - if (!x) - { - my_atomic_rwlock_wrlock(&rwl); - x=my_atomic_swap32(&c32, x); - my_atomic_rwlock_wrunlock(&rwl); - } - - my_atomic_rwlock_wrlock(&rwl); - my_atomic_add32(&a32, -x); - my_atomic_rwlock_wrunlock(&rwl); - - pthread_mutex_lock(&mutex); - N--; - if (!N) pthread_cond_signal(&cond); - pthread_mutex_unlock(&mutex); - return 0; -} - -/* - same as test_atomic_add_handler, but my_atomic_add32 is emulated with - (slower) my_atomic_cas32 -*/ -pthread_handler_t test_atomic_cas_handler(void *arg) -{ - int m=*(int *)arg, ok; - GCC_BUG_WORKAROUND int32 x,y; - for (x=((int)((long)(&m))); m ; m--) - { - my_atomic_rwlock_wrlock(&rwl); - y=my_atomic_load32(&a32); - my_atomic_rwlock_wrunlock(&rwl); - - x=x*m+0x87654321; - do { - my_atomic_rwlock_wrlock(&rwl); - ok=my_atomic_cas32(&a32, &y, y+x); - my_atomic_rwlock_wrunlock(&rwl); - } while (!ok); - do { - my_atomic_rwlock_wrlock(&rwl); - ok=my_atomic_cas32(&a32, &y, y-x); - my_atomic_rwlock_wrunlock(&rwl); - } while (!ok); - } - pthread_mutex_lock(&mutex); - N--; - if (!N) pthread_cond_signal(&cond); - pthread_mutex_unlock(&mutex); - return 0; -} - -void test_atomic(const char *test, pthread_handler handler, int n, int m) -{ - pthread_t t; - ulonglong now=my_getsystime(); - - a32= 0; - b32= 0; - c32= 0; - - diag("Testing %s with %d threads, %d iterations... ", test, n, m); - for (N=n ; n ; n--) - { - if (pthread_create(&t, &thr_attr, handler, &m) != 0) - { - diag("Could not create thread"); - a32= 1; - goto err; - } - } - - pthread_mutex_lock(&mutex); - while (N) - pthread_cond_wait(&cond, &mutex); - pthread_mutex_unlock(&mutex); - now=my_getsystime()-now; -err: - ok(a32 == 0, "tested %s in %g secs", test, ((double)now)/1e7); -} - -int main() -{ - int err; - MY_INIT("my_atomic-t.c"); - - diag("N CPUs: %d", my_getncpus()); - err= my_atomic_initialize(); - - plan(4); - ok(err == 0, "my_atomic_initialize() returned %d", err); - - pthread_attr_init(&thr_attr); - pthread_attr_setdetachstate(&thr_attr,PTHREAD_CREATE_DETACHED); - pthread_mutex_init(&mutex, 0); - pthread_cond_init(&cond, 0); - my_atomic_rwlock_init(&rwl); - -#ifdef HPUX11 -#define CYCLES 1000 -#else -#define CYCLES 10000 -#endif -#define THREADS 100 - test_atomic("my_atomic_add32", test_atomic_add_handler, THREADS, CYCLES); - test_atomic("my_atomic_swap32", test_atomic_swap_handler, THREADS, CYCLES); - test_atomic("my_atomic_cas32", test_atomic_cas_handler, THREADS, CYCLES); - /* - workaround until we know why it crashes randomly on some machine - (BUG#22320). - */ - sleep(2); - - pthread_mutex_destroy(&mutex); - pthread_cond_destroy(&cond); - pthread_attr_destroy(&thr_attr); - my_atomic_rwlock_destroy(&rwl); - return exit_status(); -} - --===============3466350272576763440== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/davi.arnaut@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: davi.arnaut@stripped # target_branch: file:///home/davi/bzr/bugs/22320-5.1/ # testament_sha1: 29d3ee934fb24d0d89b801698127984e2c1377f7 # timestamp: 2010-07-05 09:00:49 -0300 # base_revision_id: li-bing.song@stripped\ # vvmr9uarnxhkxsis # # Begin bundle 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 --===============3466350272576763440==--