1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

misc: Set generic pselect as ENOSYS

The generic pselect implementation has the very specific race condition
that motived the creation of the pselect syscall (no atomicity in
signal mask set/reset).  Using it as generic implementation is
counterproductive  Also currently only microblaze uses it as fallback
when used on kernel prior 3.15.

This patch moves the generic implementation to a microblaze specific
one, sets the generic internal as a ENOSYS, and cleanups the Linux
generic implementation.

The microblaze implementation mimics the previous Linux generic one,
where it either uses pselect6 directly if __ASSUME_PSELECT or a
first try pselect6 then the fallback otherwise.

Checked on x86_64-linux-gnu and microblaze-linux-gnu.
This commit is contained in:
Adhemerval Zanella
2019-11-14 18:18:24 -03:00
parent 102b5b0caf
commit 8781c1301d
3 changed files with 80 additions and 76 deletions

View File

@ -16,23 +16,9 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <errno.h>
#include <signal.h>
#include <time.h>
#include <sys/poll.h>
#include <kernel-features.h>
#include <sys/select.h>
#include <sysdep-cancel.h>
#ifdef __NR_pselect6
# ifndef __ASSUME_PSELECT
static int __generic_pselect (int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds,
const struct timespec *timeout,
const sigset_t *sigmask);
# endif
int
__pselect (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
const struct timespec *timeout, const sigset_t *sigmask)
@ -59,24 +45,9 @@ __pselect (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
data.ss = (__syscall_ulong_t) (uintptr_t) sigmask;
data.ss_len = _NSIG / 8;
int result = SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds,
timeout, &data);
# ifndef __ASSUME_PSELECT
if (result == -1 && errno == ENOSYS)
result = __generic_pselect (nfds, readfds, writefds, exceptfds, timeout,
sigmask);
# endif
return result;
return SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds,
timeout, &data);
}
#ifndef __pselect
weak_alias (__pselect, pselect)
# ifndef __ASSUME_PSELECT
# define __pselect static __generic_pselect
# endif
#endif
#ifndef __ASSUME_PSELECT
# include <misc/pselect.c>
#endif