#endif
#if ENABLE_TRACE
-static void tvh_thread_mutex_failed(tvh_mutex_t *mutex, const char *reason);
+static void tvh_thread_mutex_failed(tvh_mutex_t *mutex, const char *reason, const char *filename, int lineno);
#endif
/*
}
#if ENABLE_TRACE
-static void tvh_mutex_check_magic(tvh_mutex_t *mutex)
+static void tvh_mutex_check_magic(tvh_mutex_t *mutex, const char *filename, int lineno)
{
if (mutex &&
mutex->magic1 == TVH_THREAD_MUTEX_MAGIC1 &&
mutex->magic2 == TVH_THREAD_MUTEX_MAGIC2)
return;
- tvh_thread_mutex_failed(mutex, "magic");
+ tvh_thread_mutex_failed(mutex, "magic", filename, lineno);
}
#else
-static inline void tvh_mutex_check_magic(tvh_mutex_t *mutex)
+static inline void tvh_mutex_check_magic(tvh_mutex_t *mutex, const char *filename, int lineno)
{
}
#endif
int tvh_mutex_destroy(tvh_mutex_t *mutex)
{
- tvh_mutex_check_magic(mutex);
+ tvh_mutex_check_magic(mutex, NULL, 0);
return pthread_mutex_destroy(&mutex->mutex);
}
int tvh__mutex_lock(tvh_mutex_t *mutex, const char *filename, int lineno)
{
tvh_mutex_waiter_t *w;
- tvh_mutex_check_magic(mutex);
+ tvh_mutex_check_magic(mutex, filename, lineno);
w = tvh_mutex_add_to_waiters(mutex, filename, lineno);
int r = pthread_mutex_lock(&mutex->mutex);
tvh_mutex_remove_from_waiters(w);
#if ENABLE_TRACE
int tvh__mutex_trylock(tvh_mutex_t *mutex, const char *filename, int lineno)
{
- tvh_mutex_check_magic(mutex);
+ tvh_mutex_check_magic(mutex, filename, lineno);
int r = pthread_mutex_trylock(&mutex->mutex);
if (r == 0)
tvh_mutex_add_to_list(mutex, filename, lineno);
#if ENABLE_TRACE
int tvh__mutex_unlock(tvh_mutex_t *mutex)
{
- tvh_mutex_check_magic(mutex);
+ tvh_mutex_check_magic(mutex, NULL, 0);
int r = pthread_mutex_unlock(&mutex->mutex);
if (r == 0)
tvh_mutex_remove_from_list(mutex, NULL, NULL);
int64_t finish = getfastmonoclock() + usec;
int retcode;
- tvh_mutex_check_magic(mutex);
+ tvh_mutex_check_magic(mutex, NULL, 0);
while ((retcode = pthread_mutex_trylock (&mutex->mutex)) == EBUSY) {
if (getfastmonoclock() >= finish)
return ETIMEDOUT;
#if ENABLE_TRACE
const char *filename = NULL;
int lineno = -1;
- tvh_mutex_check_magic(mutex);
+ tvh_mutex_check_magic(mutex, NULL, 0);
if (tvh_thread_debug > 0)
tvh_mutex_remove_from_list(mutex, &filename, &lineno);
#endif
#if ENABLE_TRACE
const char *filename = NULL;
int lineno = -1;
- tvh_mutex_check_magic(mutex);
+ tvh_mutex_check_magic(mutex, NULL, 0);
if (tvh_thread_debug > 0)
tvh_mutex_remove_from_list(mutex, &filename, &lineno);
#endif
#if ENABLE_TRACE
const char *filename = NULL;
int lineno = -1;
- tvh_mutex_check_magic(mutex);
+ tvh_mutex_check_magic(mutex, NULL, 0);
if (tvh_thread_debug > 0)
tvh_mutex_remove_from_list(mutex, &filename, &lineno);
#endif
#endif
#if ENABLE_TRACE
-static void tvh_thread_mutex_failed(tvh_mutex_t *mutex, const char *reason)
+static void
+tvh_thread_mutex_failed
+ (tvh_mutex_t *mutex, const char *reason, const char *filename, int lineno)
{
htsbuf_queue_t q;
tvh_mutex_t *m;
tvh_mutex_waiter_t *w;
htsbuf_queue_init(&q, 0);
- htsbuf_qprintf(&q, "REASON: %s\n", reason);
+ htsbuf_qprintf(&q, "REASON: %s (%s:%d)\n", reason, filename, lineno);
htsbuf_qprintf(&q, "mutex %p locked in: %s:%i (thread %ld)\n", mutex, mutex->filename, mutex->lineno, mutex->tid);
LIST_FOREACH(w, &mutex->waiters, link)
htsbuf_qprintf(&q, "mutex %p waiting in: %s:%i (thread %ld)\n", mutex, w->filename, w->lineno, w->tid);
mutex = TAILQ_LAST(&thrwatch_mutexes, tvh_mutex_queue);
if (mutex && mutex->tstamp + sec2mono(5) < now) {
pthread_mutex_unlock(&thrwatch_mutex);
- tvh_thread_mutex_failed(mutex, "deadlock");
+ tvh_thread_mutex_failed(mutex, "deadlock", __FILE__, __LINE__);
}
pthread_mutex_unlock(&thrwatch_mutex);
if (tvh_thread_debug == 12345678 && tvh_thread_crash_time < getfastmonoclock()) {