Fixed pthread_spin_lock on sparc32/64 (bug 16882)

[BZ #16882]
	* nptl/sysdeps/sparc/sparc32/pthread_spin_lock.S
	(pthread_spin_lock): Branch out of spin loop to proper location.
	* nptl/sysdeps/sparc/sparc64/pthread_spin_lock.S
	(pthread_spin_lock): Likewise.

	* nptl/tst-spin4.c: New test.
	* nptl/Makefile (tests): Add tst-spin4.
This commit is contained in:
Guo Yixuan 2014-06-03 16:19:11 -07:00 committed by David S. Miller
parent 8c19f86e35
commit 05573613e0
6 changed files with 126 additions and 6 deletions

View File

@ -1,3 +1,14 @@
2014-06-03 Guo Yixuan <culu.gyx@gmail.com>
[BZ #16882]
* nptl/sysdeps/sparc/sparc32/pthread_spin_lock.S
(pthread_spin_lock): Branch out of spin loop to proper location.
* nptl/sysdeps/sparc/sparc64/pthread_spin_lock.S
(pthread_spin_lock): Likewise.
* nptl/tst-spin4.c: New test.
* nptl/Makefile (tests): Add tst-spin4.
2014-05-17 Jose E. Marchesi <jose.marchesi@oracle.com> 2014-05-17 Jose E. Marchesi <jose.marchesi@oracle.com>
[BZ #16958] [BZ #16958]

2
NEWS
View File

@ -29,7 +29,7 @@ Version 2.17
14767, 14783, 14784, 14785, 14793, 14796, 14797, 14801, 14803, 14805, 14767, 14783, 14784, 14785, 14793, 14796, 14797, 14801, 14803, 14805,
14807, 14811, 14815, 14821, 14822, 14824, 14828, 14831, 14833, 14835, 14807, 14811, 14815, 14821, 14822, 14824, 14828, 14831, 14833, 14835,
14838, 14856, 14863, 14865, 14866, 14868, 14869, 14871, 14872, 14879, 14838, 14856, 14863, 14865, 14866, 14868, 14869, 14871, 14872, 14879,
14889, 14893, 14898, 14914. 14889, 14893, 14898, 14914, 16882.
* Optimization of memcpy for MIPS. * Optimization of memcpy for MIPS.

View File

@ -207,7 +207,7 @@ tests = tst-typesizes \
tst-mutexpi1 tst-mutexpi2 tst-mutexpi3 tst-mutexpi4 tst-mutexpi5 \ tst-mutexpi1 tst-mutexpi2 tst-mutexpi3 tst-mutexpi4 tst-mutexpi5 \
tst-mutexpi5a tst-mutexpi6 tst-mutexpi7 tst-mutexpi7a tst-mutexpi8 \ tst-mutexpi5a tst-mutexpi6 tst-mutexpi7 tst-mutexpi7a tst-mutexpi8 \
tst-mutexpi9 \ 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-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-cond8 tst-cond9 tst-cond10 tst-cond11 tst-cond12 tst-cond13 \
tst-cond14 tst-cond15 tst-cond16 tst-cond17 tst-cond18 tst-cond19 \ tst-cond14 tst-cond15 tst-cond16 tst-cond17 tst-cond18 tst-cond19 \

View File

@ -19,11 +19,11 @@
.text .text
ENTRY(pthread_spin_lock) ENTRY(pthread_spin_lock)
ldstub [%o0], %g1 1: ldstub [%o0], %g1
orcc %g1, 0x0, %g0 orcc %g1, 0x0, %g0
bne,a 2f bne,a 2f
ldub [%o0], %g1 ldub [%o0], %g1
1: retl retl
mov 0, %o0 mov 0, %o0
2: orcc %g1, 0x0, %g0 2: orcc %g1, 0x0, %g0
bne,a 2b bne,a 2b

View File

@ -19,10 +19,10 @@
.text .text
ENTRY(pthread_spin_lock) ENTRY(pthread_spin_lock)
ldstub [%o0], %g1 1: ldstub [%o0], %g1
brnz,pn %g1, 2f brnz,pn %g1, 2f
membar #StoreLoad | #StoreStore membar #StoreLoad | #StoreStore
1: retl retl
mov 0, %o0 mov 0, %o0
2: ldub [%o0], %g1 2: ldub [%o0], %g1
brnz,pt %g1, 2b brnz,pt %g1, 2b

109
nptl/tst-spin4.c Normal file
View 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"