Fix for overlapped I/O using ReadFile/WriteFile

Tony Bryant brd at paradise.net.nz
Sun Jan 27 02:03:43 CST 2002


This patch fixes 2 problems

--

1) Overlapped I/O using ReadFile/WriteFile may never trigger 
Overlapped.hEvent

The current wine is broken in this respect, because the notification 
event is set(i.e. triggered) in an wine supplied overlapped completion 
routine (i.e. like what ReadFileEx takes as its final parameter). 

This is broken because the completion routine is only ever called
from when an alertable MsgWait function is running. However, there 
should be no need to run a alertable MsgWait function if we 
(as a windows programmer) aren't actally using ReadFileEx or 
WriteFileEx.

This patch adds a "completion_event" member to the async_private
structure. scheduler/synchro.c will fire this event when the
async request is finished.

This is of course in addition to the "completion_func" member
(still) used for WriteFileEx/ReadFileEx calls.

--

2) Comms timeouts (set with SetCommsTimeouts) > 0x7FFFFFFF cause no wait to
occurs (signed/unsigned SNAFU).

--

? patch.diff
Index: files/file.c
===================================================================
RCS file: /home/wine/wine/files/file.c,v
retrieving revision 1.131
diff -r1.131 file.c
1359c1359,1360
< 			 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
---
> 			 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
>              HANDLE hCompletionEvent)
1391a1393
>     ovp->completion_event = hCompletionEvent;
1424,1429c1426
<     return 
FILE_ReadFileEx(hFile,buffer,bytesToRead,overlapped,lpCompletionRoutine);
< }
< 
< static VOID CALLBACK FILE_OverlappedComplete(DWORD status, DWORD count, 
LPOVERLAPPED ov)
< {
<     NtSetEvent(ov->hEvent,NULL);
---
>     return 
FILE_ReadFileEx(hFile,buffer,bytesToRead,overlapped,lpCompletionRoutine,(HANDLE)0L);
1442c1439,1441
<         if(ReadFileEx(hFile, buffer, bytesToRead, &ov, 
FILE_OverlappedComplete))
---
>         ov.Internal     = STATUS_PENDING;
>         ov.InternalHigh = 0;
>         if(FILE_ReadFileEx(hFile, buffer, bytesToRead, &ov,NULL,ov.hEvent ))
1509c1508
<         if(!FILE_ReadFileEx(hFile, buffer, bytesToRead, overlapped, 
FILE_OverlappedComplete))
---
>         if(!FILE_ReadFileEx(hFile, buffer, bytesToRead, overlapped, NULL, 
overlapped->hEvent ))
1606c1605,1606
<                              LPOVERLAPPED_COMPLETION_ROUTINE 
lpCompletionRoutine)
---
>                              LPOVERLAPPED_COMPLETION_ROUTINE 
lpCompletionRoutine,
>                              HANDLE hCompletionEvent)
1639a1640
>     ovp->completion_event = hCompletionEvent;
1670c1671
<     return FILE_WriteFileEx(hFile, buffer, bytesToWrite, overlapped, 
lpCompletionRoutine);
---
>     return FILE_WriteFileEx(hFile, buffer, bytesToWrite, overlapped, 
lpCompletionRoutine, (HANDLE)0L);
1733c1734
<         if(!FILE_WriteFileEx(hFile, buffer, bytesToWrite, overlapped, 
FILE_OverlappedComplete))
---
>         if(!FILE_WriteFileEx(hFile, buffer, bytesToWrite, overlapped, NULL, 
overlapped->hEvent))
Index: include/file.h
===================================================================
RCS file: /home/wine/wine/include/file.h,v
retrieving revision 1.37
diff -r1.37 file.h
46a47
>      HANDLE        completion_event;
Index: scheduler/synchro.c
===================================================================
RCS file: /home/wine/wine/scheduler/synchro.c,v
retrieving revision 1.40
diff -r1.40 synchro.c
20c20
< 
---
> #include <stdio.h>
57a58,63
>     }
>     /* set ReadFile/WriteFile's overlapped completion event */
>     if (ovp->completion_event)
>     {
>         NtSetEvent( ovp->completion_event, NULL );
>         ovp->completion_event=NULL;
Index: server/serial.c
===================================================================
RCS file: /home/wine/wine/server/serial.c,v
retrieving revision 1.17
diff -r1.17 serial.c
265a266,267
>         if (timeout<0)
>             timeout=0x7FFFFFFF;
273a276,277
>         if (timeout<0)
>             timeout=0x7FFFFFFF;




More information about the wine-patches mailing list