Re: wine and asyncronous file i/o

2002-11-26 Thread Martin Wilck
Am Die, 2002-11-26 um 19.28 schrieb Martin Fuchs:

> Yes. Now my program does read the files without problems under wine.
> Contradicting to the real windows environment overlapped file i/o is not very 
> fast, but at least it works.  :-)

Sure. In Wine overlapped IO is probably slower than synchronous IO in
most cases. You are welcome to rework Wine's overlapped IO to use Linux'
new aio API - then we should catch up :-)

> Thank's for your effort to find a solution for my litte problem.

Good to hear it works. I'll submit the patch to Alexandre.

Martin

-- 
Martin WilckPhone: +49 5251 8 15113
Fujitsu Siemens Computers   Fax:   +49 5251 8 20409
Heinz-Nixdorf-Ring 1mailto:[EMAIL PROTECTED]
D-33106 Paderborn   http://www.fujitsu-siemens.com/primergy









Re: wine and asyncronous file i/o

2002-11-26 Thread Martin Fuchs
> Would the patch below satisfy your needs? It will call the completion
> function with SUCCESS if any data was read (case (b)) and with EOF
> otherwise. Thinking about it, this is also consistent with the EOF
> conditions I've seen elsewhere (and my previous attempt wasn't:-().
>
> This does still not fix the fact that ReadFileEx() doesn't detect EOF
> right away. I hope that is ok - I would really like to postpone the
> error handling of ReadFileEx() to the async handler unless it really
> breaks stuff. Inserting such code in ReadFileEx (andf ReadFile()?) would
> be a lot of hassle and possibly break IO on non-regular files.

Yes. Now my program does read the files without problems under wine.
Contradicting to the real windows environment overlapped file i/o is not very 
fast, but at least it works.  :-)

Thank's for your effort to find a solution for my litte problem.

-- 
Martin Fuchs
[EMAIL PROTECTED]




Re: wine and asyncronous file i/o

2002-11-26 Thread Martin Wilck
Am Die, 2002-11-26 um 10.46 schrieb [EMAIL PROTECTED]:
> Hi Martin,
> 
> > Is it correct to say, then, that it is broken behavior by your app to
> > not handle ERROR_HANDLE_EOF correctly, and that it "runs on Windows"
> > only if the files you're accessing are on a local disk?
> > 
> > I'm asking because this seems to be one of the rare cases where fixing
> > the app rather than fixing Wine may be the right thing to do.
> 
> No, my library handles both cases very well. It does this, because in the
> case of network files the file has been read already completely before the last
> ReadFileEx() call returns the error code. So there's no problem. My get()
> function returns EOF and so the application leaves it read loop.

OK. So you're saying that EOF is only passed to the completion function
when there is nothing more to read. 

Would the patch below satisfy your needs? It will call the completion
function with SUCCESS if any data was read (case (b)) and with EOF
otherwise. Thinking about it, this is also consistent with the EOF
conditions I've seen elsewhere (and my previous attempt wasn't:-().

This does still not fix the fact that ReadFileEx() doesn't detect EOF
right away. I hope that is ok - I would really like to postpone the
error handling of ReadFileEx() to the async handler unless it really
breaks stuff. Inserting such code in ReadFileEx (andf ReadFile()?) would
be a lot of hassle and possibly break IO on non-regular files.

Martin

diff -u -r1.170 file.c
--- files/file.c21 Nov 2002 03:45:03 -  1.170
+++ files/file.c26 Nov 2002 10:34:21 -
@@ -152,7 +152,7 @@
 async_fileio *ovp = (async_fileio*) data;
 TRACE ("data: %p\n", ovp);
 
-ovp->completion_func( ovp->lpOverlapped->Internal,
+ovp->completion_func( RtlNtStatusToDosError ( ovp->lpOverlapped->Internal ),
   ovp->lpOverlapped->InternalHigh,
   ovp->lpOverlapped );
 
@@ -1697,6 +1705,11 @@
 r = FILE_GetNtStatus ();
 goto async_end;
 }
+else if ( result == 0 )
+{
+r = ( lpOverlapped->InternalHigh ? STATUS_SUCCESS : 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);

-- 
Martin WilckPhone: +49 5251 8 15113
Fujitsu Siemens Computers   Fax:   +49 5251 8 20409
Heinz-Nixdorf-Ring 1mailto:[EMAIL PROTECTED]
D-33106 Paderborn   http://www.fujitsu-siemens.com/primergy









Re: wine and asyncronous file i/o

2002-11-26 Thread martin-fuchs
Hi Martin,

> Is it correct to say, then, that it is broken behavior by your app to
> not handle ERROR_HANDLE_EOF correctly, and that it "runs on Windows"
> only if the files you're accessing are on a local disk?
> 
> I'm asking because this seems to be one of the rare cases where fixing
> the app rather than fixing Wine may be the right thing to do.

No, my library handles both cases very well. It does this, because in the
case of network files the file has been read already completely before the last
ReadFileEx() call returns the error code. So there's no problem. My get()
function returns EOF and so the application leaves it read loop.

-- 
Martin Fuchs
[EMAIL PROTECTED]

+++ GMX - Mail, Messaging & more  http://www.gmx.net +++
NEU: Mit GMX ins Internet. Rund um die Uhr für 1 ct/ Min. surfen!





Re: wine and asyncronous file i/o

2002-11-26 Thread Martin Wilck
Am Die, 2002-11-26 um 09.11 schrieb Martin Fuchs:

> And yes, there is: If you read the same files as before, but now using a 
> network connect (even if the files are located on the same computer), now 
> Windows behaves a bit different. The completition function IS called in this 
> case with ERROR_HANDLE_EOF as parameter.
> 
> I think, this is the reason, why MSDN isn't as exact, as it could (or should) 
> be. The behaviour in respect to calling the completition function depends on 
> the type of dfriver, which is used to access the files.

Is it correct to say, then, that it is broken behavior by your app to
not handle ERROR_HANDLE_EOF correctly, and that it "runs on Windows"
only if the files you're accessing are on a local disk?

I'm asking because this seems to be one of the rare cases where fixing
the app rather than fixing Wine may be the right thing to do.

By the way, thanks for your very detailed analysis.

Martin

-- 
Martin WilckPhone: +49 5251 8 15113
Fujitsu Siemens Computers   Fax:   +49 5251 8 20409
Heinz-Nixdorf-Ring 1mailto:[EMAIL PROTECTED]
D-33106 Paderborn   http://www.fujitsu-siemens.com/primergy









Re: wine and asyncronous file i/o

2002-11-26 Thread Martin Fuchs
I have made an additional test with network files instead of files on the 
disk.

> To do it exactly like Windows, ReadFileEx() should check for a end-of-file
> condition.
> It there are any bytes to read from the file, it should return TRUE.
> After that, when the thread goes into the alertable state, the completition
> function
> should be called.
> In the other case, if ReadFileEx() finds EOF, it should call
> SetLastError(ERROR_HANDLE_EOF), and return FALSE. This is, what wine
> currently doesn't do.
>
> That's all. At least for regular files located on the hard disc.

I made this restriction, because I remembered, there was some thing.
And yes, there is: If you read the same files as before, but now using a 
network connect (even if the files are located on the same computer), now 
Windows behaves a bit different. The completition function IS called in this 
case with ERROR_HANDLE_EOF as parameter.

I think, this is the reason, why MSDN isn't as exact, as it could (or should) 
be. The behaviour in respect to calling the completition function depends on 
the type of dfriver, which is used to access the files.


-- 
Martin Fuchs
[EMAIL PROTECTED]




Re: wine and asyncronous file i/o

2002-11-25 Thread Martin Fuchs
My results in Windows XP showed the following results:
(The same would be true for Windows NT or 2000)

> We must distinguish 2 cases:
>
> a) The file pointer in the overlapped structure is already beyond EOF.
>This condition is one where ReadFileEx() should arguably react as you
>are describing.

