Commit e0587d4a authored by Martin Wilck's avatar Martin Wilck Committed by Alexandre Julliard

GetOverlappedResult: Return ERROR_IO_INCOMPLETE if IO still pending.

ReadFile / WriteFile: Use GetOverlappedResult() to check for immediate completion.
parent 874d671e
...@@ -1410,7 +1410,8 @@ BOOL WINAPI GetOverlappedResult( ...@@ -1410,7 +1410,8 @@ BOOL WINAPI GetOverlappedResult(
if(lpTransferred) if(lpTransferred)
*lpTransferred = lpOverlapped->InternalHigh; *lpTransferred = lpOverlapped->InternalHigh;
SetLastError(lpOverlapped->Internal); SetLastError ( lpOverlapped->Internal == STATUS_PENDING ?
ERROR_IO_INCOMPLETE : lpOverlapped->Internal );
return (r==WAIT_OBJECT_0); return (r==WAIT_OBJECT_0);
} }
...@@ -1598,41 +1599,21 @@ BOOL WINAPI ReadFile( HANDLE hFile, LPVOID buffer, DWORD bytesToRead, ...@@ -1598,41 +1599,21 @@ BOOL WINAPI ReadFile( HANDLE hFile, LPVOID buffer, DWORD bytesToRead,
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
return FALSE; return FALSE;
} }
/* see if we can read some data already (this shouldn't block) */
result = pread( unix_handle, buffer, bytesToRead, OVERLAPPED_OFFSET(overlapped) );
if ((result < 0) && (errno == ESPIPE))
result = read( unix_handle, buffer, bytesToRead );
close(unix_handle);
if(result<0)
{
if( (errno!=EAGAIN) && (errno!=EINTR) &&
((errno != EFAULT) || IsBadWritePtr( buffer, bytesToRead )) )
{
FILE_SetDosError();
return FALSE;
}
else
result = 0;
}
/* if we read enough to keep the app happy, then return now */ close(unix_handle);
if(result>=bytesToRead) overlapped->InternalHigh = 0;
{
*bytesRead = result;
return TRUE;
}
/* at last resort, do an overlapped read */
overlapped->InternalHigh = result;
if(!FILE_ReadFileEx(hFile, buffer, bytesToRead, overlapped, NULL, overlapped->hEvent)) if(!FILE_ReadFileEx(hFile, buffer, bytesToRead, overlapped, NULL, overlapped->hEvent))
return FALSE; return FALSE;
/* fail on return, with ERROR_IO_PENDING */ if ( !GetOverlappedResult (hFile, overlapped, bytesRead, FALSE) )
SetLastError(ERROR_IO_PENDING); {
return FALSE; if ( GetLastError() == ERROR_IO_INCOMPLETE )
SetLastError ( ERROR_IO_PENDING );
return FALSE;
}
return TRUE;
} }
if (flags & FD_FLAG_TIMEOUT) if (flags & FD_FLAG_TIMEOUT)
{ {
...@@ -1817,43 +1798,20 @@ BOOL WINAPI WriteFile( HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite, ...@@ -1817,43 +1798,20 @@ BOOL WINAPI WriteFile( HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite,
return FALSE; return FALSE;
} }
/* see if we can write some data already (this shouldn't block) */
result = pwrite( unix_handle, buffer, bytesToWrite, OVERLAPPED_OFFSET (overlapped) );
if ((result < 0) && (errno == ESPIPE))
result = write( unix_handle, buffer, bytesToWrite );
close(unix_handle); close(unix_handle);
overlapped->InternalHigh = 0;
if(result<0) if(!FILE_WriteFileEx(hFile, buffer, bytesToWrite, overlapped, NULL, overlapped->hEvent))
{ return FALSE;
if( (errno!=EAGAIN) && (errno!=EINTR) &&
((errno != EFAULT) || IsBadReadPtr( buffer, bytesToWrite )) )
{
FILE_SetDosError();
return FALSE;
}
else
result = 0;
}
/* if we wrote enough to keep the app happy, then return now */ if ( !GetOverlappedResult (hFile, overlapped, bytesWritten, FALSE) )
if(result>=bytesToWrite)
{ {
*bytesWritten = result; if ( GetLastError() == ERROR_IO_INCOMPLETE )
return TRUE; SetLastError ( ERROR_IO_PENDING );
}
/* at last resort, do an overlapped read */
overlapped->Internal = STATUS_PENDING;
overlapped->InternalHigh = result;
if(!FILE_WriteFileEx(hFile, buffer, bytesToWrite, overlapped, NULL, overlapped->hEvent))
return FALSE; return FALSE;
}
/* fail on return, with ERROR_IO_PENDING */ return TRUE;
SetLastError(ERROR_IO_PENDING);
return FALSE;
} }
switch(type) switch(type)
......
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