static sem_t startup_sem;
-static volatile int do_quit;
-
static void sig_handler(int sig)
{
int i;
+ printf("got signal %d\n", sig);
+
for (i = 0; i < thread_number; i++) {
struct thread_data *td = &threads[i];
static void terminate_threads(void)
{
- do_quit = 1;
- sig_handler(0);
+ int i;
+
+ for (i = 0; i < thread_number; i++) {
+ struct thread_data *td = &threads[i];
+
+ td->terminate = 1;
+ td->start_delay = 0;
+ }
}
static int init_random_state(struct thread_data *td)
int prio, prio_class;
unsigned long bw = 0;
+ if (!td->io_blocks && !td->error)
+ return;
+
if (td->runtime)
bw = (td->io_blocks * td->bs) / td->runtime;
return i;
}
-static int reap_threads(void)
+static void reap_threads(int *nr_running, int *t_rate, int *m_rate)
{
- int i, reaped = 0;
+ int i;
for (i = 0; i < thread_number; i++) {
struct thread_data *td = &threads[i];
- if (td->runstate == TD_EXITED) {
- td->runstate = TD_REAPED;
- waitpid(td->pid, NULL, 0);
- reaped++;
- }
- }
+ if (td->runstate != TD_EXITED)
+ continue;
- return reaped;
+ td->runstate = TD_REAPED;
+ waitpid(td->pid, NULL, 0);
+ (*nr_running)--;
+ (*m_rate) -= td->ratemin;
+ (*t_rate) -= td->rate;
+ printf("Threads now running: %d", *nr_running);
+ if (*m_rate || *t_rate)
+ printf(", rate %d/%dKiB/sec", *t_rate, *m_rate);
+ printf("\n");
+ }
}
static void run_threads(char *argv[])
struct timeval genesis, now;
struct thread_data *td;
unsigned long spent;
- int i, todo, nr_running;
+ int i, todo, nr_running, m_rate, t_rate;
gettimeofday(&genesis, NULL);
todo = thread_number;
nr_running = 0;
+ m_rate = t_rate = 0;
- while (todo && !do_quit) {
+ while (todo) {
for (i = 0; i < thread_number; i++) {
td = &threads[i];
if (td->runstate != TD_NOT_CREATED)
continue;
+ /*
+ * never got a chance to start, killed by other
+ * thread for some reason
+ */
+ if (td->terminate) {
+ todo--;
+ continue;
+ }
+
if (td->start_delay) {
gettimeofday(&now, NULL);
spent = mtime_since(&genesis, &now);
if (td->runstate == TD_CREATED) {
td->runstate = TD_STARTED;
nr_running++;
+ m_rate += td->ratemin;
+ t_rate += td->rate;
sem_post(&td->mutex);
- printf("%d threads now running\n", nr_running);
+
+ printf("Threads now running: %d", nr_running);
+ if (m_rate || t_rate)
+ printf(", rate %d/%dKiB/sec", t_rate, m_rate);
+ printf("\n");
}
}
- nr_running -= reap_threads();
+ reap_threads(&nr_running, &t_rate, &m_rate);
if (todo)
usleep(100000);
}
while (nr_running) {
- nr_running -= reap_threads();
+ reap_threads(&nr_running, &t_rate, &m_rate);
usleep(10000);
}
}