If the file pointer is exactly at or after EOF, ReadFileEx() returns FALSE.
GetLastError() reports ERROR_HANDLE_EOF.
The completition function is not called in this case.

If you call ReadFileEx() at EOF, or even beyond, but specify to read 0
bytes, it reports success by returning TRUE.


> b) The file pointer in the overlapped structure is below eof, but the
>App wants to read more than available (file pointer + number of bytes
>to read is beyond EOF). If I understand you right, in this case
>ReadFileEx() returns TRUE, sets the last error to ERROR_HANDLE_EOF,
>reads as much as it can and calls the completion function
>with an Error code of 0. Right?

No. Don't take my work around, which called the callback function with 0, as
the correct behaviour. I merely searched for a way, which would allow my
programs to run under wine. They run pretty, when calling the completition
function with 0. But maybe some other program doesn't expect this behaviour
and will complain about that.
Calling the function this additional time without incrementing the file
pointer leads to an additional call of the wine ReadFileEx() function, which
now can simply report the EOF error, because we stored the state internally
in the OVERLAPPED structure.

The behaving of Windows in this case b.) is:
If the file pointer is below EOF, ReadFileEx() returns TRUE.
SetLastError() is not called, so GetLastError() would return 0.
The completition function will be called, when SleepEx(),
WaitForMultipleObjectsEx() etc. is called some time later with the parameter
bAlertable=TRUE.


> This is against what MSDN says: According to
>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/bas
e/fileiocompletionroutine.asp
> the error code for the completion function is set to ERROR_HANDLE_EOF if
> "the application tried to read past the end of file", which is case b)
> to my understanding.

MSDN says it this way:

dwErrorCode [in] Specifies the I/O completion status. This parameter CAN be
one of the
following values.

  Value   Meaning
  0  The I/O was successful.
  ERROR_HANDLE_EOF The ReadFileEx function tried to read past the end of
the file

So, the "can" allows to call the completition function with
ERROR_HANDLE_EOF,
but it does not say, it would be called in all cases, for all types of file
handles, and so on...
As described above, it is not called with ERROR_HANDLE_EOF, at least for
regular files with my test program.
If you take it exactly, MSDN is correct. But it doesn't specify exactly,
what will happen in every situation with every type of file.


So, what should be changed in wine?

To do it exactly like Windows, ReadFileEx() should check for a end-of-file
condition.
It there are any bytes to read from the file, it should return TRUE.
After that, when the thread goes into the alertable state, the completition
function
should be called.
In the other case, if ReadFileEx() finds EOF, it should call
SetLastError(ERROR_HANDLE_EOF), and return FALSE. This is, what wine
currently doesn't do.

That's all. At least for regular files located on the hard disc.


--
Martin Fuchs
[EMAIL PROTECTED]





Re: wine and asyncronous file i/o

2002-11-25 Thread Martin Wilck
Am Mon, 2002-11-25 um 11.22 schrieb Martin Fuchs:

> I've tested it under Windows XP. Windows doesn't call the completition
> function at all, if the file end has been reached. It simpy returns FALSE
> for the ReadFileEx() call, and reports ERROR_HANDLE_EOF (38) via
> GetLastError().

We must distinguish 2 cases:

a) The file pointer in the overlapped structure is already beyond EOF.
   This condition is one where ReadFileEx() should arguably react as you
   are describing.

b) The file pointer in the overlapped structure is below eof, but the
   App wants to read more than available (file pointer + number of bytes
   to read is beyond EOF). If I understand you right, in this case
   ReadFileEx() returns TRUE, sets the last error to ERROR_HANDLE_EOF,
   reads as much as it can and calls the completion function
   with an Error code of 0. Right?

This is against what MSDN says: According to
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/fileiocompletionroutine.asp
the error code for the completion function is set to ERROR_HANDLE_EOF if
"the application tried to read past the end of file", which is case b)
to my understanding. 

But of course, Wine needs to behave like Windows behaves, and not like
it's supposed to behave.

