Code

mingw: use poll-emulation from gnulib
authorErik Faye-Lund <kusmabite@gmail.com>
Thu, 4 Nov 2010 01:35:21 +0000 (02:35 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 4 Nov 2010 23:53:51 +0000 (16:53 -0700)
Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Makefile
compat/mingw.c
compat/mingw.h
compat/win32/sys/poll.c
git-compat-util.h

index 2aa067aaf491986bb5ee8dece92796e41bbf4f34..46034bfc47c99157acffaaa8fa86a56441a7ff8a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -497,6 +497,7 @@ LIB_H += compat/cygwin.h
 LIB_H += compat/mingw.h
 LIB_H += compat/win32/pthread.h
 LIB_H += compat/win32/syslog.h
+LIB_H += compat/win32/sys/poll.h
 LIB_H += csum-file.h
 LIB_H += decorate.h
 LIB_H += delta.h
@@ -1082,7 +1083,7 @@ ifeq ($(uname_S),Windows)
        AR = compat/vcbuild/scripts/lib.pl
        CFLAGS =
        BASIC_CFLAGS = -nologo -I. -I../zlib -Icompat/vcbuild -Icompat/vcbuild/include -DWIN32 -D_CONSOLE -DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE
-       COMPAT_OBJS = compat/msvc.o compat/fnmatch/fnmatch.o compat/winansi.o compat/win32/pthread.o compat/win32/syslog.o
+       COMPAT_OBJS = compat/msvc.o compat/fnmatch/fnmatch.o compat/winansi.o compat/win32/pthread.o compat/win32/syslog.o compat/win32/sys/poll.o
        COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -DHAVE_ALLOCA_H -Icompat -Icompat/fnmatch -Icompat/regex -Icompat/fnmatch -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
        BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib
        EXTLIBS = advapi32.lib shell32.lib wininet.lib ws2_32.lib
@@ -1132,7 +1133,8 @@ ifneq (,$(findstring MINGW,$(uname_S)))
        COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat -Icompat/fnmatch -Icompat/win32
        COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
        COMPAT_OBJS += compat/mingw.o compat/fnmatch/fnmatch.o compat/winansi.o \
-               compat/win32/pthread.o compat/win32/syslog.o
+               compat/win32/pthread.o compat/win32/syslog.o \
+               compat/win32/sys/poll.o
        EXTLIBS += -lws2_32
        PTHREAD_LIBS =
        X = .exe
index a6c1ee702a54fdbcaab7af031a4e7a3e7ea2c1ce..29f403649f0e3c6d4240fc93e6fa1787a017b9ea 100644 (file)
@@ -408,71 +408,6 @@ int pipe(int filedes[2])
        return 0;
 }
 
-int poll(struct pollfd *ufds, unsigned int nfds, int timeout)
-{
-       int i, pending;
-
-       if (timeout >= 0) {
-               if (nfds == 0) {
-                       Sleep(timeout);
-                       return 0;
-               }
-               return errno = EINVAL, error("poll timeout not supported");
-       }
-
-       /* When there is only one fd to wait for, then we pretend that
-        * input is available and let the actual wait happen when the
-        * caller invokes read().
-        */
-       if (nfds == 1) {
-               if (!(ufds[0].events & POLLIN))
-                       return errno = EINVAL, error("POLLIN not set");
-               ufds[0].revents = POLLIN;
-               return 0;
-       }
-
-repeat:
-       pending = 0;
-       for (i = 0; i < nfds; i++) {
-               DWORD avail = 0;
-               HANDLE h = (HANDLE) _get_osfhandle(ufds[i].fd);
-               if (h == INVALID_HANDLE_VALUE)
-                       return -1;      /* errno was set */
-
-               if (!(ufds[i].events & POLLIN))
-                       return errno = EINVAL, error("POLLIN not set");
-
-               /* this emulation works only for pipes */
-               if (!PeekNamedPipe(h, NULL, 0, NULL, &avail, NULL)) {
-                       int err = GetLastError();
-                       if (err == ERROR_BROKEN_PIPE) {
-                               ufds[i].revents = POLLHUP;
-                               pending++;
-                       } else {
-                               errno = EINVAL;
-                               return error("PeekNamedPipe failed,"
-                                       " GetLastError: %u", err);
-                       }
-               } else if (avail) {
-                       ufds[i].revents = POLLIN;
-                       pending++;
-               } else
-                       ufds[i].revents = 0;
-       }
-       if (!pending) {
-               /* The only times that we spin here is when the process
-                * that is connected through the pipes is waiting for
-                * its own input data to become available. But since
-                * the process (pack-objects) is itself CPU intensive,
-                * it will happily pick up the time slice that we are
-                * relinquishing here.
-                */
-               Sleep(0);
-               goto repeat;
-       }
-       return 0;
-}
-
 struct tm *gmtime_r(const time_t *timep, struct tm *result)
 {
        /* gmtime() in MSVCRT.DLL is thread-safe, but not reentrant */
index 51fca2f84581c55a16b19d8b37b55aba204d9088..99a746703f3c9fb19e043109e4a044efe151e0e7 100644 (file)
@@ -59,16 +59,6 @@ struct passwd {
 
 extern char *getpass(const char *prompt);
 
-#ifndef POLLIN
-struct pollfd {
-       int fd;           /* file descriptor */
-       short events;     /* requested events */
-       short revents;    /* returned events */
-};
-#define POLLIN 1
-#define POLLHUP 2
-#endif
-
 typedef void (__cdecl *sig_handler_t)(int);
 struct sigaction {
        sig_handler_t sa_handler;
@@ -175,7 +165,6 @@ int pipe(int filedes[2]);
 unsigned int sleep (unsigned int seconds);
 int mkstemp(char *template);
 int gettimeofday(struct timeval *tv, void *tz);
-int poll(struct pollfd *ufds, unsigned int nfds, int timeout);
 struct tm *gmtime_r(const time_t *timep, struct tm *result);
 struct tm *localtime_r(const time_t *timep, struct tm *result);
 int getpagesize(void); /* defined in MinGW's libgcc.a */
index 092d05e6bd617a7b27afb777783f892ba78cfefd..7e74ebe59a5ea2e31a9100659805ada0f5d8e278 100644 (file)
@@ -24,8 +24,7 @@
 # pragma GCC diagnostic ignored "-Wtype-limits"
 #endif
 
-#include <config.h>
-#include <alloca.h>
+#include <malloc.h>
 
 #include <sys/types.h>
 #include "poll.h"
index 56dce8588472e8535c1482ed21818f413abb4dbf..d0a1e480b6445a6f5ba3680672c255ab44ca43f0 100644 (file)
 #include <regex.h>
 #include <utime.h>
 #include <syslog.h>
+#include <sys/poll.h>
 #ifndef __MINGW32__
 #include <sys/wait.h>
-#include <sys/poll.h>
 #include <sys/socket.h>
 #include <sys/ioctl.h>
 #include <termios.h>