Commit 8653c0158c23ec592f0041ab48b83d6cc6d152fe
1 parent
5518f3a6
Error checking
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6630 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
72 additions
and
24 deletions
posix-aio-compat.c
... | ... | @@ -15,6 +15,9 @@ |
15 | 15 | #include <unistd.h> |
16 | 16 | #include <errno.h> |
17 | 17 | #include <sys/time.h> |
18 | +#include <string.h> | |
19 | +#include <stdlib.h> | |
20 | +#include <stdio.h> | |
18 | 21 | #include "osdep.h" |
19 | 22 | |
20 | 23 | #include "posix-aio-compat.h" |
... | ... | @@ -27,20 +30,64 @@ static int cur_threads = 0; |
27 | 30 | static int idle_threads = 0; |
28 | 31 | static TAILQ_HEAD(, qemu_paiocb) request_list; |
29 | 32 | |
33 | +static void die2(int err, const char *what) | |
34 | +{ | |
35 | + fprintf(stderr, "%s failed: %s\n", what, strerror(err)); | |
36 | + abort(); | |
37 | +} | |
38 | + | |
39 | +static void die(const char *what) | |
40 | +{ | |
41 | + die2(errno, what); | |
42 | +} | |
43 | + | |
44 | +static void mutex_lock(pthread_mutex_t *mutex) | |
45 | +{ | |
46 | + int ret = pthread_mutex_lock(mutex); | |
47 | + if (ret) die2(ret, "pthread_mutex_lock"); | |
48 | +} | |
49 | + | |
50 | +static void mutex_unlock(pthread_mutex_t *mutex) | |
51 | +{ | |
52 | + int ret = pthread_mutex_unlock(mutex); | |
53 | + if (ret) die2(ret, "pthread_mutex_unlock"); | |
54 | +} | |
55 | + | |
56 | +static int cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, | |
57 | + struct timespec *ts) | |
58 | +{ | |
59 | + int ret = pthread_cond_timedwait(cond, mutex, ts); | |
60 | + if (ret && ret != ETIMEDOUT) die2(ret, "pthread_cond_timedwait"); | |
61 | + return ret; | |
62 | +} | |
63 | + | |
64 | +static void cond_broadcast(pthread_cond_t *cond) | |
65 | +{ | |
66 | + int ret = pthread_cond_broadcast(cond); | |
67 | + if (ret) die2(ret, "pthread_cond_broadcast"); | |
68 | +} | |
69 | + | |
70 | +static void thread_create(pthread_t *thread, pthread_attr_t *attr, | |
71 | + void *(*start_routine)(void*), void *arg) | |
72 | +{ | |
73 | + int ret = pthread_create(thread, attr, start_routine, arg); | |
74 | + if (ret) die2(ret, "pthread_create"); | |
75 | +} | |
76 | + | |
30 | 77 | static void *aio_thread(void *unused) |
31 | 78 | { |
32 | 79 | sigset_t set; |
33 | 80 | |
34 | 81 | /* block all signals */ |
35 | - sigfillset(&set); | |
36 | - sigprocmask(SIG_BLOCK, &set, NULL); | |
82 | + if (sigfillset(&set)) die("sigfillset"); | |
83 | + if (sigprocmask(SIG_BLOCK, &set, NULL)) die("sigprocmask"); | |
37 | 84 | |
38 | 85 | while (1) { |
39 | 86 | struct qemu_paiocb *aiocb; |
40 | 87 | size_t offset; |
41 | 88 | int ret = 0; |
42 | 89 | |
43 | - pthread_mutex_lock(&lock); | |
90 | + mutex_lock(&lock); | |
44 | 91 | |
45 | 92 | while (TAILQ_EMPTY(&request_list) && |
46 | 93 | !(ret == ETIMEDOUT)) { |
... | ... | @@ -49,7 +96,7 @@ static void *aio_thread(void *unused) |
49 | 96 | |
50 | 97 | qemu_gettimeofday(&tv); |
51 | 98 | ts.tv_sec = tv.tv_sec + 10; |
52 | - ret = pthread_cond_timedwait(&cond, &lock, &ts); | |
99 | + ret = cond_timedwait(&cond, &lock, &ts); | |
53 | 100 | } |
54 | 101 | |
55 | 102 | if (ret == ETIMEDOUT) |
... | ... | @@ -62,7 +109,7 @@ static void *aio_thread(void *unused) |
62 | 109 | aiocb->active = 1; |
63 | 110 | |
64 | 111 | idle_threads--; |
65 | - pthread_mutex_unlock(&lock); | |
112 | + mutex_unlock(&lock); | |
66 | 113 | |
67 | 114 | while (offset < aiocb->aio_nbytes) { |
68 | 115 | ssize_t len; |
... | ... | @@ -89,35 +136,36 @@ static void *aio_thread(void *unused) |
89 | 136 | offset += len; |
90 | 137 | } |
91 | 138 | |
92 | - pthread_mutex_lock(&lock); | |
139 | + mutex_lock(&lock); | |
93 | 140 | aiocb->ret = offset; |
94 | 141 | idle_threads++; |
95 | - pthread_mutex_unlock(&lock); | |
142 | + mutex_unlock(&lock); | |
96 | 143 | |
97 | - kill(getpid(), aiocb->ev_signo); | |
144 | + if (kill(getpid(), aiocb->ev_signo)) die("kill failed"); | |
98 | 145 | } |
99 | 146 | |
100 | 147 | idle_threads--; |
101 | 148 | cur_threads--; |
102 | - pthread_mutex_unlock(&lock); | |
149 | + mutex_unlock(&lock); | |
103 | 150 | |
104 | 151 | return NULL; |
105 | 152 | } |
106 | 153 | |
107 | -static int spawn_thread(void) | |
154 | +static void spawn_thread(void) | |
108 | 155 | { |
109 | - pthread_attr_t attr; | |
110 | 156 | int ret; |
157 | + pthread_attr_t attr; | |
111 | 158 | |
112 | 159 | cur_threads++; |
113 | 160 | idle_threads++; |
114 | 161 | |
115 | - pthread_attr_init(&attr); | |
116 | - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); | |
117 | - ret = pthread_create(&thread_id, &attr, aio_thread, NULL); | |
118 | - pthread_attr_destroy(&attr); | |
119 | - | |
120 | - return ret; | |
162 | + ret = pthread_attr_init(&attr); | |
163 | + if (ret) die2 (ret, "pthread_attr_init"); | |
164 | + ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); | |
165 | + if (ret) die2 (ret, "pthread_attr_setdetachstate"); | |
166 | + thread_create(&thread_id, &attr, aio_thread, NULL); | |
167 | + ret = pthread_attr_destroy(&attr); | |
168 | + if (ret) die2 (ret, "pthread_attr_destroy"); | |
121 | 169 | } |
122 | 170 | |
123 | 171 | int qemu_paio_init(struct qemu_paioinit *aioinit) |
... | ... | @@ -132,12 +180,12 @@ static int qemu_paio_submit(struct qemu_paiocb *aiocb, int is_write) |
132 | 180 | aiocb->is_write = is_write; |
133 | 181 | aiocb->ret = -EINPROGRESS; |
134 | 182 | aiocb->active = 0; |
135 | - pthread_mutex_lock(&lock); | |
183 | + mutex_lock(&lock); | |
136 | 184 | if (idle_threads == 0 && cur_threads < max_threads) |
137 | 185 | spawn_thread(); |
138 | 186 | TAILQ_INSERT_TAIL(&request_list, aiocb, node); |
139 | - pthread_mutex_unlock(&lock); | |
140 | - pthread_cond_broadcast(&cond); | |
187 | + mutex_unlock(&lock); | |
188 | + cond_broadcast(&cond); | |
141 | 189 | |
142 | 190 | return 0; |
143 | 191 | } |
... | ... | @@ -156,9 +204,9 @@ ssize_t qemu_paio_return(struct qemu_paiocb *aiocb) |
156 | 204 | { |
157 | 205 | ssize_t ret; |
158 | 206 | |
159 | - pthread_mutex_lock(&lock); | |
207 | + mutex_lock(&lock); | |
160 | 208 | ret = aiocb->ret; |
161 | - pthread_mutex_unlock(&lock); | |
209 | + mutex_unlock(&lock); | |
162 | 210 | |
163 | 211 | return ret; |
164 | 212 | } |
... | ... | @@ -179,7 +227,7 @@ int qemu_paio_cancel(int fd, struct qemu_paiocb *aiocb) |
179 | 227 | { |
180 | 228 | int ret; |
181 | 229 | |
182 | - pthread_mutex_lock(&lock); | |
230 | + mutex_lock(&lock); | |
183 | 231 | if (!aiocb->active) { |
184 | 232 | TAILQ_REMOVE(&request_list, aiocb, node); |
185 | 233 | aiocb->ret = -ECANCELED; |
... | ... | @@ -188,7 +236,7 @@ int qemu_paio_cancel(int fd, struct qemu_paiocb *aiocb) |
188 | 236 | ret = QEMU_PAIO_NOTCANCELED; |
189 | 237 | else |
190 | 238 | ret = QEMU_PAIO_ALLDONE; |
191 | - pthread_mutex_unlock(&lock); | |
239 | + mutex_unlock(&lock); | |
192 | 240 | |
193 | 241 | return ret; |
194 | 242 | } | ... | ... |