From 36718ee47b617f9eeb411c70d1dd87bc33389db3 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 6 Nov 2007 16:09:37 +0000 Subject: big win32 check-in --- ev.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 5 deletions(-) (limited to 'ev.c') diff --git a/ev.c b/ev.c index 0976897..79b3786 100644 --- a/ev.c +++ b/ev.c @@ -66,9 +66,7 @@ #include #include -#ifndef PERL -# include -#endif +#include #ifndef WIN32 # include @@ -156,6 +154,59 @@ static int have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */ /* 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 @@ loop_fork (EV_P) 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 @@ int ev_default_loop (int methods) { if (sigpipe [0] == sigpipe [1]) - if (pipe (sigpipe)) + if (ev_pipe (sigpipe)) return 0; if (!default_loop) -- cgit v1.2.3