зеркало из https://github.com/microsoft/git.git
Replacing the system call pread() with lseek()/xread()/lseek() sequence.
Using cygwin with cygwin.dll before 1.5.22 the system call pread() is buggy. This patch introduces NO_PREAD. If NO_PREAD is set git uses a sequence of lseek()/xread()/lseek() to emulate pread. Signed-off-by: Stefan-W. Hahn <stefan.hahn@s-hahn.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
0bdb28c9cc
Коммит
6900679c2f
7
Makefile
7
Makefile
|
@ -69,6 +69,9 @@ all:
|
||||||
#
|
#
|
||||||
# Define NO_MMAP if you want to avoid mmap.
|
# Define NO_MMAP if you want to avoid mmap.
|
||||||
#
|
#
|
||||||
|
# Define NO_PREAD if you have a problem with pread() system call (e.g.
|
||||||
|
# cygwin.dll before v1.5.22).
|
||||||
|
#
|
||||||
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
|
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
|
||||||
# generally faster on your platform than accessing the working directory.
|
# generally faster on your platform than accessing the working directory.
|
||||||
#
|
#
|
||||||
|
@ -523,6 +526,10 @@ ifdef NO_MMAP
|
||||||
COMPAT_CFLAGS += -DNO_MMAP
|
COMPAT_CFLAGS += -DNO_MMAP
|
||||||
COMPAT_OBJS += compat/mmap.o
|
COMPAT_OBJS += compat/mmap.o
|
||||||
endif
|
endif
|
||||||
|
ifdef NO_PREAD
|
||||||
|
COMPAT_CFLAGS += -DNO_PREAD
|
||||||
|
COMPAT_OBJS += compat/pread.o
|
||||||
|
endif
|
||||||
ifdef NO_FAST_WORKING_DIRECTORY
|
ifdef NO_FAST_WORKING_DIRECTORY
|
||||||
BASIC_CFLAGS += -DNO_FAST_WORKING_DIRECTORY
|
BASIC_CFLAGS += -DNO_FAST_WORKING_DIRECTORY
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
#include "../git-compat-util.h"
|
||||||
|
|
||||||
|
ssize_t git_pread(int fd, void *buf, size_t count, off_t offset)
|
||||||
|
{
|
||||||
|
off_t current_offset;
|
||||||
|
ssize_t rc;
|
||||||
|
|
||||||
|
current_offset = lseek(fd, 0, SEEK_CUR);
|
||||||
|
|
||||||
|
if (lseek(fd, offset, SEEK_SET) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
rc = read_in_full(fd, buf, count);
|
||||||
|
|
||||||
|
if (current_offset != lseek(fd, current_offset, SEEK_SET))
|
||||||
|
return -1;
|
||||||
|
return rc;
|
||||||
|
}
|
|
@ -107,6 +107,11 @@ extern int git_munmap(void *start, size_t length);
|
||||||
#define DEFAULT_PACKED_GIT_LIMIT \
|
#define DEFAULT_PACKED_GIT_LIMIT \
|
||||||
((1024L * 1024L) * (sizeof(void*) >= 8 ? 8192 : 256))
|
((1024L * 1024L) * (sizeof(void*) >= 8 ? 8192 : 256))
|
||||||
|
|
||||||
|
#ifdef NO_PREAD
|
||||||
|
#define pread git_pread
|
||||||
|
extern ssize_t git_pread(int fd, void *buf, size_t count, off_t offset);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef NO_SETENV
|
#ifdef NO_SETENV
|
||||||
#define setenv gitsetenv
|
#define setenv gitsetenv
|
||||||
extern int gitsetenv(const char *, const char *, int);
|
extern int gitsetenv(const char *, const char *, int);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче