mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-07 20:50:56 +00:00
An error message is now printed if the mutex pointer passed to
pthread_cond_wait() does not point to a mutex object, and also if the mutex pointer passed to pthread_cond_wait() points to a recursive mutex that has been locked recursively. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@8301
This commit is contained in:
parent
a8971abd42
commit
6e0f1a6ff0
@ -182,10 +182,13 @@ void cond_post_destroy(const Addr cond)
|
||||
clientobj_remove(p->a1, ClientCondvar);
|
||||
}
|
||||
|
||||
/** Called before pthread_cond_wait(). */
|
||||
/** Called before pthread_cond_wait(). Note: before this function is called,
|
||||
* mutex_unlock() has already been called from drd_clientreq.c.
|
||||
*/
|
||||
int cond_pre_wait(const Addr cond, const Addr mutex)
|
||||
{
|
||||
struct cond_info* p;
|
||||
struct mutex_info* q;
|
||||
|
||||
if (s_trace_cond)
|
||||
{
|
||||
@ -214,6 +217,23 @@ int cond_pre_wait(const Addr cond, const Addr mutex)
|
||||
" and mutex",
|
||||
&cwei);
|
||||
}
|
||||
tl_assert(p->mutex);
|
||||
q = mutex_get(p->mutex);
|
||||
if (q && q->recursion_count > 0)
|
||||
{
|
||||
const ThreadId vg_tid = VG_(get_running_tid)();
|
||||
MutexErrInfo MEI = { q->a1, q->recursion_count, q->owner };
|
||||
VG_(maybe_record_error)(vg_tid,
|
||||
MutexErr,
|
||||
VG_(get_IP)(vg_tid),
|
||||
"Mutex locked recursively",
|
||||
&MEI);
|
||||
}
|
||||
else if (q == 0)
|
||||
{
|
||||
not_a_mutex(p->mutex);
|
||||
}
|
||||
|
||||
return ++p->waiter_count;
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,8 @@
|
||||
|
||||
The object at address 0x........ is not a mutex.
|
||||
at 0x........: pthread_cond_wait* (drd_pthread_intercepts.c:?)
|
||||
by 0x........: main (tc23_bogus_condwait.c:69)
|
||||
|
||||
The object at address 0x........ is not a mutex.
|
||||
at 0x........: pthread_cond_wait* (drd_pthread_intercepts.c:?)
|
||||
by 0x........: main (tc23_bogus_condwait.c:69)
|
||||
@ -32,6 +36,10 @@ The object at address 0x........ is not a mutex.
|
||||
at 0x........: pthread_cond_wait* (drd_pthread_intercepts.c:?)
|
||||
by 0x........: main (tc23_bogus_condwait.c:75)
|
||||
|
||||
The object at address 0x........ is not a mutex.
|
||||
at 0x........: pthread_cond_wait* (drd_pthread_intercepts.c:?)
|
||||
by 0x........: main (tc23_bogus_condwait.c:75)
|
||||
|
||||
Thread 3:
|
||||
Probably a race condition: condition variable 0x........ has been signaled but the associated mutex 0x........ is not locked by the signalling thread.
|
||||
at 0x........: pthread_cond_signal* (drd_pthread_intercepts.c:?)
|
||||
@ -45,6 +53,10 @@ Mutex not locked by calling thread: mutex 0x........, recursion count 1, owner 2
|
||||
at 0x........: pthread_cond_wait* (drd_pthread_intercepts.c:?)
|
||||
by 0x........: main (tc23_bogus_condwait.c:78)
|
||||
|
||||
Mutex locked recursively: mutex 0x........, recursion count 1, owner 2.
|
||||
at 0x........: pthread_cond_wait* (drd_pthread_intercepts.c:?)
|
||||
by 0x........: main (tc23_bogus_condwait.c:78)
|
||||
|
||||
Thread 3:
|
||||
Probably a race condition: condition variable 0x........ has been signaled but the associated mutex 0x........ is not locked by the signalling thread.
|
||||
at 0x........: pthread_cond_signal* (drd_pthread_intercepts.c:?)
|
||||
@ -65,4 +77,4 @@ Mutex not locked by calling thread: mutex 0x........, recursion count 2, owner 1
|
||||
by 0x........: (within libpthread-?.?.so)
|
||||
by 0x........: clone (in /...libc...)
|
||||
|
||||
ERROR SUMMARY: 9 errors from 9 contexts (suppressed: 0 from 0)
|
||||
ERROR SUMMARY: 12 errors from 12 contexts (suppressed: 0 from 0)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user