From: Bart Van Assche Date: Sat, 6 Jun 2009 10:56:40 +0000 (+0000) Subject: - Robustness improvement: do not trigger an assertion failure if one X-Git-Tag: svn/VALGRIND_3_5_0~527 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7933a6c4d5d28350107a36b469fd83591a210f61;p=thirdparty%2Fvalgrind.git - Robustness improvement: do not trigger an assertion failure if one thread destroys and reinitializes a semaphore another thread is waiting on but print an error message instead. - Behavior change: always decrement 'value', even if this makes value negative. - Updated expected output files. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10262 --- diff --git a/drd/drd_semaphore.c b/drd/drd_semaphore.c index 0dac3492d8..f8ab404181 100644 --- a/drd/drd_semaphore.c +++ b/drd/drd_semaphore.c @@ -274,12 +274,21 @@ void DRD_(semaphore_post_wait)(const DrdThreadId tid, const Addr semaphore, p ? p->value : 0, p ? p->value - 1 : 0); } - tl_assert(p); - tl_assert(p->waiters > 0); - p->waiters--; - tl_assert((int)p->waiters >= 0); - tl_assert((int)p->value >= 0); - if (p->value == 0) + + if (p) + { + p->waiters--; + p->value--; + } + + /* + * Note: if another thread destroyed and reinitialized a semaphore while + * the current thread was waiting in sem_wait, p->waiters may have been + * set to zero by DRD_(semaphore_initialize)() after + * DRD_(semaphore_pre_wait)() has finished before + * DRD_(semaphore_post_wait)() has been called. + */ + if (p == NULL || (int)p->value < 0 || (int)p->waiters < 0) { SemaphoreErrInfo sei = { DRD_(thread_get_running_tid)(), semaphore }; VG_(maybe_record_error)(VG_(get_running_tid)(), @@ -289,8 +298,7 @@ void DRD_(semaphore_post_wait)(const DrdThreadId tid, const Addr semaphore, &sei); return; } - p->value--; - tl_assert((int)p->value >= 0); + if (p->waits_to_skip > 0) p->waits_to_skip--; else diff --git a/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3 b/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3 index a7f14bc1a6..2a53775c29 100644 --- a/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3 +++ b/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3 @@ -137,11 +137,11 @@ Invalid semaphore: semaphore 0x........ semaphore 0x........ was first observed at: at 0x........: sem_init* (drd_pthread_intercepts.c:?) by 0x........: main (tc20_verifywrap.c:228) -[1/1] semaphore_post 0x........ value 0 -> 1 +[1/1] semaphore_post 0x........ value 4294967295 -> 0 FIXME: can't figure out how to verify wrap of sem_post -[1/1] semaphore_destroy 0x........ value 1 +[1/1] semaphore_destroy 0x........ value 0 ------------ dealloc of mem holding locks ------------ diff --git a/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b b/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b index 022e5b9957..20fdfabff6 100644 --- a/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b +++ b/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b @@ -148,11 +148,11 @@ Invalid semaphore: semaphore 0x........ semaphore 0x........ was first observed at: at 0x........: sem_init* (drd_pthread_intercepts.c:?) by 0x........: main (tc20_verifywrap.c:228) -[1/1] semaphore_post 0x........ value 0 -> 1 +[1/1] semaphore_post 0x........ value 4294967295 -> 0 FIXME: can't figure out how to verify wrap of sem_post -[1/1] semaphore_destroy 0x........ value 1 +[1/1] semaphore_destroy 0x........ value 0 ------------ dealloc of mem holding locks ------------ diff --git a/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5 b/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5 index 93d76be8de..d8a5ed4a21 100644 --- a/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5 +++ b/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5 @@ -136,11 +136,11 @@ Invalid semaphore: semaphore 0x........ semaphore 0x........ was first observed at: at 0x........: sem_init* (drd_pthread_intercepts.c:?) by 0x........: main (tc20_verifywrap.c:228) -[1/1] semaphore_post 0x........ value 0 -> 1 +[1/1] semaphore_post 0x........ value 4294967295 -> 0 FIXME: can't figure out how to verify wrap of sem_post -[1/1] semaphore_destroy 0x........ value 1 +[1/1] semaphore_destroy 0x........ value 0 ------------ dealloc of mem holding locks ------------ diff --git a/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc b/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc index 296e127db6..a58c6d60e8 100644 --- a/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc +++ b/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc @@ -136,11 +136,11 @@ Invalid semaphore: semaphore 0x........ semaphore 0x........ was first observed at: at 0x........: sem_init* (drd_pthread_intercepts.c:?) by 0x........: main (tc20_verifywrap.c:228) -[1/1] semaphore_post 0x........ value 0 -> 1 +[1/1] semaphore_post 0x........ value 4294967295 -> 0 FIXME: can't figure out how to verify wrap of sem_post -[1/1] semaphore_destroy 0x........ value 1 +[1/1] semaphore_destroy 0x........ value 0 ------------ dealloc of mem holding locks ------------ diff --git a/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.8 b/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.8 index 2a8f7c778c..f40ac77a47 100644 --- a/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.8 +++ b/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.8 @@ -136,11 +136,11 @@ Invalid semaphore: semaphore 0x........ semaphore 0x........ was first observed at: at 0x........: sem_init* (drd_pthread_intercepts.c:?) by 0x........: main (tc20_verifywrap.c:228) -[1/1] semaphore_post 0x........ value 0 -> 1 +[1/1] semaphore_post 0x........ value 4294967295 -> 0 FIXME: can't figure out how to verify wrap of sem_post -[1/1] semaphore_destroy 0x........ value 1 +[1/1] semaphore_destroy 0x........ value 0 ------------ dealloc of mem holding locks ------------