in nailgun-server/src/main/java/com/facebook/nailgun/NGWin32NamedPipeSocket.java [114:146]
public int read(byte[] b, int off, int len) throws IOException {
Memory readBuffer = new Memory(len);
WinBase.OVERLAPPED olap = new WinBase.OVERLAPPED();
olap.hEvent = readerWaitable;
olap.write();
boolean immediate = API.ReadFile(handle, readBuffer, len, null, olap.getPointer());
if (!immediate) {
int lastError = API.GetLastError();
if (lastError != WinError.ERROR_IO_PENDING) {
throw new IOException("ReadFile() failed: " + lastError);
}
}
IntByReference r = new IntByReference();
if (!API.GetOverlappedResult(handle, olap.getPointer(), r, true)) {
int lastError = API.GetLastError();
throw new IOException("GetOverlappedResult() failed for read operation: " + lastError);
}
int actualLen = r.getValue();
if (requireStrictLength && (actualLen != len)) {
throw new IOException(
"ReadFile() read less bytes than requested: expected "
+ len
+ " bytes, but read "
+ actualLen
+ " bytes");
}
byte[] byteArray = readBuffer.getByteArray(0, actualLen);
System.arraycopy(byteArray, 0, b, off, actualLen);
return actualLen;
}