From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2155) id 28E18393C86F; Fri, 28 Aug 2020 17:38:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 28E18393C86F Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: sigproc: Eliminate redundant copying of chld_procs X-Act-Checkin: newlib-cygwin X-Git-Author: Corinna Vinschen X-Git-Refname: refs/heads/master X-Git-Oldrev: c6b45af544b5e48127ea24650a72a2b7b8b75c58 X-Git-Newrev: b05b0b78fa91514473b092877da0f13be5a6b2c5 Message-Id: <20200828173823.28E18393C86F@sourceware.org> Date: Fri, 28 Aug 2020 17:38:23 +0000 (GMT) X-BeenThere: cygwin-cvs@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin core component git logs List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 28 Aug 2020 17:38:23 -0000 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=b05b0b78fa91514473b092877da0f13be5a6b2c5 commit b05b0b78fa91514473b092877da0f13be5a6b2c5 Author: Corinna Vinschen Date: Fri Aug 28 19:34:52 2020 +0200 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 Diff: --- 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;