From: Jens Axboe Date: Wed, 1 Jul 2009 21:02:10 +0000 (+0200) Subject: Add code to detect a task that exited prior to up'ing the startup mutex X-Git-Tag: fio-1.29~1^2 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=656b1393d43f9f22738404582ea14dec956aea83;p=fio.git Add code to detect a task that exited prior to up'ing the startup mutex Signed-off-by: Jens Axboe --- diff --git a/fio.c b/fio.c index 63d9a1b7..fa5deabb 100644 --- a/fio.c +++ b/fio.c @@ -1492,7 +1492,13 @@ static void run_threads(void) *fio_debug_jobp = pid; } dprint(FD_MUTEX, "wait on startup_mutex\n"); - fio_mutex_down(startup_mutex); + if (fio_mutex_down_timeout(startup_mutex, 10)) { + log_err("fio: job startup hung? exiting.\n"); + terminate_threads(TERMINATE_ALL); + fio_abort = 1; + nr_started--; + break; + } dprint(FD_MUTEX, "done waiting on startup_mutex\n"); } diff --git a/mutex.c b/mutex.c index 1538f62c..a4474374 100644 --- a/mutex.c +++ b/mutex.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -88,6 +89,30 @@ err: return NULL; } +int fio_mutex_down_timeout(struct fio_mutex *mutex, unsigned int seconds) +{ + struct timespec t; + int ret = 0; + + clock_gettime(CLOCK_REALTIME, &t); + t.tv_sec += seconds; + + pthread_mutex_lock(&mutex->lock); + + while (!mutex->value && !ret) { + mutex->waiters++; + ret = pthread_cond_timedwait(&mutex->cond, &mutex->lock, &t); + mutex->waiters--; + } + + if (!ret) { + mutex->value--; + pthread_mutex_unlock(&mutex->lock); + } + + return ret; +} + void fio_mutex_down(struct fio_mutex *mutex) { pthread_mutex_lock(&mutex->lock); diff --git a/mutex.h b/mutex.h index 7be0ab1b..ac79dc63 100644 --- a/mutex.h +++ b/mutex.h @@ -15,6 +15,7 @@ struct fio_mutex { extern struct fio_mutex *fio_mutex_init(int); extern void fio_mutex_remove(struct fio_mutex *); extern void fio_mutex_down(struct fio_mutex *); +extern int fio_mutex_down_timeout(struct fio_mutex *, unsigned int); extern void fio_mutex_down_read(struct fio_mutex *); extern void fio_mutex_down_write(struct fio_mutex *); extern void fio_mutex_up(struct fio_mutex *);