]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
- Robustness improvement: do not trigger an assertion failure if one
authorBart Van Assche <bvanassche@acm.org>
Sat, 6 Jun 2009 10:56:40 +0000 (10:56 +0000)
committerBart Van Assche <bvanassche@acm.org>
Sat, 6 Jun 2009 10:56:40 +0000 (10:56 +0000)
  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

drd/drd_semaphore.c
drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3
drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b
drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5
drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc
drd/tests/tc20_verifywrap2.stderr.exp-glibc2.8

index 0dac3492d8629dcb649b907aa304c87cdf94ce77..f8ab40418158943cf916a53eae822a77e6efa817 100644 (file)
@@ -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
index a7f14bc1a6c16abec749fc8cd776995a6e83bd2e..2a53775c291970ec3a01313a95c39ec1b37ca059 100644 (file)
@@ -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 ------------
 
index 022e5b995751df2610b821cb1146bcca804da1a5..20fdfabff66c865c6515dbff774db665dd15b647 100644 (file)
@@ -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 ------------
 
index 93d76be8de58eaebadc4e0bf786b2cb9a1be1d78..d8a5ed4a2188994dab61bb8d9510609f9074cd58 100644 (file)
@@ -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 ------------
 
index 296e127db6ad854da6bab563f6c1149edd89b1d8..a58c6d60e83ca541d6f949c567a729225f90d8e7 100644 (file)
@@ -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 ------------
 
index 2a8f7c778c8fcfdd286823842dc13d9349ef9647..f40ac77a47485a7ec3fdd4ffb9a3676997fcf538 100644 (file)
@@ -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 ------------