ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/EV/schmorp.h
(Generate patch)

Comparing EV/schmorp.h (file contents):
Revision 1.9 by root, Thu Jul 8 00:45:03 2010 UTC vs.
Revision 1.16 by root, Tue Nov 19 13:08:54 2019 UTC

1#ifndef SCHMORP_PERL_H_ 1#ifndef SCHMORP_PERL_H_
2#define SCHMORP_PERL_H_ 2#define SCHMORP_PERL_H_
3 3
4/* WARNING 4/* WARNING
5 * This header file is a shared resource between many modules. 5 * This header file is a shared resource between many modules.
6 * perl header files MUST already be included.
6 */ 7 */
7 8
8#include <signal.h> 9#include <signal.h>
9#include <errno.h> 10#include <errno.h>
10 11
49# ifndef IS_PADCONST 50# ifndef IS_PADCONST
50# define IS_PADCONST(v) 0 51# define IS_PADCONST(v) 0
51# endif 52# endif
52#endif 53#endif
53 54
55/* use NV for 32 bit perls as it allows larger offsets */
56#if IVSIZE >= 8
57typedef IV VAL64;
58# define SvVAL64(sv) SvIV (sv)
59# define newSVval64(i64) newSViv (i64)
60# define sv_setval64(sv,i64) sv_setiv ((sv), (i64))
61#else
62typedef NV VAL64;
63# define SvVAL64(sv) SvNV (sv)
64# define newSVval64(i64) newSVnv (i64)
65# define sv_setval64(sv,i64) sv_setnv ((sv), (i64))
66#endif
67
68/* typemap for the above */
69/*
70VAL64 T_VAL64
71
72INPUT
73
74T_VAL64
75 $var = ($type)SvVAL64 ($arg);
76
77OUTPUT
78
79T_VAL64
80 $arg = newSVval64 ($var);
81*/
82
54/* 5.11 */ 83/* 5.11 */
55#ifndef CxHASARGS 84#ifndef CxHASARGS
56# define CxHASARGS(cx) (cx)->blk_sub.hasargs 85# define CxHASARGS(cx) (cx)->blk_sub.hasargs
57#endif 86#endif
58 87
161s_get_cv (SV *cb_sv) 190s_get_cv (SV *cb_sv)
162{ 191{
163 dTHX; 192 dTHX;
164 HV *st; 193 HV *st;
165 GV *gvp; 194 GV *gvp;
166 195
167 return (SV *)sv_2cv (cb_sv, &st, &gvp, 0); 196 return (SV *)sv_2cv (cb_sv, &st, &gvp, 0);
168} 197}
169 198
170static SV * 199static SV *
171s_get_cv_croak (SV *cb_sv) 200s_get_cv_croak (SV *cb_sv)
205} 234}
206 235
207/*****************************************************************************/ 236/*****************************************************************************/
208/* portable pipe/socketpair */ 237/* portable pipe/socketpair */
209 238
210#ifdef USE_SOCKETS_AS_HANDLES 239#if defined(USE_SOCKETS_AS_HANDLES) || PERL_VERSION_ATLEAST(5,18,0)
211# define S_TO_HANDLE(x) ((HANDLE)win32_get_osfhandle (x)) 240# define S_TO_HANDLE(x) ((HANDLE)win32_get_osfhandle (x))
212#else 241#else
213# define S_TO_HANDLE(x) ((HANDLE)x) 242# define S_TO_HANDLE(x) ((HANDLE)x)
214#endif 243#endif
215 244
226 struct sockaddr_in adr2; 255 struct sockaddr_in adr2;
227 int adr2_size = sizeof (adr2); 256 int adr2_size = sizeof (adr2);
228 SOCKET listener; 257 SOCKET listener;
229 SOCKET sock [2] = { -1, -1 }; 258 SOCKET sock [2] = { -1, -1 };
230 259
231 if ((listener = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 260 if ((listener = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
232 return -1; 261 return -1;
233 262
234 addr.sin_family = AF_INET; 263 addr.sin_family = AF_INET;
235 addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); 264 addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
236 addr.sin_port = 0; 265 addr.sin_port = 0;
242 goto fail; 271 goto fail;
243 272
244 if (listen (listener, 1)) 273 if (listen (listener, 1))
245 goto fail; 274 goto fail;
246 275
247 if ((sock [0] = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 276 if ((sock [0] = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
248 goto fail; 277 goto fail;
249 278
250 if (connect (sock [0], (struct sockaddr *)&addr, addr_size)) 279 if (connect (sock [0], (struct sockaddr *)&addr, addr_size))
251 goto fail; 280 goto fail;
252 281
277 || addr.sin_port != adr2.sin_port) 306 || addr.sin_port != adr2.sin_port)
278 goto fail; 307 goto fail;
279 308
280 closesocket (listener); 309 closesocket (listener);
281 310
282#ifdef USE_SOCKETS_AS_HANDLES 311#if defined(USE_SOCKETS_AS_HANDLES) || PERL_VERSION_ATLEAST(5,18,0)
283 /* when select isn't winsocket, we also expect socket, connect, accept etc. 312 /* when select isn't winsocket, we also expect socket, connect, accept etc.
284 * to work on fds */ 313 * to work on fds */
285 filedes [0] = sock [0]; 314 filedes [0] = sock [0];
286 filedes [1] = sock [1]; 315 filedes [1] = sock [1];
287#else 316#else
330 || fcntl (fd, F_SETFD, FD_CLOEXEC); 359 || fcntl (fd, F_SETFD, FD_CLOEXEC);
331} 360}
332 361
333#endif 362#endif
334 363
364#if HAVE_EVENTFD
365# include <sys/eventfd.h>
366#else
335#if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)) 367# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))
336# define SCHMORP_H_HAVE_EVENTFD 1 368# define SCHMORP_H_HAVE_EVENTFD 1
337/* our minimum requirement is glibc 2.7 which has the stub, but not the header */ 369/* our minimum requirement is glibc 2.7 which has the stub, but not the header */
338# include <stdint.h> 370# include <stdint.h>
339# ifdef __cplusplus 371# ifdef __cplusplus
340extern "C" { 372extern "C" {
341# endif 373# endif
342 int eventfd (unsigned int initval, int flags); 374 int eventfd (unsigned int initval, int flags);
343# ifdef __cplusplus 375# ifdef __cplusplus
344} 376}
345# endif 377# endif
346#else 378# else
347# define eventfd(initval,flags) -1 379# define eventfd(initval,flags) -1
380# endif
348#endif 381#endif
349 382
350typedef struct { 383typedef struct {
351 int fd[2]; /* read, write fd, might be equal */ 384 int fd[2]; /* read, write fd, might be equal */
352 int len; /* write length (1 pipe/socket, 8 eventfd) */ 385 int len; /* write length (1 pipe/socket, 8 eventfd) */
409 * incompetent windows programmers - is this redundant? 442 * incompetent windows programmers - is this redundant?
410 */ 443 */
411 DWORD dummy; 444 DWORD dummy;
412 WriteFile (S_TO_HANDLE (epp->fd [1]), (LPCVOID)&dummy, 1, &dummy, 0); 445 WriteFile (S_TO_HANDLE (epp->fd [1]), (LPCVOID)&dummy, 1, &dummy, 0);
413#else 446#else
414# if SCHMORP_H_HAVE_EVENTFD
415 static uint64_t counter = 1; 447 static uint64_t counter = 1;
416# else
417 static char counter [8];
418# endif
419 /* some modules accept fd's from outside, support eventfd here */ 448 /* some modules accept fd's from outside, support eventfd here */
420 if (write (epp->fd [1], &counter, epp->len) < 0 449 if (write (epp->fd [1], &counter, epp->len) < 0
421 && errno == EINVAL 450 && errno == EINVAL
422 && epp->len != 8) 451 && epp->len != 8)
423 write (epp->fd [1], &counter, (epp->len = 8)); 452 write (epp->fd [1], &counter, (epp->len = 8));

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines