12 static void tp_flush_work(struct flist_head *list)
16 while (!flist_empty(list)) {
17 work = flist_entry(list->next, struct tp_work, list);
18 flist_del(&work->list);
23 static void *tp_thread(void *data)
25 struct tp_data *tdat = data;
26 struct flist_head work_list;
28 INIT_FLIST_HEAD(&work_list);
31 pthread_mutex_lock(&tdat->lock);
33 if (!tdat->thread_exit && flist_empty(&tdat->work))
34 pthread_cond_wait(&tdat->cv, &tdat->lock);
36 if (!flist_empty(&tdat->work)) {
37 flist_splice(&tdat->work, &work_list);
38 INIT_FLIST_HEAD(&tdat->work);
41 pthread_mutex_unlock(&tdat->lock);
43 if (flist_empty(&work_list)) {
44 if (tdat->thread_exit)
49 tp_flush_work(&work_list);
55 void tp_queue_work(struct tp_data *tdat, struct tp_work *work)
59 pthread_mutex_lock(&tdat->lock);
60 flist_add_tail(&work->list, &tdat->work);
61 pthread_cond_signal(&tdat->cv);
62 pthread_mutex_unlock(&tdat->lock);
65 void tp_init(struct tp_data **tdatp)
73 *tdatp = tdat = smalloc(sizeof(*tdat));
74 pthread_mutex_init(&tdat->lock, NULL);
75 INIT_FLIST_HEAD(&tdat->work);
76 pthread_cond_init(&tdat->cv, NULL);
77 pthread_cond_init(&tdat->sleep_cv, NULL);
79 ret = pthread_create(&tdat->thread, NULL, tp_thread, tdat);
81 log_err("fio: failed to create tp thread\n");
84 void tp_exit(struct tp_data **tdatp)
86 struct tp_data *tdat = *tdatp;
92 tdat->thread_exit = 1;
93 pthread_mutex_lock(&tdat->lock);
94 pthread_cond_signal(&tdat->cv);
95 pthread_mutex_unlock(&tdat->lock);
97 pthread_join(tdat->thread, &ret);