Commit 30525aff78e9ee2099b24a3dc7534317ee130383

Authored by malc
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