Serial and pread

Izak Burger izakb at synapp.com
Wed Apr 14 06:54:49 CDT 2004


Nope, now the app just dies with very little trace as to why.  Not to 
worry, I just need to go eat some lunch or something and get my head 
clear.  This conversation has given me a much clearer understanding of 
what goes on.

Mike McCormack wrote:
> 
> Izak Burger wrote:
> 
>> Ok.  I had to set +comm to get that info, and modified the code to 
>> dump the contents of the COMMTIMEOUTS structure:
>>
>> trace:comm:SetCommTimeouts ReadIntervalTimeout=4294967295
>> trace:comm:SetCommTimeouts ReadTotalTimeoutMultiplier=0
>> trace:comm:SetCommTimeouts ReadTotalTimeoutConstant=0
>> trace:comm:SetCommTimeouts WriteTotalTimeoutMultiplier=0
>> trace:comm:SetCommTimeouts WriteTotalTimeoutConstant=5000
>>
>> MSDN says this means to return immediately with whatever is there.
>>
>>> ReadFile command may also be important - check whether it is being 
>>> called with an overlapped structure or not.
>>
>>
>>
>> It is called with an overlapped structure:
>> trace:file:ReadFile 0x88 0x42295ff1 1040 0x4081ace0 0x42295b5f
> 
> 
> Hi Izak,
> 
> It appears we don't handle this case properly.  We only handle 
> ReadIntervalTimeout=MAXDWORD in non-overlapped mode.  Can you try the 
> following (untested) patch and see if it fixes the problem?
> 
> Mike
> 
> 
> ------------------------------------------------------------------------
> 
> Index: server/serial.c
> ===================================================================
> RCS file: /home/wine/wine/server/serial.c,v
> retrieving revision 1.33
> diff -u -r1.33 serial.c
> --- server/serial.c	8 Apr 2004 19:09:04 -0000	1.33
> +++ server/serial.c	14 Apr 2004 10:25:45 -0000
> @@ -273,6 +273,28 @@
>          if ( !async )
>              return;
>  
> +        /*
> +         * The following combination of timeout values means we're try to
> +         * read as much data as is available, then return immediately.
> +         */
> +        if ( (serial->readinterval == MAXDWORD) &&
> +              (serial->readmult == 0) && (serial->readconst == 0) )
> +        {
> +            struct pollfd pfd;
> +
> +            pfd.fd = get_unix_fd(fd);
> +            pfd.events = POLLIN;
> +            pfd.revents = 0;
> +            poll( &pfd, 1, 0 );
> +
> +            if ( !(pfd.revents & POLLIN) )
> +            {
> +                async_notify( async, STATUS_SUCCESS);
> +                destroy_async( async );
> +                return;
> +            }
> +        }
> +
>          async->status = STATUS_PENDING;
>          if(!async->q)
>          {





More information about the wine-devel mailing list