/*
* if the thread is running, just let it exit
*/
- if (td->runstate < TD_RAMP)
+ if (!td->pid)
+ continue;
+ else if (td->runstate < TD_RAMP)
kill(td->pid, SIGTERM);
else {
struct ioengine_ops *ops = td->io_ops;
/*
* if we can queue more, do so. but check if there are
- * completed io_u's first.
+ * completed io_u's first. Note that we can get BUSY even
+ * without IO queued, if the system is resource starved.
*/
- full = queue_full(td) || ret == FIO_Q_BUSY;
+ full = queue_full(td) || (ret == FIO_Q_BUSY && td->cur_depth);
if (full || !td->o.iodepth_batch_complete) {
min_events = min(td->o.iodepth_batch_complete,
td->cur_depth);
break;
/*
- * See if we need to complete some commands
+ * See if we need to complete some commands. Note that we
+ * can get BUSY even without IO queued, if the system is
+ * resource starved.
*/
- full = queue_full(td) || ret == FIO_Q_BUSY;
+ full = queue_full(td) || (ret == FIO_Q_BUSY && td->cur_depth);
if (full || !td->o.iodepth_batch_complete) {
min_evts = min(td->o.iodepth_batch_complete,
td->cur_depth);
pthread_condattr_t attr;
int clear_state;
- if (!td->o.use_thread)
+ if (!td->o.use_thread) {
setsid();
-
- td->pid = getpid();
+ td->pid = getpid();
+ } else
+ td->pid = gettid();
dprint(FD_PROCESS, "jobs pid=%d started\n", (int) td->pid);
struct thread_data *td;
void *data, *ret;
+#ifndef __hpux
data = shmat(shmid, NULL, 0);
if (data == (void *) -1) {
int __err = errno;
perror("shmat");
return __err;
}
+#else
+ /*
+ * HP-UX inherits shm mappings?
+ */
+ data = threads;
+#endif
td = data + offset * sizeof(struct thread_data);
ret = thread_main(td);