From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 123781 invoked by alias); 13 Jan 2020 16:32:36 -0000 Mailing-List: contact cygwin-cvs-help@cygwin.com; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: cygwin-cvs-owner@cygwin.com Received: (qmail 123748 invoked by uid 9078); 13 Jan 2020 16:32:36 -0000 Date: Mon, 13 Jan 2020 16:32:00 -0000 Message-ID: <20200113163236.123747.qmail@sourceware.org> 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: select: Speed up select() call for pty, pipe and fifo. X-Act-Checkin: newlib-cygwin X-Git-Author: Takashi Yano X-Git-Refname: refs/heads/master X-Git-Oldrev: a6e87f589ae113cc3f947eca7db8c6d8c795e3c2 X-Git-Newrev: a1c7e920845ab21185f18950be3d84f4312222de X-SW-Source: 2020-q1/txt/msg00007.txt https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=a1c7e920845ab21185f18950be3d84f4312222de commit a1c7e920845ab21185f18950be3d84f4312222de Author: Takashi Yano Date: Mon Jan 6 23:38:34 2020 +0900 Cygwin: select: Speed up select() call for pty, pipe and fifo. - The slowing down issue of X11 forwarding using ssh -Y, reported in https://www.cygwin.com/ml/cygwin/2019-12/msg00295.html, is due to the change of select() code for pty in the commit 915fcd0ae8d83546ce135131cd25bf6795d97966. cygthread::detach() takes at most about 10msec because Sleep() is used in the thread. For this issue, this patch uses cygwait() instead of Sleep() and introduces an event to abort the wait. For not only pty, but pipe and fifo also have the same problem potentially, so this patch applies same strategy to them as well. Diff: --- winsup/cygwin/select.cc | 15 ++++++++++++--- winsup/cygwin/select.h | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index e701442..b3aedf2 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -744,7 +744,7 @@ thread_pipe (void *arg) } if (!looping) break; - Sleep (sleep_time >> 3); + cygwait (pi->bye, sleep_time >> 3); if (sleep_time < 80) ++sleep_time; if (pi->stop_thread) @@ -763,6 +763,7 @@ start_thread_pipe (select_record *me, select_stuff *stuff) { pi->start = &stuff->start; pi->stop_thread = false; + pi->bye = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); pi->thread = new cygthread (thread_pipe, pi, "pipesel"); me->h = *pi->thread; if (!me->h) @@ -780,8 +781,10 @@ pipe_cleanup (select_record *, select_stuff *stuff) if (pi->thread) { pi->stop_thread = true; + SetEvent (pi->bye); pi->thread->detach (); } + CloseHandle (pi->bye); delete pi; stuff->device_specific_pipe = NULL; } @@ -924,7 +927,7 @@ thread_fifo (void *arg) } if (!looping) break; - Sleep (sleep_time >> 3); + cygwait (pi->bye, sleep_time >> 3); if (sleep_time < 80) ++sleep_time; if (pi->stop_thread) @@ -943,6 +946,7 @@ start_thread_fifo (select_record *me, select_stuff *stuff) { pi->start = &stuff->start; pi->stop_thread = false; + pi->bye = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); pi->thread = new cygthread (thread_fifo, pi, "fifosel"); me->h = *pi->thread; if (!me->h) @@ -960,8 +964,10 @@ fifo_cleanup (select_record *, select_stuff *stuff) if (pi->thread) { pi->stop_thread = true; + SetEvent (pi->bye); pi->thread->detach (); } + CloseHandle (pi->bye); delete pi; stuff->device_specific_fifo = NULL; } @@ -1279,7 +1285,7 @@ thread_pty_slave (void *arg) } if (!looping) break; - Sleep (sleep_time >> 3); + cygwait (pi->bye, sleep_time >> 3); if (sleep_time < 80) ++sleep_time; if (pi->stop_thread) @@ -1303,6 +1309,7 @@ pty_slave_startup (select_record *me, select_stuff *stuff) { pi->start = &stuff->start; pi->stop_thread = false; + pi->bye = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); pi->thread = new cygthread (thread_pty_slave, pi, "ptyssel"); me->h = *pi->thread; if (!me->h) @@ -1325,8 +1332,10 @@ pty_slave_cleanup (select_record *me, select_stuff *stuff) if (pi->thread) { pi->stop_thread = true; + SetEvent (pi->bye); pi->thread->detach (); } + CloseHandle (pi->bye); delete pi; stuff->device_specific_ptys = NULL; } diff --git a/winsup/cygwin/select.h b/winsup/cygwin/select.h index ae98c65..98fde3a 100644 --- a/winsup/cygwin/select.h +++ b/winsup/cygwin/select.h @@ -44,6 +44,7 @@ struct select_info { cygthread *thread; bool stop_thread; + HANDLE bye; select_record *start; select_info (): thread (NULL), stop_thread (0), start (NULL) {} };