aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vis-subprocess.c16
-rw-r--r--vis-subprocess.h1
-rw-r--r--vis.c1
3 files changed, 18 insertions, 0 deletions
diff --git a/vis-subprocess.c b/vis-subprocess.c
index 31a1479..e17d24f 100644
--- a/vis-subprocess.c
+++ b/vis-subprocess.c
@@ -230,3 +230,19 @@ void vis_process_tick(Vis *vis, fd_set *readfds) {
}
}
}
+
+/**
+ * Checks if each subprocess from the pool is dead or needs to be
+ * killed then raises an event or kills it if necessary.
+ */
+void vis_process_waitall(Vis *vis) {
+ for (Process **pointer = &process_pool; *pointer; ) {
+ Process *current = *pointer;
+ if (!wait_or_kill_process(vis, current)) {
+ pointer = &current->next;
+ } else {
+ /* update our iteration pointer */
+ *pointer = destroy_process(current);
+ }
+ }
+}
diff --git a/vis-subprocess.h b/vis-subprocess.h
index 2e4c222..79a043e 100644
--- a/vis-subprocess.h
+++ b/vis-subprocess.h
@@ -27,4 +27,5 @@ Process *vis_process_communicate(Vis *, const char *command, const char *name,
Invalidator **invalidator);
int vis_process_before_tick(fd_set *);
void vis_process_tick(Vis *, fd_set *);
+void vis_process_waitall(Vis *);
#endif
diff --git a/vis.c b/vis.c
index 10c3df5..d1c0dab 100644
--- a/vis.c
+++ b/vis.c
@@ -623,6 +623,7 @@ void vis_free(Vis *vis) {
while (vis->windows)
vis_window_close(vis->windows);
vis_event_emit(vis, VIS_EVENT_QUIT);
+ vis_process_waitall(vis);
file_free(vis, vis->command_file);
file_free(vis, vis->search_file);
file_free(vis, vis->error_file);