@@ -287,6 +287,11 @@ void aio_context_unref(AioContext *ctx);
*/
void aio_context_acquire(AioContext *ctx);
+/* Add timeout to aio_context_acquire(). If the time for obtaining
+ * the lock exceeds @t, return ETIMEDOUT.
+ */
+int aio_context_acquire_timeout(AioContext *ctx, int t);
+
/* Relinquish ownership of the AioContext. */
void aio_context_release(AioContext *ctx);
@@ -9,6 +9,7 @@ typedef QemuMutex QemuRecMutex;
#define qemu_rec_mutex_lock_impl qemu_mutex_lock_impl
#define qemu_rec_mutex_trylock_impl qemu_mutex_trylock_impl
#define qemu_rec_mutex_unlock qemu_mutex_unlock
+#define qemu_rec_mutex_timed_lock qemu_mutex_timed_lock
struct QemuMutex {
pthread_mutex_t lock;
@@ -27,6 +27,7 @@ void qemu_mutex_destroy(QemuMutex *mutex);
int qemu_mutex_trylock_impl(QemuMutex *mutex, const char *file, const int line);
void qemu_mutex_lock_impl(QemuMutex *mutex, const char *file, const int line);
void qemu_mutex_unlock_impl(QemuMutex *mutex, const char *file, const int line);
+int qemu_mutex_timed_lock(QemuMutex *mutex, const struct timespec *tsptr);
typedef void (*QemuMutexLockFunc)(QemuMutex *m, const char *f, int l);
typedef int (*QemuMutexTrylockFunc)(QemuMutex *m, const char *f, int l);
@@ -605,6 +605,16 @@ void aio_context_acquire(AioContext *ctx)
qemu_rec_mutex_lock(&ctx->lock);
}
+int aio_context_acquire_timeout(AioContext *ctx, int t)
+{
+ struct timespec tout;
+
+ clock_gettime(CLOCK_REALTIME, &tout);
+ tout.tv_sec += t;
+
+ return qemu_rec_mutex_timed_lock(&ctx->lock, &tout);
+}
+
void aio_context_release(AioContext *ctx)
{
qemu_rec_mutex_unlock(&ctx->lock);
@@ -82,6 +82,12 @@ void qemu_mutex_lock_impl(QemuMutex *mutex, const char *file, const int line)
qemu_mutex_post_lock(mutex, file, line);
}
+int qemu_mutex_timed_lock(QemuMutex *mutex, const struct timespec *tsptr)
+{
+ assert(mutex->initialized);
+ return pthread_mutex_timedlock(&mutex->lock, tsptr);
+}
+
int qemu_mutex_trylock_impl(QemuMutex *mutex, const char *file, const int line)
{
int err;
Currently we only have the aio_context_acquire() to take the ownership of the AioContext. If the mutex is locked by other threads, this function will wait util the mutex is released. Sometimes we may want to get some return values after waiting for some time. So introduce aio_context_acquire_timeout(), which will return ETIMEDOUT after @t seconds. This will be used in next patch. Signed-off-by: Zhenyu Ye <yezhenyu2@huawei.com> --- include/block/aio.h | 5 +++++ include/qemu/thread-posix.h | 1 + include/qemu/thread.h | 1 + util/async.c | 10 ++++++++++ util/qemu-thread-posix.c | 6 ++++++ 5 files changed, 23 insertions(+)