README: add hint on missing libaio-devel package
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index c1894f5f771fdeb92f1f05cc18ad55d645782a56..b79aa93e644296be9bdf0439863760d8dd4a6cfd 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -49,6 +49,7 @@ int nr_process = 0;
 int nr_thread = 0;
 int shm_id = 0;
 int temp_stall_ts;
+unsigned long done_secs = 0;
 
 static struct fio_mutex *startup_mutex;
 static volatile int fio_abort;
@@ -74,10 +75,12 @@ static void terminate_threads(int group_id)
        struct thread_data *td;
        int i;
 
+       dprint(FD_PROCESS, "terminate group_id=%d\n", group_id);
+
        for_each_td(td, i) {
                if (group_id == TERMINATE_ALL || groupid == td->groupid) {
-                       dprint(FD_PROCESS, "setting terminate on %d\n",
-                                                               td->pid);
+                       dprint(FD_PROCESS, "setting terminate on %s/%d\n",
+                                                       td->o.name, td->pid);
                        td->terminate = 1;
                        td->o.start_delay = 0;
 
@@ -1108,23 +1111,16 @@ static void reap_threads(int *nr_running, int *t_rate, int *m_rate)
                pending++;
                continue;
 reaped:
-               if (td->o.use_thread) {
-                       long ret;
-
-                       dprint(FD_PROCESS, "joining tread %d\n", td->pid);
-                       if (pthread_join(td->thread, (void *) &ret)) {
-                               dprint(FD_PROCESS, "join failed %ld\n", ret);
-                               perror("pthread_join");
-                       }
-               }
-
                (*nr_running)--;
                (*m_rate) -= td->o.ratemin;
                (*t_rate) -= td->o.rate;
-               pending--;
+               if (!td->pid)
+                       pending--;
 
                if (td->error)
                        exit_value++;
+
+               done_secs += mtime_since_now(&td->epoch) / 1000;
        }
 
        if (*nr_running == cputhreads && !pending && realthreads)
@@ -1232,8 +1228,11 @@ static void run_threads(void)
                                        continue;
                        }
 
-                       if (td->o.stonewall && (nr_started || nr_running))
+                       if (td->o.stonewall && (nr_started || nr_running)) {
+                               dprint(FD_PROCESS, "%s: stonewall wait\n",
+                                                       td->o.name);
                                break;
+                       }
 
                        /*
                         * Set state to created. Thread will transition
@@ -1247,10 +1246,12 @@ static void run_threads(void)
                                dprint(FD_PROCESS, "will pthread_create\n");
                                if (pthread_create(&td->thread, NULL,
                                                   thread_main, td)) {
-                                       perror("thread_create");
+                                       perror("pthread_create");
                                        nr_started--;
                                        break;
                                }
+                               if (pthread_detach(td->thread) < 0)
+                                       perror("pthread_detach");
                        } else {
                                dprint(FD_PROCESS, "will fork\n");
                                if (!fork()) {