|
From: <sv...@va...> - 2009-06-06 10:56:47
|
Author: bart
Date: 2009-06-06 11:56:40 +0100 (Sat, 06 Jun 2009)
New Revision: 10262
Log:
- 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.
Modified:
trunk/drd/drd_semaphore.c
trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3
trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b
trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5
trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc
trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.8
Modified: trunk/drd/drd_semaphore.c
===================================================================
--- trunk/drd/drd_semaphore.c 2009-06-06 09:28:28 UTC (rev 10261)
+++ trunk/drd/drd_semaphore.c 2009-06-06 10:56:40 UTC (rev 10262)
@@ -274,13 +274,22 @@
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)(),
SemaphoreErr,
@@ -289,8 +298,7 @@
&sei);
return;
}
- p->value--;
- tl_assert((int)p->value >= 0);
+
if (p->waits_to_skip > 0)
p->waits_to_skip--;
else
Modified: trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3
===================================================================
--- trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3 2009-06-06 09:28:28 UTC (rev 10261)
+++ trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3 2009-06-06 10:56:40 UTC (rev 10262)
@@ -137,11 +137,11 @@
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 ------------
Modified: trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b
===================================================================
--- trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b 2009-06-06 09:28:28 UTC (rev 10261)
+++ trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b 2009-06-06 10:56:40 UTC (rev 10262)
@@ -148,11 +148,11 @@
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 ------------
Modified: trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5
===================================================================
--- trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5 2009-06-06 09:28:28 UTC (rev 10261)
+++ trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5 2009-06-06 10:56:40 UTC (rev 10262)
@@ -136,11 +136,11 @@
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 ------------
Modified: trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc
===================================================================
--- trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc 2009-06-06 09:28:28 UTC (rev 10261)
+++ trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc 2009-06-06 10:56:40 UTC (rev 10262)
@@ -136,11 +136,11 @@
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 ------------
Modified: trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.8
===================================================================
--- trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.8 2009-06-06 09:28:28 UTC (rev 10261)
+++ trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.8 2009-06-06 10:56:40 UTC (rev 10262)
@@ -136,11 +136,11 @@
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 ------------
|