Cygwin: select: revamp non-polling code for signalfd

Rather than waiting for signalfd_select_wait in a thread, which is racy,
create a global event "my_pendingsigs_evt" which is set and reset by
wait_sig depending only on the fact if blocked signals are pending or not.

This in turn allows to WFMO on this event in select as soon as signalfds
are present in the read descriptor set.  Select's peek and verify
will then check if one of the present signalfds is affected.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen
2019-08-16 16:36:06 +02:00
parent b7399d5e6f
commit 7097b05eda
8 changed files with 40 additions and 111 deletions

View File

@@ -71,12 +71,6 @@ struct select_serial_info: public select_info
select_serial_info (): select_info () {}
};
struct select_signalfd_info: public select_info
{
HANDLE evt;
select_signalfd_info (): select_info () {}
};
class select_stuff
{
public:
@@ -97,7 +91,6 @@ public:
select_fifo_info *device_specific_fifo;
select_socket_info *device_specific_socket;
select_serial_info *device_specific_serial;
select_signalfd_info *device_specific_signalfd;
bool test_and_set (int, fd_set *, fd_set *, fd_set *);
int poll (fd_set *, fd_set *, fd_set *);
@@ -110,8 +103,8 @@ public:
device_specific_pipe (NULL),
device_specific_fifo (NULL),
device_specific_socket (NULL),
device_specific_serial (NULL),
device_specific_signalfd (NULL) {}
device_specific_serial (NULL)
{}
};
extern "C" int cygwin_select (int , fd_set *, fd_set *, fd_set *,