static void *helper_thread_main(void *data)
{
+ struct backend_data *d = data;
int ret = 0;
+ if (d)
+ pthread_setspecific(d->key, d->ptr);
+
fio_mutex_up(startup_mutex);
while (!ret) {
return NULL;
}
-static int create_helper_thread(void)
+static int create_helper_thread(struct backend_data *data)
{
int ret;
pthread_cond_init(&helper_cond, NULL);
pthread_mutex_init(&helper_lock, NULL);
- ret = pthread_create(&helper_thread, NULL, helper_thread_main, NULL);
+ ret = pthread_create(&helper_thread, NULL, helper_thread_main, data);
if (ret) {
log_err("Can't create helper thread: %s\n", strerror(ret));
return 1;
return 0;
}
-int fio_backend(void)
+int fio_backend(struct backend_data *data)
{
struct thread_data *td;
int i;
set_genesis_time();
stat_init();
- create_helper_thread();
+ create_helper_thread(data);
cgroup_list = smalloc(sizeof(*cgroup_list));
INIT_FLIST_HEAD(cgroup_list);
RATE_PROCESS_POISSON = 1,
};
+/*
+ * Per-thread/process specific data. Only used for the network client
+ * for now.
+ */
+struct backend_data {
+ pthread_key_t key;
+ void *ptr;
+};
+
/*
* This describes a single thread/process executing a fio job.
*/
extern int __must_check parse_options(int, char **);
extern int parse_jobs_ini(char *, int, int, int);
extern int parse_cmd_line(int, char **, int);
-extern int fio_backend(void);
+extern int fio_backend(struct backend_data *);
extern void reset_fio_state(void);
extern void clear_io_state(struct thread_data *, int);
extern int fio_options_parse(struct thread_data *, char **, int, int);