+/** @brief Terminate and wait for all child processes
+ * @param ev Event loop
+ *
+ * Does *not* call the completion callbacks. Only used during teardown.
+ */
+void ev_child_killall(ev_source *ev) {
+ int n, rc, w;
+
+ for(n = 0; n < ev->nchildren; ++n) {
+ if(kill(ev->children[n].pid, SIGTERM) < 0) {
+ disorder_error(errno, "sending SIGTERM to pid %lu",
+ (unsigned long)ev->children[n].pid);
+ ev->children[n].pid = -1;
+ }
+ }
+ for(n = 0; n < ev->nchildren; ++n) {
+ if(ev->children[n].pid == -1)
+ continue;
+ do {
+ rc = waitpid(ev->children[n].pid, &w, 0);
+ } while(rc < 0 && errno == EINTR);
+ if(rc < 0) {
+ disorder_error(errno, "waiting for pid %lu",
+ (unsigned long)ev->children[n].pid);
+ continue;
+ }
+ }
+ ev->nchildren = 0;
+}
+