diff options
author | Guo Yixuan <culu.gyx@gmail.com> | 2014-05-29 21:53:16 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-06-03 16:10:48 -0700 |
commit | 196939fb0ede8b588019f7ff0779dffbfc35787d (patch) | |
tree | 5d7c27e478e004951a4a6b4441f4ee2e0c99800a /nptl/tst-spin4.c | |
parent | b42eca7d39d7d263815a4457c318eb57ee2686a4 (diff) | |
download | glibc-196939fb0ede8b588019f7ff0779dffbfc35787d.tar glibc-196939fb0ede8b588019f7ff0779dffbfc35787d.tar.gz glibc-196939fb0ede8b588019f7ff0779dffbfc35787d.tar.bz2 glibc-196939fb0ede8b588019f7ff0779dffbfc35787d.zip |
New test for pthread_spin_lock (bug 16882)
* nptl/tst-spin4.c: New test.
* nptl/Makefile (tests): Add tst-spin4.
Diffstat (limited to 'nptl/tst-spin4.c')
-rw-r--r-- | nptl/tst-spin4.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/nptl/tst-spin4.c b/nptl/tst-spin4.c new file mode 100644 index 0000000000..5b23a172ca --- /dev/null +++ b/nptl/tst-spin4.c @@ -0,0 +1,109 @@ +#include <pthread.h> +#include <stdio.h> +#include <unistd.h> + +static int count = 0; + +static void * +thread_add_one (void *arg) +{ + int tmp; + pthread_spinlock_t *lock = (pthread_spinlock_t *) arg; + + /* When do_test holds the lock for 1 sec, the two thread will be + in contention for the lock. */ + if (pthread_spin_lock (lock) != 0) + { + puts ("thread_add_one(): spin_lock failed"); + pthread_exit ((void *) 1l); + } + + /* sleep 1s before modifying count */ + tmp = count; + sleep (1); + count = tmp + 1; + + if (pthread_spin_unlock (lock) != 0) + { + puts ("thread_add_one(): spin_unlock failed"); + pthread_exit ((void *) 1l); + } + + return NULL; +} + +static int +do_test (void) +{ + pthread_t thr1, thr2; + pthread_spinlock_t lock; + int tmp; + + if (pthread_spin_init (&lock, PTHREAD_PROCESS_PRIVATE) != 0) + { + puts ("spin_init failed"); + return 1; + } + + if (pthread_spin_lock (&lock) != 0) + { + puts ("1st spin_lock failed"); + return 1; + } + + if (pthread_create (&thr1, NULL, thread_add_one, (void *) &lock) != 0) + { + puts ("1st pthread_create failed"); + return 1; + } + + if (pthread_create (&thr2, NULL, thread_add_one, (void *) &lock) != 0) + { + puts ("2nd pthread_create failed"); + return 1; + } + + /* sleep 1s before modifying count */ + tmp = count; + sleep (1); + count = tmp + 1; + + if (pthread_spin_unlock (&lock) != 0) + { + puts ("1st spin_unlock failed"); + return 1; + } + + void *status; + if (pthread_join (thr1, &status) != 0) + { + puts ("1st pthread_join failed"); + return 1; + } + if (status != NULL) + { + puts ("failure in the 1st thread"); + return 1; + } + if (pthread_join (thr2, &status) != 0) + { + puts ("2nd pthread_join failed"); + return 1; + } + if (status != NULL) + { + puts ("failure in the 2nd thread"); + return 1; + } + + if (count != 3) + { + printf ("count is %d, should be 3\n", count); + return 1; + } + return 0; +} + +#define TIMEOUT 5 +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" |