Commit 30525aff78e9ee2099b24a3dc7534317ee130383
1 parent
8653c015
Avoid infinite loop around timed condition variable
This can happen due to spurious wakeups git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6631 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
7 additions
and
6 deletions
posix-aio-compat.c
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | #include <pthread.h> | 14 | #include <pthread.h> |
15 | #include <unistd.h> | 15 | #include <unistd.h> |
16 | #include <errno.h> | 16 | #include <errno.h> |
17 | -#include <sys/time.h> | 17 | +#include <time.h> |
18 | #include <string.h> | 18 | #include <string.h> |
19 | #include <stdlib.h> | 19 | #include <stdlib.h> |
20 | #include <stdio.h> | 20 | #include <stdio.h> |
@@ -86,16 +86,17 @@ static void *aio_thread(void *unused) | @@ -86,16 +86,17 @@ static void *aio_thread(void *unused) | ||
86 | struct qemu_paiocb *aiocb; | 86 | struct qemu_paiocb *aiocb; |
87 | size_t offset; | 87 | size_t offset; |
88 | int ret = 0; | 88 | int ret = 0; |
89 | + qemu_timeval tv; | ||
90 | + struct timespec ts; | ||
91 | + | ||
92 | + qemu_gettimeofday(&tv); | ||
93 | + ts.tv_sec = tv.tv_sec + 10; | ||
94 | + ts.tv_nsec = 0; | ||
89 | 95 | ||
90 | mutex_lock(&lock); | 96 | mutex_lock(&lock); |
91 | 97 | ||
92 | while (TAILQ_EMPTY(&request_list) && | 98 | while (TAILQ_EMPTY(&request_list) && |
93 | !(ret == ETIMEDOUT)) { | 99 | !(ret == ETIMEDOUT)) { |
94 | - struct timespec ts = { 0 }; | ||
95 | - qemu_timeval tv; | ||
96 | - | ||
97 | - qemu_gettimeofday(&tv); | ||
98 | - ts.tv_sec = tv.tv_sec + 10; | ||
99 | ret = cond_timedwait(&cond, &lock, &ts); | 100 | ret = cond_timedwait(&cond, &lock, &ts); |
100 | } | 101 | } |
101 | 102 |