wine and asyncronous file i/o
Martin Fuchs
martin-fuchs at gmx.net
Sat Nov 23 04:54:17 CST 2002
Hi again! ;-)
After investigating the problem a bit more, I found a better solution:
The completition function should NOT be called with STATUS_END_OF_FILE.
Instead ReadFileEx() should report the error, if there's no more to read.
This patch works better for me, although I don't think, it is a really clean
solution, do you? And i'm not sure, if it will work with something other than
regular files.
Index: file.c
===================================================================
RCS file: /home/wine/wine/files/file.c,v
retrieving revision 1.170
diff -u -r1.170 file.c
--- file.c 21 Nov 2002 03:45:03 -0000 1.170
+++ file.c 23 Nov 2002 10:49:24 -0000
@@ -152,9 +152,15 @@
async_fileio *ovp = (async_fileio*) data;
TRACE ("data: %p\n", ovp);
- ovp->completion_func( ovp->lpOverlapped->Internal,
- ovp->lpOverlapped->InternalHigh,
- ovp->lpOverlapped );
+ if (ovp->lpOverlapped->Internal == STATUS_END_OF_FILE) {
+ ovp->completion_func( 0,
+ ovp->lpOverlapped->InternalHigh,
+ ovp->lpOverlapped );
+ } else {
+ ovp->completion_func( ovp->lpOverlapped->Internal,
+ ovp->lpOverlapped->InternalHigh,
+ ovp->lpOverlapped );
+ }
fileio_async_cleanup ( &ovp->async );
}
@@ -1697,6 +1703,11 @@
r = FILE_GetNtStatus ();
goto async_end;
}
+ else if (result == 0)
+ {
+ r = STATUS_END_OF_FILE;
+ goto async_end;
+ }
lpOverlapped->InternalHigh += result;
TRACE("read %d more bytes %ld/%d so
far\n",result,lpOverlapped->InternalHigh,fileio->count);
@@ -1731,6 +1742,12 @@
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
+ }
+
+ if (overlapped->Internal == STATUS_END_OF_FILE)
+ {
+ SetLastError(overlapped->Internal);
+ return FALSE;
}
fd = FILE_GetUnixHandleType ( hFile, GENERIC_READ, &type, &flags);
--
Martin Fuchs
martin-fuchs at gmx.net
More information about the wine-devel
mailing list