--- libev/ev.c 2007/11/06 13:17:55 1.71 +++ libev/ev.c 2007/11/06 16:09:37 1.72 @@ -66,9 +66,7 @@ #include #include -#ifndef PERL -# include -#endif +#include #ifndef WIN32 # include @@ -156,6 +154,59 @@ /* note: the comment below could not be substantiated, but what would I care */ /* MSDN says this is required to handle SIGFPE */ volatile double SIGFPE_REQ = 0.0f; + +static int +ev_socketpair_tcp (int filedes [2]) +{ + struct sockaddr_in addr = { 0 }; + int addr_size = sizeof (addr); + SOCKET listener; + SOCKET sock [2] = { -1, -1 }; + + if ((listener = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) + return -1; + + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); + addr.sin_port = 0; + + if (bind (listener, (struct sockaddr *)&addr, addr_size)) + goto fail; + + if (getsockname(listener, (struct sockaddr *)&addr, &addr_size)) + goto fail; + + if (listen (listener, 1)) + goto fail; + + if ((sock [0] = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) + goto fail; + + if (connect (sock[0], (struct sockaddr *)&addr, addr_size)) + goto fail; + + if ((sock[1] = accept (listener, 0, 0)) < 0) + goto fail; + + closesocket (listener); + + filedes [0] = sock [0]; + filedes [1] = sock [1]; + + return 0; + +fail: + closesocket (listener); + + if (sock [0] != INVALID_SOCKET) closesocket (sock [0]); + if (sock [1] != INVALID_SOCKET) closesocket (sock [1]); + + return -1; +} + +# define ev_pipe(filedes) ev_socketpair_tcp (filedes) +#else +# define ev_pipe(filedes) pipe (filedes) #endif /*****************************************************************************/ @@ -779,7 +830,7 @@ close (sigpipe [0]); close (sigpipe [1]); - while (pipe (sigpipe)) + while (ev_pipe (sigpipe)) syserr ("(libev) error creating pipe"); siginit (EV_A); @@ -832,7 +883,7 @@ ev_default_loop (int methods) { if (sigpipe [0] == sigpipe [1]) - if (pipe (sigpipe)) + if (ev_pipe (sigpipe)) return 0; if (!default_loop)