/* * call the destruct funtions of all the threadflow's flowops, * if it is still flagged as "running". */ void flowop_destruct_all_flows(threadflow_t *threadflow) { flowop_t *flowop; /* wait a moment to give other threads a chance to stop too */ (void) sleep(1); (void) ipc_mutex_lock(&threadflow->tf_lock); /* prepare to call destruct flow routines, if necessary */ if (threadflow->tf_running == 0) { /* allready destroyed */ (void) ipc_mutex_unlock(&threadflow->tf_lock); return; } flowop = threadflow->tf_thrd_fops; threadflow->tf_running = 0; (void) ipc_mutex_unlock(&threadflow->tf_lock); while (flowop) { flowop_destructflow(flowop); flowop = flowop->fo_exec_next; } }
/* * Delete the designated flowop from the thread's flowop list. * After removal from the list, the flowop is destroyed with * flowop_destructflow(). */ static void flowop_delete(flowop_t **flowoplist, flowop_t *flowop) { flowop_t *entry = *flowoplist; int found = 0; filebench_log(LOG_DEBUG_IMPL, "Deleting flowop (%s-%d)", flowop->fo_name, flowop->fo_instance); /* Delete from thread's flowop list */ if (flowop == *flowoplist) { /* First on list */ *flowoplist = flowop->fo_threadnext; filebench_log(LOG_DEBUG_IMPL, "Delete0 flowop: (%s-%d)", flowop->fo_name, flowop->fo_instance); } else { while (entry->fo_threadnext) { filebench_log(LOG_DEBUG_IMPL, "Delete0 flowop: (%s-%d) == (%s-%d)", entry->fo_threadnext->fo_name, entry->fo_threadnext->fo_instance, flowop->fo_name, flowop->fo_instance); if (flowop == entry->fo_threadnext) { /* Delete */ filebench_log(LOG_DEBUG_IMPL, "Deleted0 flowop: (%s-%d)", entry->fo_threadnext->fo_name, entry->fo_threadnext->fo_instance); entry->fo_threadnext = entry->fo_threadnext->fo_threadnext; break; } entry = entry->fo_threadnext; } } /* Call destructor */ flowop_destructflow(flowop); #ifdef HAVE_PROCFS /* Close /proc stats */ if (flowop->fo_thread) (void) close(flowop->fo_thread->tf_lwpusagefd); #endif /* Delete from global list */ entry = filebench_shm->flowoplist; if (flowop == filebench_shm->flowoplist) { /* First on list */ filebench_shm->flowoplist = flowop->fo_next; found = 1; } else { while (entry->fo_next) { filebench_log(LOG_DEBUG_IMPL, "Delete flowop: (%s-%d) == (%s-%d)", entry->fo_next->fo_name, entry->fo_next->fo_instance, flowop->fo_name, flowop->fo_instance); if (flowop == entry->fo_next) { /* Delete */ entry->fo_next = entry->fo_next->fo_next; found = 1; break; } entry = entry->fo_next; } } if (found) { filebench_log(LOG_DEBUG_IMPL, "Deleted flowop: (%s-%d)", flowop->fo_name, flowop->fo_instance); ipc_free(FILEBENCH_FLOWOP, (char *)flowop); } else { filebench_log(LOG_DEBUG_IMPL, "Flowop %s-%d not found!", flowop->fo_name, flowop->fo_instance); } }