summaryrefslogtreecommitdiff
path: root/src/platform/posix/posix_thread.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2017-06-22 13:09:59 -0700
committerGarrett D'Amore <garrett@damore.org>2017-06-22 13:09:59 -0700
commit82973b2d8063656679f424469631041232762deb (patch)
treed8b9c1e2b34c1381cba857e0e4cc2a2fca2ddbc6 /src/platform/posix/posix_thread.c
parentfd141b3eeb7bb8046568a121095f835a0f49965d (diff)
downloadnng-82973b2d8063656679f424469631041232762deb.tar.gz
nng-82973b2d8063656679f424469631041232762deb.tar.bz2
nng-82973b2d8063656679f424469631041232762deb.zip
Additional mutex debugging support.
Diffstat (limited to 'src/platform/posix/posix_thread.c')
-rw-r--r--src/platform/posix/posix_thread.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/platform/posix/posix_thread.c b/src/platform/posix/posix_thread.c
index 0d57e7ef..d3b6c1e1 100644
--- a/src/platform/posix/posix_thread.c
+++ b/src/platform/posix/posix_thread.c
@@ -79,6 +79,7 @@ nni_plat_mtx_lock(nni_plat_mtx *mtx)
if ((rv = pthread_mutex_lock(&mtx->mtx)) != 0) {
nni_panic("pthread_mutex_lock: %s", strerror(rv));
}
+ mtx->owner = pthread_self();
}
@@ -87,9 +88,11 @@ nni_plat_mtx_unlock(nni_plat_mtx *mtx)
{
int rv;
+ NNI_ASSERT(mtx->owner == pthread_self());
if ((rv = pthread_mutex_unlock(&mtx->mtx)) != 0) {
nni_panic("pthread_mutex_unlock: %s", strerror(rv));
}
+ mtx->owner = 0;
}
@@ -108,7 +111,7 @@ nni_plat_cv_init(nni_plat_cv *cv, nni_plat_mtx *mtx)
nni_panic("pthread_cond_init: %s", strerror(rv));
}
}
- cv->mtx = &mtx->mtx;
+ cv->mtx = mtx;
return (0);
}
@@ -129,9 +132,11 @@ nni_plat_cv_wait(nni_plat_cv *cv)
{
int rv;
- if ((rv = pthread_cond_wait(&cv->cv, cv->mtx)) != 0) {
+ NNI_ASSERT(cv->mtx->owner == pthread_self());
+ if ((rv = pthread_cond_wait(&cv->cv, &cv->mtx->mtx)) != 0) {
nni_panic("pthread_cond_wait: %s", strerror(rv));
}
+ cv->mtx->owner = pthread_self();
}
@@ -141,11 +146,14 @@ nni_plat_cv_until(nni_plat_cv *cv, nni_time until)
struct timespec ts;
int rv;
+ NNI_ASSERT(cv->mtx->owner == pthread_self());
+
// Our caller has already guaranteed a sane value for until.
ts.tv_sec = until / 1000000;
ts.tv_nsec = (until % 1000000) * 1000;
- rv = pthread_cond_timedwait(&cv->cv, cv->mtx, &ts);
+ rv = pthread_cond_timedwait(&cv->cv, &cv->mtx->mtx, &ts);
+ cv->mtx->owner = pthread_self();
if (rv == ETIMEDOUT) {
return (NNG_ETIMEDOUT);
} else if (rv != 0) {