It's just helper code, not fio core.
Signed-off-by: Jens Axboe <axboe@fb.com>
lib/lfsr.c gettime-thread.c helpers.c lib/flist_sort.c \
lib/hweight.c lib/getrusage.c idletime.c td_error.c \
profiles/tiobench.c profiles/act.c io_u_queue.c filelock.c \
- tp.c
+ lib/tp.c
ifdef CONFIG_64BIT_LLP64
CFLAGS += -DBITS_PER_LONG=32
#include "lib/getrusage.h"
#include "idletime.h"
#include "err.h"
-#include "tp.h"
+#include "lib/tp.h"
static pthread_t disk_util_thread;
static struct fio_mutex *disk_thread_mutex;
#include "verify.h"
#include "trim.h"
#include "filelock.h"
-#include "tp.h"
+#include "lib/tp.h"
static const char iolog_ver2[] = "fio version 2 iolog";
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.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)) {
+ work = flist_entry(list->next, struct tp_work, list);
+ flist_del(&work->list);
+ work->fn(work);
+ }
+}
+
+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(&tdat->work, &work_list);
+ INIT_FLIST_HEAD(&tdat->work);
+ }
+
+ 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_cond_signal(&tdat->cv);
+ pthread_mutex_unlock(&tdat->lock);
+}
+
+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;
+
+ tdat->thread_exit = 1;
+ pthread_mutex_lock(&tdat->lock);
+ pthread_cond_signal(&tdat->cv);
+ pthread_mutex_unlock(&tdat->lock);
+
+ pthread_join(tdat->thread, &ret);
+
+ sfree(tdat);
+ *tdatp = NULL;
+}
--- /dev/null
+#ifndef FIO_TP_H
+#define FIO_TP_H
+
+#include "../flist.h"
+
+struct tp_work;
+typedef int (tp_work_fn)(struct tp_work *);
+
+struct tp_work {
+ struct flist_head list;
+ tp_work_fn *fn;
+ int wait;
+ pthread_cond_t cv;
+ pthread_mutex_t lock;
+ volatile int done;
+};
+
+struct tp_data {
+ pthread_t thread;
+ pthread_cond_t cv;
+ pthread_mutex_t lock;
+ struct flist_head work;
+ volatile int thread_exit;
+ pthread_cond_t sleep_cv;
+ volatile int sleeping;
+};
+
+extern void tp_init(struct tp_data **);
+extern void tp_exit(struct tp_data **);
+extern void tp_queue_work(struct tp_data *, struct tp_work *);
+
+#endif
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <unistd.h>
-#include <errno.h>
-#include <pthread.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)) {
- work = flist_entry(list->next, struct tp_work, list);
- flist_del(&work->list);
- work->fn(work);
- }
-}
-
-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(&tdat->work, &work_list);
- INIT_FLIST_HEAD(&tdat->work);
- }
-
- 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_cond_signal(&tdat->cv);
- pthread_mutex_unlock(&tdat->lock);
-}
-
-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;
-
- tdat->thread_exit = 1;
- pthread_mutex_lock(&tdat->lock);
- pthread_cond_signal(&tdat->cv);
- pthread_mutex_unlock(&tdat->lock);
-
- pthread_join(tdat->thread, &ret);
-
- sfree(tdat);
- *tdatp = NULL;
-}
+++ /dev/null
-#ifndef FIO_TP_H
-#define FIO_TP_H
-
-#include "flist.h"
-
-struct tp_work;
-typedef int (tp_work_fn)(struct tp_work *);
-
-struct tp_work {
- struct flist_head list;
- tp_work_fn *fn;
- int wait;
- pthread_cond_t cv;
- pthread_mutex_t lock;
- volatile int done;
-};
-
-struct tp_data {
- pthread_t thread;
- pthread_cond_t cv;
- pthread_mutex_t lock;
- struct flist_head work;
- volatile int thread_exit;
- pthread_cond_t sleep_cv;
- volatile int sleeping;
-};
-
-extern void tp_init(struct tp_data **);
-extern void tp_exit(struct tp_data **);
-extern void tp_queue_work(struct tp_data *, struct tp_work *);
-
-#endif