hoist out handle_nonblock function for xread and xwrite
At least for me, this improves the readability of xread and xwrite; hopefully allowing missing "continue" statements to be spotted more easily. Signed-off-by: Eric Wong <e@80x24.org> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
ef1cf0167a
commit
d751dd11ae
48
wrapper.c
48
wrapper.c
@ -224,6 +224,24 @@ int xopen(const char *path, int oflag, ...)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int handle_nonblock(int fd, short poll_events, int err)
|
||||||
|
{
|
||||||
|
struct pollfd pfd;
|
||||||
|
|
||||||
|
if (err != EAGAIN && err != EWOULDBLOCK)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
pfd.fd = fd;
|
||||||
|
pfd.events = poll_events;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* no need to check for errors, here;
|
||||||
|
* a subsequent read/write will detect unrecoverable errors
|
||||||
|
*/
|
||||||
|
poll(&pfd, 1, -1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* xread() is the same a read(), but it automatically restarts read()
|
* xread() is the same a read(), but it automatically restarts read()
|
||||||
* operations with a recoverable error (EAGAIN and EINTR). xread()
|
* operations with a recoverable error (EAGAIN and EINTR). xread()
|
||||||
@ -239,21 +257,8 @@ ssize_t xread(int fd, void *buf, size_t len)
|
|||||||
if (nr < 0) {
|
if (nr < 0) {
|
||||||
if (errno == EINTR)
|
if (errno == EINTR)
|
||||||
continue;
|
continue;
|
||||||
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
if (handle_nonblock(fd, POLLIN, errno))
|
||||||
struct pollfd pfd;
|
|
||||||
pfd.events = POLLIN;
|
|
||||||
pfd.fd = fd;
|
|
||||||
/*
|
|
||||||
* 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);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nr;
|
return nr;
|
||||||
}
|
}
|
||||||
@ -274,21 +279,8 @@ ssize_t xwrite(int fd, const void *buf, size_t len)
|
|||||||
if (nr < 0) {
|
if (nr < 0) {
|
||||||
if (errno == EINTR)
|
if (errno == EINTR)
|
||||||
continue;
|
continue;
|
||||||
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
if (handle_nonblock(fd, POLLOUT, errno))
|
||||||
struct pollfd pfd;
|
|
||||||
pfd.events = POLLOUT;
|
|
||||||
pfd.fd = fd;
|
|
||||||
/*
|
|
||||||
* it is OK if this poll() failed; we
|
|
||||||
* want to leave this infinite loop
|
|
||||||
* only when write() returns with
|
|
||||||
* success, or an expected failure,
|
|
||||||
* which would be checked by the next
|
|
||||||
* call to write(2).
|
|
||||||
*/
|
|
||||||
poll(&pfd, 1, -1);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nr;
|
return nr;
|
||||||
|
Reference in New Issue
Block a user