diff options
author | Dmitriy Anisimkov <anisimko@adacore.com> | 2020-08-08 18:49:27 +0600 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2020-10-23 04:25:07 -0400 |
commit | d08d481912b9a2dc3388f8e1183cea0bf3ffae9f (patch) | |
tree | 22e513c76801fa433fcc0445892f3b47d4c7a0bf /gcc/ada/s-oscons-tmplt.c | |
parent | 66e97274cef35ed40584c7a09096fffa061fddf0 (diff) | |
download | gcc-d08d481912b9a2dc3388f8e1183cea0bf3ffae9f.zip gcc-d08d481912b9a2dc3388f8e1183cea0bf3ffae9f.tar.gz gcc-d08d481912b9a2dc3388f8e1183cea0bf3ffae9f.tar.bz2 |
[Ada] Sockets.Poll implementation
gcc/ada/
* Makefile.rtl (GNATRTL_SOCKETS_OBJS): New object
g-socpol$(objext) New source files noted: g-socpol.adb,
g-socpol.ads, g-socpol__dummy.adb, g-socpol__dummy.ads,
g-sopowa.adb, g-sopowa__posix.adb, g-sopowa__mingw.adb,
g-spogwa.adb, g-spogwa.ads.
* impunit.adb (Non_Imp_File_Names_95): New base filename
g-socpol in "GNAT Library Units" section for GNAT.Sockets.Poll
unit.
* libgnat/g-socket.ads, libgnat/g-socket.adb:
(Raise_Socket_Error): Moved from body to private part of
specification to use in GNAT.Sockets.Poll.
* libgnat/g-socpol.ads, libgnat/g-socpol.adb: Main unit of the
implementation.
* libgnat/g-socpol__dummy.ads, libgnat/g-socpol__dummy.adb:
Empty unit for the systems without sockets support.
* libgnat/g-spogwa.ads, libgnat/g-spogwa.adb: Generic unit
implementing sockets poll on top of select system call.
* libgnat/g-sopowa.adb (Wait): Separate implementation for
operation systems with poll system call support.
* libgnat/g-sopowa__posix.adb (Wait): Separate implementation
for POSIX select system call.
* libgnat/g-sopowa__mingw.adb (Wait): Separate implementation
for Windows select system call.
* gsocket.h (_WIN32_WINNT): Increase to 0x0600 for winsock2.h to
allow WSAPoll related definitions.
* s-oscons-tmplt.c: Fix comment next to #endif for
#if defined (__linux__) || defined (__ANDROID__) line. Include
<poll.h> for all except VxWorks and Windows.
(SIZEOF_nfds_t): New definition.
(SIZEOF_fd_type): New definition.
(SIZEOF_pollfd_events): New definition.
(POLLIN, POLLPRI, POLLOUT, POLLERR, POLLHUP, POLLNVAL): New
definitions for VxWorks to be able to emulate poll on top of
select in it. Define POLLPRI as zero on Windows as it is not
supported there.
(Poll_Linkname): New definition, because the poll system call
has different name in Windows and POSIX.
Diffstat (limited to 'gcc/ada/s-oscons-tmplt.c')
-rw-r--r-- | gcc/ada/s-oscons-tmplt.c | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/gcc/ada/s-oscons-tmplt.c b/gcc/ada/s-oscons-tmplt.c index 14a58aa..e3e5bc2 100644 --- a/gcc/ada/s-oscons-tmplt.c +++ b/gcc/ada/s-oscons-tmplt.c @@ -96,7 +96,7 @@ pragma Style_Checks ("M32766"); /* Define _BSD_SOURCE to get CRTSCTS */ # define _BSD_SOURCE -#endif /* defined (__linux__) */ +#endif /* defined (__linux__) || defined (__ANDROID__) */ /* Include gsocket.h before any system header so it can redefine FD_SETSIZE */ @@ -121,6 +121,8 @@ pragma Style_Checks ("M32766"); **/ # include <vxWorks.h> +#elif !defined(__MINGW32__) +#include <poll.h> #endif #include "adaint.h" @@ -1735,12 +1737,28 @@ CND(SIZEOF_sigset, "sigset") #endif #if defined(_WIN32) || defined(__vxworks) +#define SIZEOF_nfds_t sizeof (int) * 8 #define SIZEOF_socklen_t sizeof (size_t) #else +#define SIZEOF_nfds_t sizeof (nfds_t) * 8 #define SIZEOF_socklen_t sizeof (socklen_t) #endif +CND(SIZEOF_nfds_t, "Size of nfds_t"); CND(SIZEOF_socklen_t, "Size of socklen_t"); +{ +#if defined(__vxworks) +#define SIZEOF_fd_type sizeof (int) * 8 +#define SIZEOF_pollfd_events sizeof (short) * 8 +#else +const struct pollfd v_pollfd; +#define SIZEOF_fd_type sizeof (v_pollfd.fd) * 8 +#define SIZEOF_pollfd_events sizeof (v_pollfd.events) * 8 +#endif +CND(SIZEOF_fd_type, "Size of socket fd"); +CND(SIZEOF_pollfd_events, "Size of pollfd.events"); +} + #ifndef IF_NAMESIZE #ifdef IF_MAX_STRING_SIZE #define IF_NAMESIZE IF_MAX_STRING_SIZE @@ -1752,6 +1770,50 @@ CND(IF_NAMESIZE, "Max size of interface name with 0 terminator"); /* + -- Poll values + +*/ + +#if defined(__vxworks) +#ifndef POLLIN +#define POLLIN 1 +#endif + +#ifndef POLLPRI +#define POLLPRI 2 +#endif + +#ifndef POLLOUT +#define POLLOUT 4 +#endif + +#ifndef POLLERR +#define POLLERR 8 +#endif + +#ifndef POLLHUP +#define POLLHUP 16 +#endif + +#ifndef POLLNVAL +#define POLLNVAL 32 +#endif + +#elif defined(_WIN32) +#define POLLPRI 0 +/* If the POLLPRI flag is set on a socket for the Microsoft Winsock provider, + * the WSAPoll function will fail. */ +#endif + +CND(POLLIN, "There is data to read"); +CND(POLLPRI, "Urgent data to read"); +CND(POLLOUT, "Writing will not block"); +CND(POLLERR, "Error (output only)"); +CND(POLLHUP, "Hang up (output only)"); +CND(POLLNVAL, "Invalid request"); + +/* + -- Fields of struct msghdr */ @@ -1799,6 +1861,13 @@ CST(Inet_Pton_Linkname, "") #endif CST(Inet_Ntop_Linkname, "") +#if defined(_WIN32) +# define Poll_Linkname "WSAPoll" +#else +# define Poll_Linkname "poll" +#endif +CST(Poll_Linkname, "") + #endif /* HAVE_SOCKETS */ /* |