mingw: use poll-emulation from gnulib
Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
49521af8a8
commit
fdc1211463
6
Makefile
6
Makefile
@ -497,6 +497,7 @@ LIB_H += compat/cygwin.h
|
|||||||
LIB_H += compat/mingw.h
|
LIB_H += compat/mingw.h
|
||||||
LIB_H += compat/win32/pthread.h
|
LIB_H += compat/win32/pthread.h
|
||||||
LIB_H += compat/win32/syslog.h
|
LIB_H += compat/win32/syslog.h
|
||||||
|
LIB_H += compat/win32/sys/poll.h
|
||||||
LIB_H += csum-file.h
|
LIB_H += csum-file.h
|
||||||
LIB_H += decorate.h
|
LIB_H += decorate.h
|
||||||
LIB_H += delta.h
|
LIB_H += delta.h
|
||||||
@ -1082,7 +1083,7 @@ ifeq ($(uname_S),Windows)
|
|||||||
AR = compat/vcbuild/scripts/lib.pl
|
AR = compat/vcbuild/scripts/lib.pl
|
||||||
CFLAGS =
|
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
|
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\"
|
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
|
BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib
|
||||||
EXTLIBS = advapi32.lib shell32.lib wininet.lib ws2_32.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 += -D__USE_MINGW_ACCESS -DNOGDI -Icompat -Icompat/fnmatch -Icompat/win32
|
||||||
COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
|
COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
|
||||||
COMPAT_OBJS += compat/mingw.o compat/fnmatch/fnmatch.o compat/winansi.o \
|
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
|
EXTLIBS += -lws2_32
|
||||||
PTHREAD_LIBS =
|
PTHREAD_LIBS =
|
||||||
X = .exe
|
X = .exe
|
||||||
|
@ -408,71 +408,6 @@ int pipe(int filedes[2])
|
|||||||
return 0;
|
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)
|
struct tm *gmtime_r(const time_t *timep, struct tm *result)
|
||||||
{
|
{
|
||||||
/* gmtime() in MSVCRT.DLL is thread-safe, but not reentrant */
|
/* gmtime() in MSVCRT.DLL is thread-safe, but not reentrant */
|
||||||
|
@ -59,16 +59,6 @@ struct passwd {
|
|||||||
|
|
||||||
extern char *getpass(const char *prompt);
|
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);
|
typedef void (__cdecl *sig_handler_t)(int);
|
||||||
struct sigaction {
|
struct sigaction {
|
||||||
sig_handler_t sa_handler;
|
sig_handler_t sa_handler;
|
||||||
@ -175,7 +165,6 @@ int pipe(int filedes[2]);
|
|||||||
unsigned int sleep (unsigned int seconds);
|
unsigned int sleep (unsigned int seconds);
|
||||||
int mkstemp(char *template);
|
int mkstemp(char *template);
|
||||||
int gettimeofday(struct timeval *tv, void *tz);
|
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 *gmtime_r(const time_t *timep, struct tm *result);
|
||||||
struct tm *localtime_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 */
|
int getpagesize(void); /* defined in MinGW's libgcc.a */
|
||||||
|
@ -24,8 +24,7 @@
|
|||||||
# pragma GCC diagnostic ignored "-Wtype-limits"
|
# pragma GCC diagnostic ignored "-Wtype-limits"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <config.h>
|
#include <malloc.h>
|
||||||
#include <alloca.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include "poll.h"
|
#include "poll.h"
|
||||||
|
@ -105,9 +105,9 @@
|
|||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
|
#include <sys/poll.h>
|
||||||
#ifndef __MINGW32__
|
#ifndef __MINGW32__
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <sys/poll.h>
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
|
Loading…
Reference in New Issue
Block a user