projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of https://github.com/guoanwu/fio
[fio.git]
/
workqueue.c
diff --git
a/workqueue.c
b/workqueue.c
index 841dbb9ffffa6de6252990592e7d750e876442b5..9e6c41ff2f399172703b6e438061236670962df8 100644
(file)
--- a/
workqueue.c
+++ b/
workqueue.c
@@
-85,19
+85,18
@@
static bool all_sw_idle(struct workqueue *wq)
*/
void workqueue_flush(struct workqueue *wq)
{
*/
void workqueue_flush(struct workqueue *wq)
{
+ pthread_mutex_lock(&wq->flush_lock);
wq->wake_idle = 1;
wq->wake_idle = 1;
- while (!all_sw_idle(wq)) {
- pthread_mutex_lock(&wq->flush_lock);
+ while (!all_sw_idle(wq))
pthread_cond_wait(&wq->flush_cond, &wq->flush_lock);
pthread_cond_wait(&wq->flush_cond, &wq->flush_lock);
- pthread_mutex_unlock(&wq->flush_lock);
- }
wq->wake_idle = 0;
wq->wake_idle = 0;
+ pthread_mutex_unlock(&wq->flush_lock);
}
/*
}
/*
- * Must be serialized by caller.
Returns true for queued, false for busy.
+ * Must be serialized by caller.
*/
void workqueue_enqueue(struct workqueue *wq, struct workqueue_work *work)
{
*/
void workqueue_enqueue(struct workqueue *wq, struct workqueue_work *work)
{
@@
-159,12
+158,10
@@
static void *worker_thread(void *data)
if (sw->flags & SW_F_ERROR)
goto done;
if (sw->flags & SW_F_ERROR)
goto done;
+ pthread_mutex_lock(&sw->lock);
while (1) {
while (1) {
- pthread_mutex_lock(&sw->lock);
-
if (flist_empty(&sw->work_list)) {
if (sw->flags & SW_F_EXIT) {
if (flist_empty(&sw->work_list)) {
if (sw->flags & SW_F_EXIT) {
- pthread_mutex_unlock(&sw->lock);
break;
}
break;
}
@@
-173,37
+170,41
@@
static void *worker_thread(void *data)
workqueue_pre_sleep(sw);
pthread_mutex_lock(&sw->lock);
}
workqueue_pre_sleep(sw);
pthread_mutex_lock(&sw->lock);
}
-
- /*
- * We dropped and reaquired the lock, check
- * state again.
- */
- if (!flist_empty(&sw->work_list))
- goto handle_work;
-
+ }
+ /*
+ * We may have dropped and reaquired the lock, check state
+ * again.
+ */
+ if (flist_empty(&sw->work_list)) {
if (sw->flags & SW_F_EXIT) {
if (sw->flags & SW_F_EXIT) {
- pthread_mutex_unlock(&sw->lock);
break;
break;
- } else if (!(sw->flags & SW_F_IDLE)) {
+ }
+ if (!(sw->flags & SW_F_IDLE)) {
sw->flags |= SW_F_IDLE;
wq->next_free_worker = sw->index;
sw->flags |= SW_F_IDLE;
wq->next_free_worker = sw->index;
+ pthread_mutex_unlock(&sw->lock);
+ pthread_mutex_lock(&wq->flush_lock);
if (wq->wake_idle)
pthread_cond_signal(&wq->flush_cond);
if (wq->wake_idle)
pthread_cond_signal(&wq->flush_cond);
+ pthread_mutex_unlock(&wq->flush_lock);
+ pthread_mutex_lock(&sw->lock);
+ }
+ }
+ if (flist_empty(&sw->work_list)) {
+ if (sw->flags & SW_F_EXIT) {
+ break;
}
}
- if (wq->ops.update_acct_fn)
- wq->ops.update_acct_fn(sw);
-
pthread_cond_wait(&sw->cond, &sw->lock);
} else {
pthread_cond_wait(&sw->cond, &sw->lock);
} else {
-handle_work:
flist_splice_init(&sw->work_list, &local_list);
}
pthread_mutex_unlock(&sw->lock);
handle_list(sw, &local_list);
flist_splice_init(&sw->work_list, &local_list);
}
pthread_mutex_unlock(&sw->lock);
handle_list(sw, &local_list);
+ if (wq->ops.update_acct_fn)
+ wq->ops.update_acct_fn(sw);
+ pthread_mutex_lock(&sw->lock);
}
}
-
- if (wq->ops.update_acct_fn)
- wq->ops.update_acct_fn(sw);
+ pthread_mutex_unlock(&sw->lock);
done:
sk_out_drop();
done:
sk_out_drop();
@@
-339,11
+340,11
@@
int workqueue_init(struct thread_data *td, struct workqueue *wq,
* Wait for them all to be started and initialized
*/
error = 0;
* Wait for them all to be started and initialized
*/
error = 0;
+ pthread_mutex_lock(&wq->flush_lock);
do {
struct submit_worker *sw;
running = 0;
do {
struct submit_worker *sw;
running = 0;
- pthread_mutex_lock(&wq->flush_lock);
for (i = 0; i < wq->max_workers; i++) {
sw = &wq->workers[i];
pthread_mutex_lock(&sw->lock);
for (i = 0; i < wq->max_workers; i++) {
sw = &wq->workers[i];
pthread_mutex_lock(&sw->lock);
@@
-354,14
+355,12
@@
int workqueue_init(struct thread_data *td, struct workqueue *wq,
pthread_mutex_unlock(&sw->lock);
}
pthread_mutex_unlock(&sw->lock);
}
- if (error || running == wq->max_workers) {
- pthread_mutex_unlock(&wq->flush_lock);
+ if (error || running == wq->max_workers)
break;
break;
- }
pthread_cond_wait(&wq->flush_cond, &wq->flush_lock);
pthread_cond_wait(&wq->flush_cond, &wq->flush_lock);
- pthread_mutex_unlock(&wq->flush_lock);
} while (1);
} while (1);
+ pthread_mutex_unlock(&wq->flush_lock);
if (!error)
return 0;
if (!error)
return 0;