svn commit: r259430 - head/lib/libnv
Pawel Jakub Dawidek
pjd at FreeBSD.org
Sun Dec 15 22:58:10 UTC 2013
Author: pjd
Date: Sun Dec 15 22:58:09 2013
New Revision: 259430
URL: http://svnweb.freebsd.org/changeset/base/259430
Log:
MFp4 @1189139:
Get rid of the msg_peek() function, which has a problem. If there was less
data in the socket buffer than requested by the caller, the function would busy
loop, as select(2) will always return immediately.
We can just receive nvlhdr now, because some time ago we splitted receive of
data from the receive of descriptors.
MFC after: 1 week
Modified:
head/lib/libnv/msgio.c
head/lib/libnv/msgio.h
head/lib/libnv/nvlist.c
Modified: head/lib/libnv/msgio.c
==============================================================================
--- head/lib/libnv/msgio.c Sun Dec 15 22:52:18 2013 (r259429)
+++ head/lib/libnv/msgio.c Sun Dec 15 22:58:09 2013 (r259430)
@@ -113,30 +113,6 @@ fd_wait(int fd, bool doread)
NULL, NULL);
}
-int
-msg_peek(int sock, void *buf, size_t size)
-{
- ssize_t done;
-
- PJDLOG_ASSERT(sock >= 0);
- PJDLOG_ASSERT(size > 0);
-
- do {
- fd_wait(sock, true);
- done = recv(sock, buf, size, MSG_PEEK | MSG_WAITALL);
- if (done == -1) {
- if (errno == EAGAIN || errno == EINTR)
- continue;
- return (-1);
- } else if (done == 0) {
- errno = ENOTCONN;
- return (-1);
- }
- } while (done != (ssize_t)size);
-
- return (0);
-}
-
static int
msg_recv(int sock, struct msghdr *msg)
{
Modified: head/lib/libnv/msgio.h
==============================================================================
--- head/lib/libnv/msgio.h Sun Dec 15 22:52:18 2013 (r259429)
+++ head/lib/libnv/msgio.h Sun Dec 15 22:58:09 2013 (r259430)
@@ -38,8 +38,6 @@ struct cmsgcred;
struct iovec;
struct msghdr;
-int msg_peek(int sock, void *buf, size_t size);
-
int cred_send(int sock);
int cred_recv(int sock, struct cmsgcred *cred);
Modified: head/lib/libnv/nvlist.c
==============================================================================
--- head/lib/libnv/nvlist.c Sun Dec 15 22:52:18 2013 (r259429)
+++ head/lib/libnv/nvlist.c Sun Dec 15 22:58:09 2013 (r259430)
@@ -724,11 +724,11 @@ nvlist_recv(int sock)
{
struct nvlist_header nvlhdr;
nvlist_t *nvl, *ret;
+ unsigned char *buf;
size_t nfds, size;
- void *buf;
int serrno, *fds;
- if (msg_peek(sock, &nvlhdr, sizeof(nvlhdr)) == -1)
+ if (buf_recv(sock, &nvlhdr, sizeof(nvlhdr)) == -1)
return (NULL);
if (!nvlist_check_header(&nvlhdr))
@@ -741,10 +741,12 @@ nvlist_recv(int sock)
if (buf == NULL)
return (NULL);
+ memcpy(buf, &nvlhdr, sizeof(nvlhdr));
+
ret = NULL;
fds = NULL;
- if (buf_recv(sock, buf, size) == -1)
+ if (buf_recv(sock, buf + sizeof(nvlhdr), size - sizeof(nvlhdr)) == -1)
goto out;
if (nfds > 0) {
More information about the svn-src-all
mailing list