summaryrefslogtreecommitdiff
path: root/lib/tp.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tp.c')
-rw-r--r--lib/tp.c119
1 files changed, 0 insertions, 119 deletions
diff --git a/lib/tp.c b/lib/tp.c
deleted file mode 100644
index 7462f5bf..00000000
--- a/lib/tp.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Basic workqueue like code, that sets up a thread and allows async
- * processing of some sort. Could be extended to allow for multiple
- * worker threads. But right now fio associates one of this per IO
- * thread, so should be enough to have just a single thread doing the
- * work.
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <unistd.h>
-#include <errno.h>
-#include <pthread.h>
-#include <string.h>
-
-#include "../smalloc.h"
-#include "../log.h"
-#include "tp.h"
-
-static void tp_flush_work(struct flist_head *list)
-{
- struct tp_work *work;
-
- while (!flist_empty(list)) {
- int prio;
-
- work = flist_entry(list->next, struct tp_work, list);
- flist_del(&work->list);
-
- prio = work->prio;
- if (nice(prio) < 0)
- log_err("fio: nice %s\n", strerror(errno));
-
- work->fn(work);
-
- if (nice(prio) < 0)
- log_err("fio: nice %s\n", strerror(errno));
- }
-}
-
-static void *tp_thread(void *data)
-{
- struct tp_data *tdat = data;
- struct flist_head work_list;
-
- INIT_FLIST_HEAD(&work_list);
-
- while (1) {
- pthread_mutex_lock(&tdat->lock);
-
- if (!tdat->thread_exit && flist_empty(&tdat->work))
- pthread_cond_wait(&tdat->cv, &tdat->lock);
-
- if (!flist_empty(&tdat->work))
- flist_splice_tail_init(&tdat->work, &work_list);
-
- pthread_mutex_unlock(&tdat->lock);
-
- if (flist_empty(&work_list)) {
- if (tdat->thread_exit)
- break;
- continue;
- }
-
- tp_flush_work(&work_list);
- }
-
- return NULL;
-}
-
-void tp_queue_work(struct tp_data *tdat, struct tp_work *work)
-{
- work->done = 0;
-
- pthread_mutex_lock(&tdat->lock);
- flist_add_tail(&work->list, &tdat->work);
- pthread_mutex_unlock(&tdat->lock);
-
- pthread_cond_signal(&tdat->cv);
-}
-
-void tp_init(struct tp_data **tdatp)
-{
- struct tp_data *tdat;
- int ret;
-
- if (*tdatp)
- return;
-
- *tdatp = tdat = smalloc(sizeof(*tdat));
- pthread_mutex_init(&tdat->lock, NULL);
- INIT_FLIST_HEAD(&tdat->work);
- pthread_cond_init(&tdat->cv, NULL);
- pthread_cond_init(&tdat->sleep_cv, NULL);
-
- ret = pthread_create(&tdat->thread, NULL, tp_thread, tdat);
- if (ret)
- log_err("fio: failed to create tp thread\n");
-}
-
-void tp_exit(struct tp_data **tdatp)
-{
- struct tp_data *tdat = *tdatp;
- void *ret;
-
- if (!tdat)
- return;
-
- pthread_mutex_lock(&tdat->lock);
- tdat->thread_exit = 1;
- pthread_mutex_unlock(&tdat->lock);
-
- pthread_cond_signal(&tdat->cv);
-
- pthread_join(tdat->thread, &ret);
-
- sfree(tdat);
- *tdatp = NULL;
-}