aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/s-oscons-tmplt.c
diff options
context:
space:
mode:
authorDmitriy Anisimkov <anisimko@adacore.com>2020-08-08 18:49:27 +0600
committerPierre-Marie de Rodat <derodat@adacore.com>2020-10-23 04:25:07 -0400
commitd08d481912b9a2dc3388f8e1183cea0bf3ffae9f (patch)
tree22e513c76801fa433fcc0445892f3b47d4c7a0bf /gcc/ada/s-oscons-tmplt.c
parent66e97274cef35ed40584c7a09096fffa061fddf0 (diff)
downloadgcc-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.c71
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 */
/*