зеркало из https://github.com/microsoft/git.git
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:
Родитель
49521af8a8
Коммит
fdc1211463
6
Makefile
6
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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
||||
|
|
Загрузка…
Ссылка в новой задаче