}
-static void io_workqueue_exit_worker_fn(struct submit_worker *sw)
+static void io_workqueue_exit_worker_fn(struct submit_worker *sw,
+ unsigned int *sum_cnt)
{
struct thread_data *td = sw->private;
+ (*sum_cnt)++;
+ sum_thread_stats(&sw->wq->td->ts, &td->ts, *sum_cnt == 1);
+
fio_options_free(td);
close_and_free_files(td);
if (td->io_ops)
return NULL;
}
-static void free_worker(struct submit_worker *sw)
+static void free_worker(struct submit_worker *sw, unsigned int *sum_cnt)
{
struct workqueue *wq = sw->wq;
- workqueue_exit_worker(sw);
+ workqueue_exit_worker(sw, sum_cnt);
pthread_cond_destroy(&sw->cond);
pthread_mutex_destroy(&sw->lock);
static void shutdown_worker(struct submit_worker *sw, unsigned int *sum_cnt)
{
- struct thread_data *parent = sw->wq->td;
- struct thread_data *td = sw->private;
-
pthread_join(sw->thread, NULL);
- (*sum_cnt)++;
- sum_thread_stats(&parent->ts, &td->ts, *sum_cnt == 1);
- free_worker(sw);
+ free_worker(sw, sum_cnt);
}
void workqueue_exit(struct workqueue *wq)
return 0;
}
- free_worker(sw);
+ free_worker(sw, NULL);
return 1;
}
typedef int (workqueue_alloc_worker_fn)(struct submit_worker *);
typedef void (workqueue_free_worker_fn)(struct submit_worker *);
typedef int (workqueue_init_worker_fn)(struct submit_worker *);
-typedef void (workqueue_exit_worker_fn)(struct submit_worker *);
+typedef void (workqueue_exit_worker_fn)(struct submit_worker *, unsigned int *);
typedef void (workqueue_update_acct_fn)(struct submit_worker *);
struct workqueue_ops {
return wq->ops.init_worker_fn(sw);
}
-static inline void workqueue_exit_worker(struct submit_worker *sw)
+static inline void workqueue_exit_worker(struct submit_worker *sw,
+ unsigned int *sum_cnt)
{
struct workqueue *wq = sw->wq;
+ unsigned int tmp = 1;
if (!wq->ops.exit_worker_fn)
return;
- wq->ops.exit_worker_fn(sw);
+ if (!sum_cnt)
+ sum_cnt = &tmp;
+
+ wq->ops.exit_worker_fn(sw, sum_cnt);
}
#endif