diff options
author | unknown <serg@serg.mylan> | 2006-06-01 12:25:47 +0200 |
---|---|---|
committer | unknown <serg@serg.mylan> | 2006-06-01 12:25:47 +0200 |
commit | 740077bdc58a20faf66fab159f56626b8acf3662 (patch) | |
tree | 445a123eb59c53a13ae718cbc126d350bc89610f /unittest/mysys | |
parent | 5c27329565ef1dc72e6ca127af0a7ca000862970 (diff) | |
download | mariadb-git-740077bdc58a20faf66fab159f56626b8acf3662.tar.gz |
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
Diffstat (limited to 'unittest/mysys')
-rw-r--r-- | unittest/mysys/Makefile.am | 6 | ||||
-rw-r--r-- | unittest/mysys/base64-t.c (renamed from unittest/mysys/base64.t.c) | 0 | ||||
-rw-r--r-- | unittest/mysys/bitmap-t.c (renamed from unittest/mysys/bitmap.t.c) | 0 | ||||
-rw-r--r-- | unittest/mysys/my_atomic-t.c | 149 |
4 files changed, 150 insertions, 5 deletions
diff --git a/unittest/mysys/Makefile.am b/unittest/mysys/Makefile.am index 010a7845339..b1e0356bac6 100644 --- a/unittest/mysys/Makefile.am +++ b/unittest/mysys/Makefile.am @@ -7,9 +7,5 @@ AM_LDFLAGS += -L$(top_builddir)/strings -L$(top_builddir)/dbug LDADD = -lmytap -lmysys -ldbug -lmystrings -noinst_PROGRAMS = bitmap.t base64.t - -bitmap_t_SOURCES = bitmap.t.c - -base64_t_SOURCES = base64.t.c +noinst_PROGRAMS = bitmap-t base64-t my_atomic-t diff --git a/unittest/mysys/base64.t.c b/unittest/mysys/base64-t.c index 1b4f2eb2356..1b4f2eb2356 100644 --- a/unittest/mysys/base64.t.c +++ b/unittest/mysys/base64-t.c diff --git a/unittest/mysys/bitmap.t.c b/unittest/mysys/bitmap-t.c index d5683baff66..d5683baff66 100644 --- a/unittest/mysys/bitmap.t.c +++ b/unittest/mysys/bitmap-t.c diff --git a/unittest/mysys/my_atomic-t.c b/unittest/mysys/my_atomic-t.c new file mode 100644 index 00000000000..8a3fe129b07 --- /dev/null +++ b/unittest/mysys/my_atomic-t.c @@ -0,0 +1,149 @@ +/* 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; either version 2 of the License, or + (at your option) any later version. + + 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 <tap.h> + +#include <my_global.h> +#include <my_sys.h> +#include <my_atomic.h> + +my_atomic_32_t 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; + int32 x; + for (x=((int)(&m)); m ; m--) + { + x=x*m+0x87654321; + my_atomic_add32(&a32, x, &rwl); + my_atomic_add32(&a32, -x, &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; + uint32 x=my_atomic_add32(&b32, 1, &rwl); + + my_atomic_add32(&a32, x, &rwl); + + for (; m ; m--) + x=my_atomic_swap32(&c32, x,&rwl); + + if (!x) + x=my_atomic_swap32(&c32, x,&rwl); + + my_atomic_add32(&a32, -x, &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; + int32 x; + for (x=((int)(&m)); m ; m--) + { + uint32 y=my_atomic_load32(&a32, &rwl); + x=x*m+0x87654321; + while (!my_atomic_cas32(&a32, &y, y+x, &rwl)) ; + while (!my_atomic_cas32(&a32, &y, y-x, &rwl)) ; + } + 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(); + + my_atomic_store32(&a32, 0, &rwl); + my_atomic_store32(&b32, 0, &rwl); + my_atomic_store32(&c32, 0, &rwl); + + diag("Testing %s with %d threads, %d iterations... ", test, n, m); + for (N=n ; n ; n--) + pthread_create(&t, &thr_attr, handler, &m); + + pthread_mutex_lock(&mutex); + while (N) + pthread_cond_wait(&cond, &mutex); + pthread_mutex_unlock(&mutex); + now=my_getsystime()-now; + ok(my_atomic_load32(&a32, &rwl) == 0, + "tested %s in %g secs", test, ((double)now)/1e7); +} + +int main() +{ + int err; + + 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); + + test_atomic("my_atomic_add32", test_atomic_add_handler, 100,1000000); + test_atomic("my_atomic_swap32", test_atomic_swap_handler, 100,1000000); + test_atomic("my_atomic_cas32", test_atomic_cas_handler, 100,1000000); + + pthread_mutex_destroy(&mutex); + pthread_cond_destroy(&cond); + pthread_attr_destroy(&thr_attr); + my_atomic_rwlock_destroy(&rwl); + return exit_status(); +} + |