--- IO-AIO/schmorp.h 2009/07/18 05:58:39 1.7 +++ IO-AIO/schmorp.h 2018/02/20 06:05:19 1.18 @@ -3,12 +3,17 @@ /* WARNING * This header file is a shared resource between many modules. + * perl header files MUST already be included. */ #include #include -#ifndef _WIN32 +#if defined(WIN32 ) || defined(_MINIX) +# define SCHMORP_H_PREFER_SELECT 1 +#endif + +#if !SCHMORP_H_PREFER_SELECT # include #endif @@ -22,6 +27,10 @@ && (PERL_VERSION > (b) \ || (PERL_VERSION == (b) && PERL_SUBVERSION >= (c))))) +#ifndef PERL_MAGIC_ext +# define PERL_MAGIC_ext '~' +#endif + #if !PERL_VERSION_ATLEAST (5,6,0) # ifndef PL_ppaddr # define PL_ppaddr ppaddr @@ -43,6 +52,32 @@ # endif #endif +/* use NV for 32 bit perls as it allows larger offsets */ +#if IVSIZE >= 8 +typedef IV VAL64; +# define SvVAL64(sv) SvIV (sv) +# define newSVval64(i64) newSViv (i64) +#else +typedef NV VAL64; +# define SvVAL64(sv) SvNV (sv) +# define newSVval64(i64) newSVnv (i64) +#endif + +/* typemap for the above */ +/* +VAL64 T_VAL64 + +INPUT + +T_VAL64 + $var = ($type)SvVAL64 ($arg); + +OUTPUT + +T_VAL64 + $arg = newSVval64 ($var); +*/ + /* 5.11 */ #ifndef CxHASARGS # define CxHASARGS(cx) (cx)->blk_sub.hasargs @@ -155,7 +190,7 @@ dTHX; HV *st; GV *gvp; - + return (SV *)sv_2cv (cb_sv, &st, &gvp, 0); } @@ -199,7 +234,7 @@ /*****************************************************************************/ /* portable pipe/socketpair */ -#ifdef USE_SOCKETS_AS_HANDLES +#if defined(USE_SOCKETS_AS_HANDLES) || PERL_VERSION_ATLEAST(5,18,0) # define S_TO_HANDLE(x) ((HANDLE)win32_get_osfhandle (x)) #else # define S_TO_HANDLE(x) ((HANDLE)x) @@ -220,7 +255,7 @@ SOCKET listener; SOCKET sock [2] = { -1, -1 }; - if ((listener = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) + if ((listener = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) return -1; addr.sin_family = AF_INET; @@ -236,7 +271,7 @@ if (listen (listener, 1)) goto fail; - if ((sock [0] = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) + if ((sock [0] = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) goto fail; if (connect (sock [0], (struct sockaddr *)&addr, addr_size)) @@ -271,7 +306,7 @@ closesocket (listener); -#ifdef USE_SOCKETS_AS_HANDLES +#if defined(USE_SOCKETS_AS_HANDLES) || PERL_VERSION_ATLEAST(5,18,0) /* when select isn't winsocket, we also expect socket, connect, accept etc. * to work on fds */ filedes [0] = sock [0]; @@ -324,18 +359,23 @@ #endif -#if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)) +#if HAVE_EVENTFD +# include +#else +# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)) +# define SCHMORP_H_HAVE_EVENTFD 1 /* our minimum requirement is glibc 2.7 which has the stub, but not the header */ -# include -# ifdef __cplusplus +# include +# ifdef __cplusplus extern "C" { -# endif +# endif int eventfd (unsigned int initval, int flags); -# ifdef __cplusplus +# ifdef __cplusplus } +# endif +# else +# define eventfd(initval,flags) -1 # endif -#else -# define eventfd(initval,flags) -1 #endif typedef struct { @@ -402,7 +442,11 @@ DWORD dummy; WriteFile (S_TO_HANDLE (epp->fd [1]), (LPCVOID)&dummy, 1, &dummy, 0); #else +# if SCHMORP_H_HAVE_EVENTFD static uint64_t counter = 1; +# else + static char counter [8]; +# endif /* some modules accept fd's from outside, support eventfd here */ if (write (epp->fd [1], &counter, epp->len) < 0 && errno == EINVAL @@ -442,8 +486,10 @@ if (dup2 (epn.fd [0], epp->fd [0]) < 0) croak ("unable to dup over old event pipe"); /* should not croak */ - if (epp->fd [1] != epp->fd [0]) - close (epn.fd [0]); + close (epn.fd [0]); + + if (epn.fd [0] == epn.fd [1]) + epn.fd [1] = epp->fd [0]; epn.fd [0] = epp->fd [0]; } @@ -459,7 +505,7 @@ s_epipe_wait (s_epipe *epp) { dTHX; -#ifdef _WIN32 +#if SCHMORP_H_PREFER_SELECT fd_set rfd; int fd = s_epipe_fd (epp); @@ -474,7 +520,7 @@ pfd.fd = s_epipe_fd (epp); pfd.events = POLLIN; - return poll (&pfd, 1, 0); + return poll (&pfd, 1, -1); #endif }