> The problem with my
> library under wine is: If an end-of-file error code is signaled via the
> completition function, this is taken as an error condition. It doesn't even
> pass the partial last file block data to the application.

I'd say this broken behavior. However, Windows supports it, so :-/
> And yes: It does run with "real" windows.  ;-)

> If you want to reproduce the exact behaving of windows with the currrent
> wine implementation, you have to change it a lot. You have to check file
> length, or try to call pread() directly in ReadFileEx(). Then call
> SetLastErorr(ERROR_HANDLE_EOF) and return FALSE without calling the
> completition function.

We had the direct read call until a few months ago. This is ok for
regular files, but not an option for any type of FIFOs like sockets,
pipes, or comm ports. The problem we have is that in general we don't
know if a file handle passed to ReadFile()/ReadFileEx() is a regular
file or not.

> If you are interested, I can put a little test program on the web or send it
> per private mail. You could use it for testing. It simple reads a file, you
> can specify on the command line, and prints it to stdout.

It can't hurt, although your reports on real Windows behavior are more
valuable.

Please tell me the exact behavior you are observing in case a and b
above.

Martin

-- 
Martin WilckPhone: +49 5251 8 15113
Fujitsu Siemens Computers   Fax:   +49 5251 8 20409
Heinz-Nixdorf-Ring 1mailto:[EMAIL PROTECTED]
D-33106 Paderborn   http://www.fujitsu-siemens.com/primergy









Re: wine and asyncronous file i/o

2002-11-25 Thread Martin Fuchs
Hi Martin!

> > After investigating the problem a bit more, I found a better solution:
> > The completition function should NOT be called with STATUS_END_OF_FILE.
>
> Passing it STATUS_END_OF_FILE is of course a bug because we have to
> report a DOS error code, not an NT status. Please try the patch below.

Yes. That was another problem, which should be corrected.

> > Instead ReadFileEx() should report the error, if there's no more to
read.
>
> Yeah, MSDN says that. I was hoping (so far) that it suffices to pass
> error conditions to the completion function. That should be the same to
> a reasonably well-written application because it must check the
> condition in the completion function anyway.

I've tested it under Windows XP. Windows doesn't call the completition
function at all, if the file end has been reached. It simpy returns FALSE
for the ReadFileEx() call, and reports ERROR_HANDLE_EOF (38) via
GetLastError().

> > + if (ovp->lpOverlapped->Internal == STATUS_END_OF_FILE) {
> > +ovp->completion_func( 0,
> > +  ovp->lpOverlapped->InternalHigh,
> > +  ovp->lpOverlapped );
>
> You report success when the condition is EOF - I don't consider that a
> good idea. Please try the patch below.

Yes. It's not really correct. It's only a work around. The problem with my
library under wine is: If an end-of-file error code is signaled via the
completition function, this is taken as an error condition. It doesn't even
pass the partial last file block data to the application.
And yes: It does run with "real" windows.  ;-)

If you want to reproduce the exact behaving of windows with the currrent
wine implementation, you have to change it a lot. You have to check file
length, or try to call pread() directly in ReadFileEx(). Then call
SetLastErorr(ERROR_HANDLE_EOF) and return FALSE without calling the
completition function.

If you are interested, I can put a little test program on the web or send it
per private mail. You could use it for testing. It simple reads a file, you
can specify on the command line, and prints it to stdout.


-- 
Martin Fuchs
[EMAIL PROTECTED]




Re: wine and asyncronous file i/o

2002-11-25 Thread Martin Wilck
Am Sam, 2002-11-23 um 11.54 schrieb Martin Fuchs:

> After investigating the problem a bit more, I found a better solution:
> The completition function should NOT be called with STATUS_END_OF_FILE.

Passing it STATUS_END_OF_FILE is of course a bug because we have to
report a DOS error code, not an NT status. Please try the patch below.

> Instead ReadFileEx() should report the error, if there's no more to read.

Yeah, MSDN says that. I was hoping (so far) that it suffices to pass
error conditions to the completion function. That should be the same to
a reasonably well-written application because it must check the
condition in the completion function anyway. 

