mutex: make 0/1 FIO_MUTEX_LOCKED and FIO_MUTEX_UNLOCKED
[fio.git] / backend.c
index a9885c6042f75e93a40bb073f2c215999c0d5eb6..e41e8f1b41fffe64a8dc023523b48e482dd662d0 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -50,6 +50,7 @@
 #include "server.h"
 
 static pthread_t disk_util_thread;
+static struct fio_mutex *disk_thread_mutex;
 static struct fio_mutex *startup_mutex;
 static struct fio_mutex *writeout_mutex;
 static struct flist_head *cgroup_list;
@@ -87,6 +88,11 @@ static void sig_int(int sig)
        }
 }
 
+static void sig_show_status(int sig)
+{
+       show_running_run_stats();
+}
+
 static void set_sig_handlers(void)
 {
        struct sigaction act;
@@ -101,6 +107,11 @@ static void set_sig_handlers(void)
        act.sa_flags = SA_RESTART;
        sigaction(SIGTERM, &act, NULL);
 
+       memset(&act, 0, sizeof(act));
+       act.sa_handler = sig_show_status;
+       act.sa_flags = SA_RESTART;
+       sigaction(SIGUSR1, &act, NULL);
+
        if (is_backend) {
                memset(&act, 0, sizeof(act));
                act.sa_handler = sig_int;
@@ -558,7 +569,8 @@ static void do_io(struct thread_data *td)
                td_set_runstate(td, TD_RUNNING);
 
        while ((td->o.read_iolog_file && !flist_empty(&td->io_log_list)) ||
-               (!flist_empty(&td->trim_list)) || !io_bytes_exceeded(td)) {
+               (!flist_empty(&td->trim_list)) || !io_bytes_exceeded(td) ||
+               td->o.time_based) {
                struct timeval comp_time;
                unsigned long bytes_done[2] = { 0, 0 };
                int min_evts = 0;
@@ -1044,7 +1056,7 @@ static void *thread_main(void *data)
                }
        }
 
-       if (td->o.cgroup_weight && cgroup_setup(td, cgroup_list, &cgroup_mnt))
+       if (td->o.cgroup && cgroup_setup(td, cgroup_list, &cgroup_mnt))
                goto err;
 
        errno = 0;
@@ -1293,6 +1305,7 @@ static void reap_threads(unsigned int *nr_running, unsigned int *t_rate,
                        if (errno == ECHILD) {
                                log_err("fio: pid=%d disappeared %d\n",
                                                (int) td->pid, td->runstate);
+                               td->sig = ECHILD;
                                td_set_runstate(td, TD_REAPED);
                                goto reaped;
                        }
@@ -1304,6 +1317,7 @@ static void reap_threads(unsigned int *nr_running, unsigned int *t_rate,
                                if (sig != SIGTERM)
                                        log_err("fio: pid=%d, got signal=%d\n",
                                                        (int) td->pid, sig);
+                               td->sig = sig;
                                td_set_runstate(td, TD_REAPED);
                                goto reaped;
                        }
@@ -1575,20 +1589,28 @@ static void run_threads(void)
        fio_unpin_memory();
 }
 
+void wait_for_disk_thread_exit(void)
+{
+       fio_mutex_down(disk_thread_mutex);
+}
+
 static void *disk_thread_main(void *data)
 {
+       int ret = 0;
+
        fio_mutex_up(startup_mutex);
 
-       while (threads) {
+       while (threads && !ret) {
                usleep(DISK_UTIL_MSEC * 1000);
                if (!threads)
                        break;
-               update_io_ticks();
+               ret = update_io_ticks();
 
                if (!is_backend)
                        print_thread_status();
        }
 
+       fio_mutex_up(disk_thread_mutex);
        return NULL;
 }
 
@@ -1596,14 +1618,20 @@ static int create_disk_util_thread(void)
 {
        int ret;
 
+       setup_disk_util();
+
+       disk_thread_mutex = fio_mutex_init(FIO_MUTEX_LOCKED);
+
        ret = pthread_create(&disk_util_thread, NULL, disk_thread_main, NULL);
        if (ret) {
+               fio_mutex_remove(disk_thread_mutex);
                log_err("Can't create disk util thread: %s\n", strerror(ret));
                return 1;
        }
 
        ret = pthread_detach(disk_util_thread);
        if (ret) {
+               fio_mutex_remove(disk_thread_mutex);
                log_err("Can't detatch disk util thread: %s\n", strerror(ret));
                return 1;
        }
@@ -1633,10 +1661,10 @@ int fio_backend(void)
                setup_log(&agg_io_log[DDIR_WRITE], 0);
        }
 
-       startup_mutex = fio_mutex_init(0);
+       startup_mutex = fio_mutex_init(FIO_MUTEX_LOCKED);
        if (startup_mutex == NULL)
                return 1;
-       writeout_mutex = fio_mutex_init(1);
+       writeout_mutex = fio_mutex_init(FIO_MUTEX_UNLOCKED);
        if (writeout_mutex == NULL)
                return 1;
 
@@ -1660,11 +1688,13 @@ int fio_backend(void)
        for_each_td(td, i)
                fio_options_free(td);
 
+       free_disk_util();
        cgroup_kill(cgroup_list);
        sfree(cgroup_list);
        sfree(cgroup_mnt);
 
        fio_mutex_remove(startup_mutex);
        fio_mutex_remove(writeout_mutex);
+       fio_mutex_remove(disk_thread_mutex);
        return exit_value;
 }