mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-19 13:40:59 +08:00
New test for pthread_spin_lock (bug 16882)
* nptl/tst-spin4.c: New test. * nptl/Makefile (tests): Add tst-spin4.
This commit is contained in:
parent
b42eca7d39
commit
196939fb0e
@ -136,6 +136,9 @@
|
||||
|
||||
* malloc/malloc.c (malloc_info): Inline mi_arena.
|
||||
|
||||
* nptl/tst-spin4.c: New test.
|
||||
* nptl/Makefile (tests): Add tst-spin4.
|
||||
|
||||
2014-05-29 Richard Henderson <rth@twiddle.net>
|
||||
|
||||
* sysdeps/unix/sysv/linux/aarch64/sysdep.h (INTERNAL_VSYSCALL_NCS):
|
||||
|
@ -210,7 +210,7 @@ tests = tst-typesizes \
|
||||
tst-mutexpi1 tst-mutexpi2 tst-mutexpi3 tst-mutexpi4 tst-mutexpi5 \
|
||||
tst-mutexpi5a tst-mutexpi6 tst-mutexpi7 tst-mutexpi7a tst-mutexpi8 \
|
||||
tst-mutexpi9 \
|
||||
tst-spin1 tst-spin2 tst-spin3 \
|
||||
tst-spin1 tst-spin2 tst-spin3 tst-spin4 \
|
||||
tst-cond1 tst-cond2 tst-cond3 tst-cond4 tst-cond5 tst-cond6 tst-cond7 \
|
||||
tst-cond8 tst-cond9 tst-cond10 tst-cond11 tst-cond12 tst-cond13 \
|
||||
tst-cond14 tst-cond15 tst-cond16 tst-cond17 tst-cond18 tst-cond19 \
|
||||
|
109
nptl/tst-spin4.c
Normal file
109
nptl/tst-spin4.c
Normal file
@ -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"
|
Loading…
x
Reference in New Issue
Block a user