From e1ca36ff140075a48bfe8019c9d0e94d636430a3 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Fri, 28 Aug 2020 19:34:52 +0200 Subject: [PATCH] Cygwin: sigproc: Eliminate redundant copying of chld_procs On PROC_EXEC_CLEANUP, the pinfo's in chld_procs are removed. This is done in a loop always removing the child with index 0. This, however, results in copying the last child's pinfo in chld_procs to position 0. Do this for 100 children and you get 99 entirely useless copy operations. Fix this by calling remove_proc in reverse order. Signed-off-by: Corinna Vinschen --- winsup/cygwin/sigproc.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index f46d3d0d8..aa946fb4c 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -299,8 +299,10 @@ proc_subproc (DWORD what, uintptr_t val) goto scan_wait; case PROC_EXEC_CLEANUP: + /* Cleanup backwards to eliminate redundant copying of chld_procs + array members inside remove_proc. */ while (chld_procs.count ()) - remove_proc (0); + remove_proc (chld_procs.count () - 1); for (w = &waitq_head; w->next != NULL; w = w->next) CloseHandle (w->next->ev); break;