> + if (ovp->lpOverlapped->Internal == STATUS_END_OF_FILE) {
> +ovp->completion_func( 0,
> +  ovp->lpOverlapped->InternalHigh,
> +  ovp->lpOverlapped );

You report success when the condition is EOF - I don't consider that a
good idea. Please try the patch below.

Martin

Index: files/file.c
===
RCS file: /home/wine/wine/files/file.c,v
retrieving revision 1.170
diff -u -r1.170 file.c
--- files/file.c21 Nov 2002 03:45:03 -  1.170
+++ files/file.c25 Nov 2002 08:34:22 -
@@ -152,7 +152,7 @@
 async_fileio *ovp = (async_fileio*) data;
 TRACE ("data: %p\n", ovp);
 
-ovp->completion_func( ovp->lpOverlapped->Internal,
+ovp->completion_func( RtlNtStatusToDosError ( ovp->lpOverlapped->Internal ),
   ovp->lpOverlapped->InternalHigh,
   ovp->lpOverlapped );
 
@@ -1695,6 +1695,11 @@
 if(result<0)
 {
 r = FILE_GetNtStatus ();
+goto async_end;
+}
+else if ( result == 0 )
+{
+r = STATUS_END_OF_FILE;
 goto async_end;
 }
 








Re: wine and asyncronous file i/o

2002-11-23 Thread Martin Fuchs
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 -  1.170
+++ file.c  23 Nov 2002 10:49:24 -
@@ -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
[EMAIL PROTECTED]




Re: wine and asyncronous file i/o

2002-11-22 Thread Martin Fuchs

Thanks, Martin!

> EOF conditions are nasty. Seems we got it wrong... Please try the
> following patch (it should solve your problem). However I guess it needs
> regression testing because it changes overlapped ReadFile() semantics
> drastically. If this condition turns out to be right, we may actually be
> able to get rid of the special treatment of sockets in
> FILE_AsyncReadService().

Yes, the file read routine seems to work now.
However the application doesn't run completely yet.
But that's another problem, I think...

--
Martin Fuchs
[EMAIL PROTECTED]





Re: wine and asyncronous file i/o

2002-11-22 Thread Mike McCormack
Hi Martin,

What sort of file handle is the program trying to read from? Is it a 
serial port, a socket, a pipe or a standard file?

-debugmsg +file,+comm,+server,+winsock should generate a good enough trace.

Mike

Martin Fuchs wrote:

Hi!

I've got an application, which uses an asynchron file stream library. 
I uses
ReadFileEx() and alertable wait with SleepEx().
This doesn't work right with wine. It seems to get caught in an 
endless loop.
Wine and wineserver together use 100 % cpu power.

Does anyone already know, what's going wrong here?

I had a quick look at the implementation in wine, but couldn't find 
any hint
about missing functionality or some thing like this.

Which debug switches wold be usefull to trace this?






Re: wine and asyncronous file i/o

2002-11-22 Thread Martin Wilck
Hi Martin,

> I've attached the interesting section of the resulting trace file.
> Maybe you see, what's going on.
> The programs reads a file with 21517 bytes length.
> After fetching five blocks of 4096 bytes correctly, it reads the remaining 
> 1037 bytes. But it does not stop! It reads this last file block continuously.

EOF conditions are nasty. Seems we got it wrong... Please try the
following patch (it should solve your problem). However I guess it needs
regression testing because it changes overlapped ReadFile() semantics
drastically. If this condition turns out to be right, we may actually be
able to get rid of the special treatment of sockets in
FILE_AsyncReadService().

Martin

Index: files/file.c
===
RCS file: /home/wine/wine/files/file.c,v
retrieving revision 1.170
diff -u -r1.170 file.c
--- files/file.c21 Nov 2002 03:45:03 -  1.170
+++ files/file.c22 Nov 2002 11:00:47 -
@@ -1697,6 +1697,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);

-- 
Martin WilckPhone: +49 5251 8 15113
Fujitsu Siemens Computers   Fax:   +49 5251 8 20409
Heinz-Nixdorf-Ring 1mailto:[EMAIL PROTECTED]
D-33106 Paderborn   http://www.fujitsu-siemens.com/primergy









Re: wine and asyncronous file i/o

2002-11-22 Thread Martin Fuchs
Hi Mike!

> What sort of file handle is the program trying to read from? Is it a
> serial port, a socket, a pipe or a standard file?
>
> -debugmsg +file,+comm,+server,+winsock should generate a good enough trace.
>
> Mike

It's a standard file.

I think, there's missing the error code in the OVERLAPPED structure on end of 
file. This is used to distinguish the end of the file in the library.
I will take a look at this today evening.


--
Martin Fuchs
[EMAIL PROTECTED]





Re: wine and asyncronous file i/o

2002-11-22 Thread Martin Fuchs
On Fri 22. November 2002 09:47, Martin Wilck wrote:
> This should work. The IO is currently not truly asynchronous, though -
> but with SleepEx() all should be fine.
>
> > Which debug switches wold be usefull to trace this?
>
> trace+file,trace+server

I've attached the interesting section of the resulting trace file.
Maybe you see, what's going on.
The programs reads a file with 21517 bytes length.
After fetching five blocks of 4096 bytes correctly, it reads the remaining 
1037 bytes. But it does not stop! It reads this last file block continuously.

-- 
Martin Fuchs
[EMAIL PROTECTED]
trace:file:CreateFileW L"/trace2" GENERIC_READ FILE_SHARE_READ OPEN_EXISTING  
attributes 0x4800
Warning: L"/trace2" not accessible from a configured DOS drive
08073d90: create_file( access=8000, inherit=0, sharing=0001, create=3, 
attrs=4800, drive_type=4, filename="/home/martin/trace2" )
08073d90: create_file() = 0 { handle=0x58 }
trace:file:CreateFileW returning 0x58
trace:file:FILE_ReadFileEx file 0x58 to buf 0x406df648 num 4096 0x406e1650 func 
0x58055c80
08073d90: get_handle_fd( handle=0x58, access=8000 )
08073d90: *fd* 0x58 -> 23
08073d90: get_handle_fd() = 0 { fd=-1, type=1, flags=1 }
08073d90: set_handle_info( handle=0x58, flags=0, mask=0, fd=10 )
08073d90: set_handle_info() = 0 { old_flags=0, cur_fd=10 }
08073d90: register_async( handle=0x58, type=1, overlapped=0x403d1558, count=4096, 
status=0103 )
08073d90: register_async() = 0
08073d90: select( flags=6, cookie=0x406df4c4, sec=0, usec=0, handles={0x18} )
08073d90: select() = USER_APC
08073d90: get_apc( alertable=1 )
08073d90: get_apc() = 0 { func=(nil), type=4, args={0x403d1558,0x101} }
trace:file:FILE_AsyncReadService 0x406e1650 0x406df648
trace:file:FILE_AsyncReadService read 4096 more bytes 4096/4096 so far
08073d90: register_async( handle=0x58, type=1, overlapped=0x403d1558, count=0, 
status= )
08073d90: register_async() = 0
08073d90: queue_apc( handle=0xfffe, user=1, func=0x40086870, param=0x403d1558 )
08073d90: queue_apc() = 0
08073d90: get_apc( alertable=1 )
08073d90: get_apc() = 0 { func=0x40086870, type=1, args={0x403d1558} }
trace:file:fileio_call_completion_func data: 0x403d1558
08073d90: get_apc( alertable=1 )
08073d90: get_apc() = 0 { func=(nil), type=0, args={} }
trace:file:FILE_ReadFileEx file 0x58 to buf 0x406e0648 num 4096 0x406e1650 func 
0x58055c80
08073d90: get_handle_fd( handle=0x58, access=8000 )
08073d90: get_handle_fd() = 0 { fd=10, type=1, flags=1 }
08073d90: register_async( handle=0x58, type=1, overlapped=0x403d1558, count=4096, 
status=0103 )
08073d90: register_async() = 0
08073d90: select( flags=6, cookie=0x406df450, sec=0, usec=0, handles={0x18} )
08073d90: select() = USER_APC
08073d90: get_apc( alertable=1 )
08073d90: get_apc() = 0 { func=(nil), type=4, args={0x403d1558,0x101} }
trace:file:FILE_AsyncReadService 0x406e1650 0x406e0648
trace:file:FILE_AsyncReadService read 4096 more bytes 4096/4096 so far
08073d90: register_async( handle=0x58, type=1, overlapped=0x403d1558, count=0, 
status= )
08073d90: register_async() = 0
08073d90: queue_apc( handle=0xfffe, user=1, func=0x40086870, param=0x403d1558 )
08073d90: queue_apc() = 0
08073d90: get_apc( alertable=1 )
08073d90: get_apc() = 0 { func=0x40086870, type=1, args={0x403d1558} }
trace:file:fileio_call_completion_func data: 0x403d1558
08073d90: get_apc( alertable=1 )
08073d90: get_apc() = 0 { func=(nil), type=0, args={} }
trace:file:FILE_ReadFileEx file 0x58 to buf 0x406df648 num 4096 0x406e1650 func 
0x58055c80
08073d90: get_handle_fd( handle=0x58, access=8000 )
08073d90: get_handle_fd() = 0 { fd=10, type=1, flags=1 }
08073d90: register_async( handle=0x58, type=1, overlapped=0x403d1558, count=4096, 
status=0103 )
08073d90: register_async() = 0
08073d90: select( flags=6, cookie=0x406df450, sec=0, usec=0, handles={0x18} )
08073d90: select() = USER_APC
08073d90: get_apc( alertable=1 )
08073d90: get_apc() = 0 { func=(nil), type=4, args={0x403d1558,0x101} }
trace:file:FILE_AsyncReadService 0x406e1650 0x406df648
trace:file:FILE_AsyncReadService read 4096 more bytes 4096/4096 so far
08073d90: register_async( handle=0x58, type=1, overlapped=0x403d1558, count=0, 
status= )
08073d90: register_async() = 0
08073d90: queue_apc( handle=0xfffe, user=1, func=0x40086870, param=0x403d1558 )
08073d90: queue_apc() = 0
08073d90: get_apc( alertable=1 )
08073d90: get_apc() = 0 { func=0x40086870, type=1, args={0x403d1558} }
trace:file:fileio_call_completion_func data: 0x403d1558
08073d90: get_apc( alertable=1 )
08073d90: get_apc() = 0 { func=(nil), type=0, args={} }
trace:file:FILE_ReadFileEx file 0x58 to buf 0x406e0648 num 4096 0x406e1650 func 
0x58055c80
08073d90: get_handle_fd( handle=0x58, access=8000 )
08073d90: get_handle_fd() = 0 { fd=10, type=1, flags=1 }
08073d90: register_async( handle=0x58, type=1, overlapped=0x403d1558, count=4096, 
status=0103 )
08073d90: register_async() = 0
08073d90: select( flags=6, cookie=0x40

Re: wine and asyncronous file i/o

2002-11-22 Thread Martin Wilck
Am Fre, 2002-11-22 um 04.43 schrieb Martin Fuchs:

> I've got an application, which uses an asynchron file stream library. I uses 
> ReadFileEx() and alertable wait with SleepEx().

> This doesn't work right with wine. It seems to get caught in an endless loop. 
> Wine and wineserver together use 100 % cpu power.
This should work. The IO is currently not truly asynchronous, though -
but with SleepEx() all should be fine.

> Which debug switches wold be usefull to trace this?
trace+file,trace+server

Martin
-- 
Martin WilckPhone: +49 5251 8 15113
Fujitsu Siemens Computers   Fax:   +49 5251 8 20409
Heinz-Nixdorf-Ring 1mailto:[EMAIL PROTECTED]
D-33106 Paderborn   http://www.fujitsu-siemens.com/primergy