[ros-dev] Re: [ros-svn] [hbirr] 14296: - Guarded the calls to IoSetCancelRoutine with IoAcquireCancelSpinLock/IoReleaseCancelSpinLock.

Filip Navara xnavara at volny.cz
Sat Mar 26 11:28:31 CET 2005


Hartmut Birr wrote:

>Filip Navara wrote:
>
>>>I think that is a bug in the rpcrt4 implementation. The receive and send
>>>functions do check for a pending io request in a wrong way.
>>> 
>>>
>>>      
>>>
>>It's not impossible, but the code works just fine on Windows and
>>Wine... Can you point me to the code you think is wrong?
>>
>>    
>>
>rpc_message calls ReadFile/WriteFile for pipes which are open for
>asynchronous requests. ReadFile/WriteFile can fail for an pending
>request. If it fails, the caller must check the last status
>(GetLastError()) for ERROR_IO_PENDING.
>
The attached patch addresses this issue... (but it doesn't seem to help 
the test program)

>An other problem is the using of
>the overlapped structure. The same structure is used for read and write
>requests. Sometimes the results from a write request is interpreted as a
>result  from a read request.
>
All the read and write operatrions are de facto synchronous because 
they're always followed by GetOverlappedResult with Wait == TRUE, so 
this should never happen.

>It is also a bug in GetOverlappedResult.
>GetOverlappedResult must always check if the event is signaled. The
>status value may contain the result from the previous request.
>  
>
The status value is initialized in the ReadFile / WriteFile calls, so 
again, this shouldn't be problem.

Another thing I'm afraid of are race conditions in your asynchronous 
read code in NPFS. I believe that you can get the reads out of order in 
certain conditions... Imagine this:

Process 1: Async. ReadFile -> No data available -> PENDING
Process 2: WriteFile -> Fills the internal buffers and sets the event
Process 1: Async. ReadFile <- Here the request can be satisfied before 
the worker thread realizes that there are new data and completes the 
PENDING request.

Does it make sense?

Regards,
Filip


-------------- next part --------------
A non-text attachment was scrubbed...
Name: rpcrt.diff
Type: text/x-patch
Size: 3755 bytes
Desc: not available
Url : http://reactos.com:8080/pipermail/ros-dev/attachments/20050326/aa3ea0dc/rpcrt.bin


More information about the Ros-dev mailing list