2009-01-15 22:27:36 +01:00
|
|
|
/* Copyright (C) 2006-2008 MySQL AB, 2008 Sun Microsystems, Inc.
|
unittest:
rename *.t* to *-t* to be automake-friendly
simplify Makefiles
test_atomic.c:
move to unittest, add GPL comment, fix warnings, convert to tap framework.
configure:
remove custom tests for available types, use AC_CHECK_TYPE instead
x86-gcc.h:
fix gcc -ansi errors while maintaining readability
ignore:
added *-t
unittest/mysys/base64-t.c:
Rename: unittest/mysys/base64.t.c -> unittest/mysys/base64-t.c
unittest/mysys/bitmap-t.c:
Rename: unittest/mysys/bitmap.t.c -> unittest/mysys/bitmap-t.c
unittest/mytap/t/basic-t.c:
Rename: unittest/mytap/t/basic.t.c -> unittest/mytap/t/basic-t.c
unittest/examples/no_plan-t.c:
Rename: unittest/examples/no_plan.t.c -> unittest/examples/no_plan-t.c
unittest/examples/simple-t.c:
Rename: unittest/examples/simple.t.c -> unittest/examples/simple-t.c
unittest/examples/skip-t.c:
Rename: unittest/examples/skip.t.c -> unittest/examples/skip-t.c
unittest/examples/skip_all-t.c:
Rename: unittest/examples/skip_all.t.c -> unittest/examples/skip_all-t.c
unittest/examples/todo-t.c:
Rename: unittest/examples/todo.t.c -> unittest/examples/todo-t.c
BitKeeper/etc/ignore:
added *-t
config/ac-macros/misc.m4:
remove custom AC_TRY_RUN tests for available types, use AC_CHECK_TYPE instead
configure.in:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/atomic/x86-gcc.h:
fix gcc -ansi errors while maintaining readability
include/my_global.h:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/my_sys.h:
add missing declaration
mysys/Makefile.am:
move test_atomic to unittest
unittest/Makefile.am:
simplifications, correct permissions in chmod
unittest/README.txt:
rename *.t* to *-t* to be automake-friendly
unittest/examples/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/my_atomic-t.c:
move mysys/test_atomic.c to unittest, add GPL comment, fix warnings,
convert to tap framework.
unittest/mytap/t/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/unit.pl:
rename *.t* to *-t* to be automake-friendly
2006-06-01 12:25:47 +02:00
|
|
|
|
|
|
|
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
|
2006-12-27 02:23:51 +01:00
|
|
|
the Free Software Foundation; version 2 of the License.
|
unittest:
rename *.t* to *-t* to be automake-friendly
simplify Makefiles
test_atomic.c:
move to unittest, add GPL comment, fix warnings, convert to tap framework.
configure:
remove custom tests for available types, use AC_CHECK_TYPE instead
x86-gcc.h:
fix gcc -ansi errors while maintaining readability
ignore:
added *-t
unittest/mysys/base64-t.c:
Rename: unittest/mysys/base64.t.c -> unittest/mysys/base64-t.c
unittest/mysys/bitmap-t.c:
Rename: unittest/mysys/bitmap.t.c -> unittest/mysys/bitmap-t.c
unittest/mytap/t/basic-t.c:
Rename: unittest/mytap/t/basic.t.c -> unittest/mytap/t/basic-t.c
unittest/examples/no_plan-t.c:
Rename: unittest/examples/no_plan.t.c -> unittest/examples/no_plan-t.c
unittest/examples/simple-t.c:
Rename: unittest/examples/simple.t.c -> unittest/examples/simple-t.c
unittest/examples/skip-t.c:
Rename: unittest/examples/skip.t.c -> unittest/examples/skip-t.c
unittest/examples/skip_all-t.c:
Rename: unittest/examples/skip_all.t.c -> unittest/examples/skip_all-t.c
unittest/examples/todo-t.c:
Rename: unittest/examples/todo.t.c -> unittest/examples/todo-t.c
BitKeeper/etc/ignore:
added *-t
config/ac-macros/misc.m4:
remove custom AC_TRY_RUN tests for available types, use AC_CHECK_TYPE instead
configure.in:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/atomic/x86-gcc.h:
fix gcc -ansi errors while maintaining readability
include/my_global.h:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/my_sys.h:
add missing declaration
mysys/Makefile.am:
move test_atomic to unittest
unittest/Makefile.am:
simplifications, correct permissions in chmod
unittest/README.txt:
rename *.t* to *-t* to be automake-friendly
unittest/examples/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/my_atomic-t.c:
move mysys/test_atomic.c to unittest, add GPL comment, fix warnings,
convert to tap framework.
unittest/mytap/t/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/unit.pl:
rename *.t* to *-t* to be automake-friendly
2006-06-01 12:25:47 +02:00
|
|
|
|
|
|
|
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 */
|
|
|
|
|
2008-07-29 16:10:24 +02:00
|
|
|
#include "thr_template.c"
|
2006-05-31 18:44:09 +02:00
|
|
|
|
2007-12-20 23:58:09 +01:00
|
|
|
/* 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
|
|
|
|
|
2008-07-29 16:10:24 +02:00
|
|
|
volatile uint32 b32;
|
|
|
|
volatile int32 c32;
|
2006-05-31 18:44:09 +02:00
|
|
|
my_atomic_rwlock_t rwl;
|
|
|
|
|
|
|
|
/* add and sub a random number in a loop. Must get 0 at the end */
|
2008-07-29 16:10:24 +02:00
|
|
|
pthread_handler_t test_atomic_add(void *arg)
|
2006-05-31 18:44:09 +02:00
|
|
|
{
|
2006-10-22 16:05:18 +02:00
|
|
|
int m= (*(int *)arg)/2;
|
2007-12-20 23:58:09 +01:00
|
|
|
GCC_BUG_WORKAROUND int32 x;
|
2006-10-22 16:05:18 +02:00
|
|
|
for (x= ((int)(intptr)(&m)); m ; m--)
|
2006-05-31 18:44:09 +02:00
|
|
|
{
|
2006-10-22 16:05:18 +02:00
|
|
|
x= (x*m+0x87654321) & INT_MAX32;
|
2006-06-17 16:20:39 +02:00
|
|
|
my_atomic_rwlock_wrlock(&rwl);
|
2008-07-29 16:10:24 +02:00
|
|
|
my_atomic_add32(&bad, x);
|
2006-06-17 16:20:39 +02:00
|
|
|
my_atomic_rwlock_wrunlock(&rwl);
|
|
|
|
|
|
|
|
my_atomic_rwlock_wrlock(&rwl);
|
2008-07-29 16:10:24 +02:00
|
|
|
my_atomic_add32(&bad, -x);
|
2006-06-17 16:20:39 +02:00
|
|
|
my_atomic_rwlock_wrunlock(&rwl);
|
2006-05-31 18:44:09 +02:00
|
|
|
}
|
2008-01-10 13:21:53 +01:00
|
|
|
pthread_mutex_lock(&mutex);
|
|
|
|
if (!--running_threads) pthread_cond_signal(&cond);
|
|
|
|
pthread_mutex_unlock(&mutex);
|
unittest:
rename *.t* to *-t* to be automake-friendly
simplify Makefiles
test_atomic.c:
move to unittest, add GPL comment, fix warnings, convert to tap framework.
configure:
remove custom tests for available types, use AC_CHECK_TYPE instead
x86-gcc.h:
fix gcc -ansi errors while maintaining readability
ignore:
added *-t
unittest/mysys/base64-t.c:
Rename: unittest/mysys/base64.t.c -> unittest/mysys/base64-t.c
unittest/mysys/bitmap-t.c:
Rename: unittest/mysys/bitmap.t.c -> unittest/mysys/bitmap-t.c
unittest/mytap/t/basic-t.c:
Rename: unittest/mytap/t/basic.t.c -> unittest/mytap/t/basic-t.c
unittest/examples/no_plan-t.c:
Rename: unittest/examples/no_plan.t.c -> unittest/examples/no_plan-t.c
unittest/examples/simple-t.c:
Rename: unittest/examples/simple.t.c -> unittest/examples/simple-t.c
unittest/examples/skip-t.c:
Rename: unittest/examples/skip.t.c -> unittest/examples/skip-t.c
unittest/examples/skip_all-t.c:
Rename: unittest/examples/skip_all.t.c -> unittest/examples/skip_all-t.c
unittest/examples/todo-t.c:
Rename: unittest/examples/todo.t.c -> unittest/examples/todo-t.c
BitKeeper/etc/ignore:
added *-t
config/ac-macros/misc.m4:
remove custom AC_TRY_RUN tests for available types, use AC_CHECK_TYPE instead
configure.in:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/atomic/x86-gcc.h:
fix gcc -ansi errors while maintaining readability
include/my_global.h:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/my_sys.h:
add missing declaration
mysys/Makefile.am:
move test_atomic to unittest
unittest/Makefile.am:
simplifications, correct permissions in chmod
unittest/README.txt:
rename *.t* to *-t* to be automake-friendly
unittest/examples/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/my_atomic-t.c:
move mysys/test_atomic.c to unittest, add GPL comment, fix warnings,
convert to tap framework.
unittest/mytap/t/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/unit.pl:
rename *.t* to *-t* to be automake-friendly
2006-06-01 12:25:47 +02:00
|
|
|
return 0;
|
2006-05-31 18:44:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
1. generate thread number 0..N-1 from b32
|
2008-07-29 16:10:24 +02:00
|
|
|
2. add it to bad
|
2006-05-31 18:44:09 +02:00
|
|
|
3. swap thread numbers in c32
|
|
|
|
4. (optionally) one more swap to avoid 0 as a result
|
2008-07-29 16:10:24 +02:00
|
|
|
5. subtract result from bad
|
|
|
|
must get 0 in bad at the end
|
2006-05-31 18:44:09 +02:00
|
|
|
*/
|
2008-07-29 16:10:24 +02:00
|
|
|
pthread_handler_t test_atomic_fas(void *arg)
|
2006-05-31 18:44:09 +02:00
|
|
|
{
|
2006-10-22 16:05:18 +02:00
|
|
|
int m= *(int *)arg;
|
2008-01-10 13:21:53 +01:00
|
|
|
int32 x;
|
2006-06-17 16:20:39 +02:00
|
|
|
|
2008-01-10 13:21:53 +01:00
|
|
|
my_atomic_rwlock_wrlock(&rwl);
|
|
|
|
x= my_atomic_add32(&b32, 1);
|
|
|
|
my_atomic_rwlock_wrunlock(&rwl);
|
|
|
|
|
|
|
|
my_atomic_rwlock_wrlock(&rwl);
|
2008-07-29 16:10:24 +02:00
|
|
|
my_atomic_add32(&bad, x);
|
2008-01-10 13:21:53 +01:00
|
|
|
my_atomic_rwlock_wrunlock(&rwl);
|
2006-05-31 18:44:09 +02:00
|
|
|
|
|
|
|
for (; m ; m--)
|
2006-06-17 16:20:39 +02:00
|
|
|
{
|
|
|
|
my_atomic_rwlock_wrlock(&rwl);
|
2006-10-22 16:05:18 +02:00
|
|
|
x= my_atomic_fas32(&c32, x);
|
2006-06-17 16:20:39 +02:00
|
|
|
my_atomic_rwlock_wrunlock(&rwl);
|
|
|
|
}
|
2006-05-31 18:44:09 +02:00
|
|
|
|
|
|
|
if (!x)
|
2006-06-17 16:20:39 +02:00
|
|
|
{
|
|
|
|
my_atomic_rwlock_wrlock(&rwl);
|
2006-10-22 16:05:18 +02:00
|
|
|
x= my_atomic_fas32(&c32, x);
|
2006-06-17 16:20:39 +02:00
|
|
|
my_atomic_rwlock_wrunlock(&rwl);
|
|
|
|
}
|
2006-05-31 18:44:09 +02:00
|
|
|
|
2006-06-17 16:20:39 +02:00
|
|
|
my_atomic_rwlock_wrlock(&rwl);
|
2008-07-29 16:10:24 +02:00
|
|
|
my_atomic_add32(&bad, -x);
|
2006-06-17 16:20:39 +02:00
|
|
|
my_atomic_rwlock_wrunlock(&rwl);
|
2006-05-31 18:44:09 +02:00
|
|
|
|
2008-01-10 13:21:53 +01:00
|
|
|
pthread_mutex_lock(&mutex);
|
|
|
|
if (!--running_threads) pthread_cond_signal(&cond);
|
|
|
|
pthread_mutex_unlock(&mutex);
|
unittest:
rename *.t* to *-t* to be automake-friendly
simplify Makefiles
test_atomic.c:
move to unittest, add GPL comment, fix warnings, convert to tap framework.
configure:
remove custom tests for available types, use AC_CHECK_TYPE instead
x86-gcc.h:
fix gcc -ansi errors while maintaining readability
ignore:
added *-t
unittest/mysys/base64-t.c:
Rename: unittest/mysys/base64.t.c -> unittest/mysys/base64-t.c
unittest/mysys/bitmap-t.c:
Rename: unittest/mysys/bitmap.t.c -> unittest/mysys/bitmap-t.c
unittest/mytap/t/basic-t.c:
Rename: unittest/mytap/t/basic.t.c -> unittest/mytap/t/basic-t.c
unittest/examples/no_plan-t.c:
Rename: unittest/examples/no_plan.t.c -> unittest/examples/no_plan-t.c
unittest/examples/simple-t.c:
Rename: unittest/examples/simple.t.c -> unittest/examples/simple-t.c
unittest/examples/skip-t.c:
Rename: unittest/examples/skip.t.c -> unittest/examples/skip-t.c
unittest/examples/skip_all-t.c:
Rename: unittest/examples/skip_all.t.c -> unittest/examples/skip_all-t.c
unittest/examples/todo-t.c:
Rename: unittest/examples/todo.t.c -> unittest/examples/todo-t.c
BitKeeper/etc/ignore:
added *-t
config/ac-macros/misc.m4:
remove custom AC_TRY_RUN tests for available types, use AC_CHECK_TYPE instead
configure.in:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/atomic/x86-gcc.h:
fix gcc -ansi errors while maintaining readability
include/my_global.h:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/my_sys.h:
add missing declaration
mysys/Makefile.am:
move test_atomic to unittest
unittest/Makefile.am:
simplifications, correct permissions in chmod
unittest/README.txt:
rename *.t* to *-t* to be automake-friendly
unittest/examples/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/my_atomic-t.c:
move mysys/test_atomic.c to unittest, add GPL comment, fix warnings,
convert to tap framework.
unittest/mytap/t/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/unit.pl:
rename *.t* to *-t* to be automake-friendly
2006-06-01 12:25:47 +02:00
|
|
|
return 0;
|
2006-05-31 18:44:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2008-07-29 16:10:24 +02:00
|
|
|
same as test_atomic_add, but my_atomic_add32 is emulated with
|
2006-08-10 19:19:47 +02:00
|
|
|
my_atomic_cas32 - notice that the slowdown is proportional to the
|
|
|
|
number of CPUs
|
2006-05-31 18:44:09 +02:00
|
|
|
*/
|
2008-07-29 16:10:24 +02:00
|
|
|
pthread_handler_t test_atomic_cas(void *arg)
|
2006-05-31 18:44:09 +02:00
|
|
|
{
|
2006-10-22 16:05:18 +02:00
|
|
|
int m= (*(int *)arg)/2, ok= 0;
|
2007-12-27 18:16:02 +01:00
|
|
|
GCC_BUG_WORKAROUND int32 x, y;
|
2006-10-22 16:05:18 +02:00
|
|
|
for (x= ((int)(intptr)(&m)); m ; m--)
|
2006-05-31 18:44:09 +02:00
|
|
|
{
|
2006-06-17 16:20:39 +02:00
|
|
|
my_atomic_rwlock_wrlock(&rwl);
|
2008-07-29 16:10:24 +02:00
|
|
|
y= my_atomic_load32(&bad);
|
2006-06-17 16:20:39 +02:00
|
|
|
my_atomic_rwlock_wrunlock(&rwl);
|
2006-10-22 16:05:18 +02:00
|
|
|
x= (x*m+0x87654321) & INT_MAX32;
|
2006-06-17 16:20:39 +02:00
|
|
|
do {
|
|
|
|
my_atomic_rwlock_wrlock(&rwl);
|
2008-07-29 16:10:24 +02:00
|
|
|
ok= my_atomic_cas32(&bad, &y, (uint32)y+x);
|
2006-06-17 16:20:39 +02:00
|
|
|
my_atomic_rwlock_wrunlock(&rwl);
|
2006-08-10 19:19:47 +02:00
|
|
|
} while (!ok) ;
|
2006-06-17 16:20:39 +02:00
|
|
|
do {
|
|
|
|
my_atomic_rwlock_wrlock(&rwl);
|
2008-07-29 16:10:24 +02:00
|
|
|
ok= my_atomic_cas32(&bad, &y, y-x);
|
2006-06-17 16:20:39 +02:00
|
|
|
my_atomic_rwlock_wrunlock(&rwl);
|
2006-08-10 19:19:47 +02:00
|
|
|
} while (!ok) ;
|
2006-05-31 18:44:09 +02:00
|
|
|
}
|
2008-01-10 13:21:53 +01:00
|
|
|
pthread_mutex_lock(&mutex);
|
|
|
|
if (!--running_threads) pthread_cond_signal(&cond);
|
|
|
|
pthread_mutex_unlock(&mutex);
|
unittest:
rename *.t* to *-t* to be automake-friendly
simplify Makefiles
test_atomic.c:
move to unittest, add GPL comment, fix warnings, convert to tap framework.
configure:
remove custom tests for available types, use AC_CHECK_TYPE instead
x86-gcc.h:
fix gcc -ansi errors while maintaining readability
ignore:
added *-t
unittest/mysys/base64-t.c:
Rename: unittest/mysys/base64.t.c -> unittest/mysys/base64-t.c
unittest/mysys/bitmap-t.c:
Rename: unittest/mysys/bitmap.t.c -> unittest/mysys/bitmap-t.c
unittest/mytap/t/basic-t.c:
Rename: unittest/mytap/t/basic.t.c -> unittest/mytap/t/basic-t.c
unittest/examples/no_plan-t.c:
Rename: unittest/examples/no_plan.t.c -> unittest/examples/no_plan-t.c
unittest/examples/simple-t.c:
Rename: unittest/examples/simple.t.c -> unittest/examples/simple-t.c
unittest/examples/skip-t.c:
Rename: unittest/examples/skip.t.c -> unittest/examples/skip-t.c
unittest/examples/skip_all-t.c:
Rename: unittest/examples/skip_all.t.c -> unittest/examples/skip_all-t.c
unittest/examples/todo-t.c:
Rename: unittest/examples/todo.t.c -> unittest/examples/todo-t.c
BitKeeper/etc/ignore:
added *-t
config/ac-macros/misc.m4:
remove custom AC_TRY_RUN tests for available types, use AC_CHECK_TYPE instead
configure.in:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/atomic/x86-gcc.h:
fix gcc -ansi errors while maintaining readability
include/my_global.h:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/my_sys.h:
add missing declaration
mysys/Makefile.am:
move test_atomic to unittest
unittest/Makefile.am:
simplifications, correct permissions in chmod
unittest/README.txt:
rename *.t* to *-t* to be automake-friendly
unittest/examples/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/my_atomic-t.c:
move mysys/test_atomic.c to unittest, add GPL comment, fix warnings,
convert to tap framework.
unittest/mytap/t/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/unit.pl:
rename *.t* to *-t* to be automake-friendly
2006-06-01 12:25:47 +02:00
|
|
|
return 0;
|
2006-05-31 18:44:09 +02:00
|
|
|
}
|
|
|
|
|
2008-07-29 16:10:24 +02:00
|
|
|
void do_tests()
|
2006-08-10 19:19:47 +02:00
|
|
|
{
|
2008-07-29 16:10:24 +02:00
|
|
|
plan(4);
|
2006-08-10 19:19:47 +02:00
|
|
|
|
2008-07-29 16:10:24 +02:00
|
|
|
bad= my_atomic_initialize();
|
|
|
|
ok(!bad, "my_atomic_initialize() returned %d", bad);
|
2006-08-10 19:19:47 +02:00
|
|
|
|
2006-05-31 18:44:09 +02:00
|
|
|
my_atomic_rwlock_init(&rwl);
|
|
|
|
|
2008-07-29 16:10:24 +02:00
|
|
|
b32= c32= 0;
|
|
|
|
test_concurrently("my_atomic_add32", test_atomic_add, THREADS, CYCLES);
|
|
|
|
b32= c32= 0;
|
|
|
|
test_concurrently("my_atomic_fas32", test_atomic_fas, THREADS, CYCLES);
|
|
|
|
b32= c32= 0;
|
|
|
|
test_concurrently("my_atomic_cas32", test_atomic_cas, THREADS, CYCLES);
|
2008-01-10 13:21:53 +01:00
|
|
|
|
2006-05-31 18:44:09 +02:00
|
|
|
my_atomic_rwlock_destroy(&rwl);
|
|
|
|
}
|
|
|
|
|