#include "../../config.h"
-#if !defined(VGO_darwin)
static void lock_twice(pthread_mutex_t* const p)
{
- pthread_mutex_lock(p);
- pthread_mutex_lock(p);
- pthread_mutex_unlock(p);
- pthread_mutex_unlock(p);
+ if (pthread_mutex_trylock(p) != 0)
+ fprintf(stderr, "first lock call failed !\n");
+ if (pthread_mutex_trylock(p) != 0)
+ fprintf(stderr, "second lock call failed !\n");
+ if (pthread_mutex_unlock(p) != 0)
+ fprintf(stderr, "first unlock call failed !\n");
+ if (pthread_mutex_unlock(p) != 0)
+ fprintf(stderr, "second unlock call failed !\n");
}
-#endif
int main(int argc, char** argv)
{
- /* Let the program abort after 3 seconds instead of leaving it deadlocked. */
- alarm(3);
-
#if defined(HAVE_PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP)
{
pthread_mutex_t m = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
- printf("Recursive mutex (statically initialized).\n");
+ fprintf(stderr, "Recursive mutex (statically initialized).\n");
lock_twice(&m);
pthread_mutex_destroy(&m);
}
pthread_mutex_t m;
pthread_mutexattr_t attr;
- printf("Recursive mutex (initialized via mutex attributes).\n");
+ fprintf(stderr, "\nRecursive mutex (initialized via mutex attributes).\n");
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&m, &attr);
pthread_mutex_t m;
pthread_mutexattr_t attr;
- printf("Error checking mutex.\n");
+ fprintf(stderr, "\nError checking mutex.\n");
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP);
pthread_mutex_init(&m, &attr);
}
#endif
-// DDD: Darwin doesn't support signals yet, so the alarm() call doesn't kick
-// in, which causes it to hang.
-#if !defined(VGO_darwin)
{
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
- printf("Non-recursive mutex.\n");
- fflush(stdout);
+ fprintf(stderr, "\nNon-recursive mutex.\n");
lock_twice(&m);
}
- printf("Done.\n");
-#endif
+
+ fprintf(stderr, "\nDone.\n");
+
return 0;
}
-ERROR SUMMARY: 4 errors from 4 contexts
+
+Recursive mutex (statically initialized).
+
+Recursive mutex (initialized via mutex attributes).
+
+Error checking mutex.
+second lock call failed !
+Mutex not locked by calling thread: mutex 0x........, recursion count 0, owner 1.
+ at 0x........: pthread_mutex_unlock (drd_pthread_intercepts.c:?)
+ by 0x........: lock_twice (recursive_mutex.c:?)
+ by 0x........: main (recursive_mutex.c:?)
+mutex 0x........ was first observed at:
+ at 0x........: pthread_mutex_init (drd_pthread_intercepts.c:?)
+ by 0x........: main (recursive_mutex.c:?)
+second unlock call failed !
+
+Non-recursive mutex.
+second lock call failed !
+
+Mutex not locked by calling thread: mutex 0x........, recursion count 0, owner 1.
+ at 0x........: pthread_mutex_unlock (drd_pthread_intercepts.c:?)
+ by 0x........: lock_twice (recursive_mutex.c:?)
+ by 0x........: main (recursive_mutex.c:?)
+mutex 0x........ was first observed at:
+ at 0x........: pthread_mutex_trylock (drd_pthread_intercepts.c:?)
+ by 0x........: lock_twice (recursive_mutex.c:?)
+ by 0x........: main (recursive_mutex.c:?)
+
+Done.
+
+ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)