with the interdiff below: diff --git a/git-compat-util.h b/git-compat-util.h index 87456a3..8e39867 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -723,7 +723,6 @@ extern void *xmmap(void *start, size_t length, int prot, int flags, int fd, off_ extern void *xmmap_gently(void *start, size_t length, int prot, int flags, int fd, off_t offset); extern int xopen(const char *path, int flags, ...); extern ssize_t xread(int fd, void *buf, size_t len); -extern ssize_t xread_nonblock(int fd, void *buf, size_t len); extern ssize_t xwrite(int fd, const void *buf, size_t len); extern ssize_t xpread(int fd, void *buf, size_t len, off_t offset); extern int xdup(int fd); diff --git a/strbuf.c b/strbuf.c index b552a13..38686ff 100644 --- a/strbuf.c +++ b/strbuf.c @@ -389,7 +389,7 @@ ssize_t strbuf_read_once(struct strbuf *sb, int fd, size_t hint) ssize_t cnt; strbuf_grow(sb, hint ? hint : 8192); - cnt = xread_nonblock(fd, sb->buf + sb->len, sb->alloc - sb->len - 1); + cnt = xread(fd, sb->buf + sb->len, sb->alloc - sb->len - 1); if (cnt > 0) strbuf_setlen(sb, sb->len + cnt); return cnt; diff --git a/strbuf.h b/strbuf.h index c3e5980..2bf90e7 100644 --- a/strbuf.h +++ b/strbuf.h @@ -367,10 +367,10 @@ extern size_t strbuf_fread(struct strbuf *, size_t, FILE *); extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint); /** - * Returns the number of new bytes appended to the sb. - * Negative return value signals there was an error returned from - * underlying read(2), in which case the caller should check errno. - * e.g. errno == EAGAIN when the read may have blocked. + * Read the contents of a given file descriptor partially by using only one + * attempt of xread. The third argument can be used to give a hint about the + * file size, to avoid reallocs. Returns the number of new bytes appended to + * the sb. */ extern ssize_t strbuf_read_once(struct strbuf *, int fd, size_t hint); diff --git a/wrapper.c b/wrapper.c index f71237c..1770efa 100644 --- a/wrapper.c +++ b/wrapper.c @@ -243,7 +243,14 @@ ssize_t xread(int fd, void *buf, size_t len) struct pollfd pfd; pfd.events = POLLIN; pfd.fd = fd; - /* We deliberately ignore the return value */ + /* + * it is OK if this poll() failed; we + * want to leave this infinite loop + * only when read() returns with + * success, or an expected failure, + * which would be checked by the next + * call to read(2). + */ poll(&pfd, 1, -1); } } @@ -252,28 +259,6 @@ ssize_t xread(int fd, void *buf, size_t len) } /* - * xread_nonblock() is the same a read(), but it automatically restarts read() - * interrupted operations (EINTR). xread_nonblock() DOES NOT GUARANTEE that - * "len" bytes is read. EWOULDBLOCK is turned into EAGAIN. - */ -ssize_t xread_nonblock(int fd, void *buf, size_t len) -{ - ssize_t nr; - if (len > MAX_IO_SIZE) - len = MAX_IO_SIZE; - while (1) { - nr = read(fd, buf, len); - if (nr < 0) { - if (errno == EINTR) - continue; - if (errno == EWOULDBLOCK) - errno = EAGAIN; - } - return nr; - } -} - -/* * xwrite() is the same a write(), but it automatically restarts write() * operations with a recoverable error (EAGAIN and EINTR). xwrite() DOES NOT * GUARANTEE that "len" bytes is written even if the operation is successful. -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html