-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
2006-09-08 Ulrich Drepper <drepper@redhat.com> [BZ #3123] * sysdeps/pthread/pthread_cond_wait.c (__condvar_cleanup): Don't increment WAKEUP_SEQ if this would increase the value beyond TOTAL_SEQ. * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.c: Likewise. * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.c: Likewise. * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.c: Likewise. * Makefile (tests): Add tst-cond22. * tst-cond22.c: New file.
- Loading branch information
Ulrich Drepper
committed
Sep 8, 2006
1 parent
469615b
commit 346e6ad
Showing
7 changed files
with
208 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,153 @@ | ||
#include <pthreadP.h> | ||
#include <stdio.h> | ||
|
||
|
||
static pthread_barrier_t b; | ||
static pthread_cond_t c = PTHREAD_COND_INITIALIZER; | ||
static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; | ||
|
||
|
||
static void | ||
cl (void *arg) | ||
{ | ||
pthread_mutex_unlock (&m); | ||
} | ||
|
||
|
||
static void * | ||
tf (void *arg) | ||
{ | ||
if (pthread_mutex_lock (&m) != 0) | ||
{ | ||
printf ("%s: mutex_lock failed\n", __func__); | ||
exit (1); | ||
} | ||
int e = pthread_barrier_wait (&b); | ||
if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) | ||
{ | ||
printf ("%s: barrier_wait failed\n", __func__); | ||
exit (1); | ||
} | ||
pthread_cleanup_push (cl, NULL); | ||
if (pthread_cond_wait (&c, &m) != 0) | ||
{ | ||
printf ("%s: cond_wait failed\n", __func__); | ||
exit (1); | ||
} | ||
pthread_cleanup_pop (0); | ||
if (pthread_mutex_unlock (&m) != 0) | ||
{ | ||
printf ("%s: mutex_unlock failed\n", __func__); | ||
exit (1); | ||
} | ||
return NULL; | ||
} | ||
|
||
|
||
static int | ||
do_test (void) | ||
{ | ||
int status = 0; | ||
|
||
if (pthread_barrier_init (&b, NULL, 2) != 0) | ||
{ | ||
puts ("barrier_init failed"); | ||
return 1; | ||
} | ||
|
||
pthread_t th; | ||
if (pthread_create (&th, NULL, tf, NULL) != 0) | ||
{ | ||
puts ("1st create failed"); | ||
return 1; | ||
} | ||
int e = pthread_barrier_wait (&b); | ||
if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) | ||
{ | ||
puts ("1st barrier_wait failed"); | ||
return 1; | ||
} | ||
if (pthread_mutex_lock (&m) != 0) | ||
{ | ||
puts ("1st mutex_lock failed"); | ||
return 1; | ||
} | ||
if (pthread_cond_signal (&c) != 0) | ||
{ | ||
puts ("1st cond_signal failed"); | ||
return 1; | ||
} | ||
if (pthread_cancel (th) != 0) | ||
{ | ||
puts ("cancel failed"); | ||
return 1; | ||
} | ||
if (pthread_mutex_unlock (&m) != 0) | ||
{ | ||
puts ("1st mutex_unlock failed"); | ||
return 1; | ||
} | ||
void *res; | ||
if (pthread_join (th, &res) != 0) | ||
{ | ||
puts ("1st join failed"); | ||
return 1; | ||
} | ||
if (res != PTHREAD_CANCELED) | ||
{ | ||
puts ("first thread not canceled"); | ||
status = 1; | ||
} | ||
|
||
printf ("cond = { %d, %x, %lld, %lld, %lld, %p, %u, %u }\n", | ||
c.__data.__lock, c.__data.__futex, c.__data.__total_seq, | ||
c.__data.__wakeup_seq, c.__data.__woken_seq, c.__data.__mutex, | ||
c.__data.__nwaiters, c.__data.__broadcast_seq); | ||
|
||
if (pthread_create (&th, NULL, tf, NULL) != 0) | ||
{ | ||
puts ("2nd create failed"); | ||
return 1; | ||
} | ||
e = pthread_barrier_wait (&b); | ||
if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) | ||
{ | ||
puts ("2nd barrier_wait failed"); | ||
return 1; | ||
} | ||
if (pthread_mutex_lock (&m) != 0) | ||
{ | ||
puts ("2nd mutex_lock failed"); | ||
return 1; | ||
} | ||
if (pthread_cond_signal (&c) != 0) | ||
{ | ||
puts ("2nd cond_signal failed"); | ||
return 1; | ||
} | ||
if (pthread_mutex_unlock (&m) != 0) | ||
{ | ||
puts ("2nd mutex_unlock failed"); | ||
return 1; | ||
} | ||
if (pthread_join (th, &res) != 0) | ||
{ | ||
puts ("2nd join failed"); | ||
return 1; | ||
} | ||
if (res != NULL) | ||
{ | ||
puts ("2nd thread canceled"); | ||
status = 1; | ||
} | ||
|
||
printf ("cond = { %d, %x, %lld, %lld, %lld, %p, %u, %u }\n", | ||
c.__data.__lock, c.__data.__futex, c.__data.__total_seq, | ||
c.__data.__wakeup_seq, c.__data.__woken_seq, c.__data.__mutex, | ||
c.__data.__nwaiters, c.__data.__broadcast_seq); | ||
|
||
return status; | ||
} | ||
|
||
#define TEST_FUNCTION do_test () | ||
#include "../test-skeleton.c" |