Browse Source

mingw: use poll-emulation from gnulib

Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Erik Faye-Lund 14 years ago committed by Junio C Hamano
parent
commit
fdc1211463
  1. 6
      Makefile
  2. 65
      compat/mingw.c
  3. 11
      compat/mingw.h
  4. 3
      compat/win32/sys/poll.c
  5. 2
      git-compat-util.h

6
Makefile

@ -497,6 +497,7 @@ LIB_H += compat/cygwin.h @@ -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) @@ -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))) @@ -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

65
compat/mingw.c

@ -408,71 +408,6 @@ int pipe(int filedes[2]) @@ -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 */

11
compat/mingw.h

@ -59,16 +59,6 @@ struct passwd { @@ -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]); @@ -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 */

3
compat/win32/sys/poll.c

@ -24,8 +24,7 @@ @@ -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"

2
git-compat-util.h

@ -105,9 +105,9 @@ @@ -105,9 +105,9 @@
#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>

Loading…
Cancel
Save