Commit edf661e6 authored by Christopher Dykes's avatar Christopher Dykes Committed by Facebook Github Bot

Don't attempt to lock the file descriptor in readv/writev if it's a socket

Summary:
There is no way to lock a socket on Windows, so these calls will always fail. Just don't do the lock on Windows.
To do it properly with sockets, this should probably be forwarding to `sendmsg`/`recvmsg`, but this is good enough for now.

Reviewed By: simpkins

Differential Revision: D5307901

fbshipit-source-id: 9855274e932a3e2ec3cacae10363200187e0c01b
parent a4b80604
...@@ -70,11 +70,18 @@ static ssize_t doVecOperation(int fd, const iovec* iov, int count) { ...@@ -70,11 +70,18 @@ static ssize_t doVecOperation(int fd, const iovec* iov, int count) {
return -1; return -1;
} }
if (lockf(fd, F_LOCK, 0) == -1) { // We only need to worry about locking if the file descriptor is
// not a socket. We have no way of locking sockets :(
// The correct way to do this for sockets is via sendmsg/recvmsg,
// but this is good enough for now.
bool shouldLock = !folly::portability::sockets::is_fh_socket(fd);
if (shouldLock && lockf(fd, F_LOCK, 0) == -1) {
return -1; return -1;
} }
SCOPE_EXIT { SCOPE_EXIT {
lockf(fd, F_ULOCK, 0); if (shouldLock) {
lockf(fd, F_ULOCK, 0);
}
}; };
ssize_t bytesProcessed = 0; ssize_t bytesProcessed = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment