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
  915fcd0ae8. 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.
This commit is contained in:
Takashi Yano 2020-01-06 23:38:34 +09:00 committed by Corinna Vinschen
parent a6e87f589a
commit a1c7e92084
2 changed files with 13 additions and 3 deletions

View File

@ -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;
}

View File

@ -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) {}
};