Alexandre Julliard : ntdll: Don'
t store the unix file descriptor in the async structure,
retrieve it as needed.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Nov 3 07:32:41 CST 2006
Module: wine
Branch: master
Commit: d384871bc3be5d83ae926d8f07f8fd6eaea2a7e6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d384871bc3be5d83ae926d8f07f8fd6eaea2a7e6
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Nov 3 11:56:51 2006 +0100
ntdll: Don't store the unix file descriptor in the async structure, retrieve it as needed.
---
dlls/ntdll/file.c | 53 ++++++++++++++++++++++++-----------------------------
1 files changed, 24 insertions(+), 29 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 514a8a7..d91666a 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -286,8 +286,6 @@ typedef struct async_fileio
off_t offset;
int queue_apc_on_error;
BOOL avail_mode;
- int fd;
- int needs_close;
HANDLE event;
} async_fileio;
@@ -295,7 +293,6 @@ static void fileio_terminate(async_filei
{
TRACE("data: %p\n", fileio);
- if (fileio->needs_close) close( fileio->fd );
if (fileio->event) NtSetEvent( fileio->event, NULL );
if (fileio->apc &&
@@ -382,14 +379,11 @@ #endif
/***********************************************************************
* FILE_AsyncReadService (INTERNAL)
- *
- * This function is called while the client is waiting on the
- * server, so we can't make any server calls here.
*/
static void WINAPI FILE_AsyncReadService(void *user, PIO_STATUS_BLOCK iosb, ULONG status)
{
async_fileio *fileio = (async_fileio*)user;
- int result;
+ int fd, needs_close, result;
int already = iosb->Information;
TRACE("%p %p 0x%x\n", iosb, fileio->buffer, status);
@@ -399,18 +393,22 @@ static void WINAPI FILE_AsyncReadService
case STATUS_ALERTED: /* got some new data */
if (iosb->u.Status != STATUS_PENDING) FIXME("unexpected status %08x\n", iosb->u.Status);
/* check to see if the data is ready (non-blocking) */
+ if ((iosb->u.Status = server_get_unix_fd( fileio->handle, FILE_READ_DATA, &fd, &needs_close, NULL )))
+ {
+ fileio_terminate(fileio, iosb);
+ break;
+ }
if ( fileio->avail_mode )
- result = read(fileio->fd, &fileio->buffer[already],
- fileio->count - already);
+ result = read(fd, &fileio->buffer[already], fileio->count - already);
else
{
- result = pread(fileio->fd, &fileio->buffer[already],
+ result = pread(fd, &fileio->buffer[already],
fileio->count - already,
fileio->offset + already);
if ((result < 0) && (errno == ESPIPE))
- result = read(fileio->fd, &fileio->buffer[already],
- fileio->count - already);
+ result = read(fd, &fileio->buffer[already], fileio->count - already);
}
+ if (needs_close) close( fd );
if (result < 0)
{
@@ -545,16 +543,14 @@ NTSTATUS WINAPI NtReadFile(HANDLE hFile,
fileio->buffer = buffer;
fileio->queue_apc_on_error = 0;
fileio->avail_mode = (flags & FD_FLAG_AVAILABLE);
- fileio->fd = unix_handle; /* FIXME */
- fileio->needs_close = needs_close;
fileio->event = hEvent;
- NtResetEvent(hEvent, NULL);
+ if (hEvent) NtResetEvent(hEvent, NULL);
+ if (needs_close) close( unix_handle );
io_status->u.Status = STATUS_PENDING;
ret = fileio_queue_async(fileio, io_status, TRUE);
if (ret != STATUS_SUCCESS)
{
- if (needs_close) close( unix_handle );
if (flags & FD_FLAG_TIMEOUT) NtClose(hEvent);
return ret;
}
@@ -625,14 +621,11 @@ done:
/***********************************************************************
* FILE_AsyncWriteService (INTERNAL)
- *
- * This function is called while the client is waiting on the
- * server, so we can't make any server calls here.
*/
static void WINAPI FILE_AsyncWriteService(void *ovp, IO_STATUS_BLOCK *iosb, ULONG status)
{
async_fileio *fileio = (async_fileio *) ovp;
- int result;
+ int result, fd, needs_close;
int already = iosb->Information;
TRACE("(%p %p 0x%x)\n",iosb, fileio->buffer, status);
@@ -641,17 +634,21 @@ static void WINAPI FILE_AsyncWriteServic
{
case STATUS_ALERTED:
/* write some data (non-blocking) */
+ if ((iosb->u.Status = server_get_unix_fd( fileio->handle, FILE_WRITE_DATA, &fd, &needs_close, NULL )))
+ {
+ fileio_terminate(fileio, iosb);
+ break;
+ }
if ( fileio->avail_mode )
- result = write(fileio->fd, &fileio->buffer[already],
- fileio->count - already);
+ result = write(fd, &fileio->buffer[already], fileio->count - already);
else
{
- result = pwrite(fileio->fd, &fileio->buffer[already],
+ result = pwrite(fd, &fileio->buffer[already],
fileio->count - already, fileio->offset + already);
if ((result < 0) && (errno == ESPIPE))
- result = write(fileio->fd, &fileio->buffer[already],
- fileio->count - already);
+ result = write(fd, &fileio->buffer[already], fileio->count - already);
}
+ if (needs_close) close( fd );
if (result < 0)
{
@@ -767,17 +764,15 @@ NTSTATUS WINAPI NtWriteFile(HANDLE hFile
fileio->buffer = (void*)buffer;
fileio->queue_apc_on_error = 0;
fileio->avail_mode = (flags & FD_FLAG_AVAILABLE);
- fileio->fd = unix_handle; /* FIXME */
- fileio->needs_close = needs_close;
fileio->event = hEvent;
- NtResetEvent(hEvent, NULL);
+ if (hEvent) NtResetEvent(hEvent, NULL);
+ if (needs_close) close( unix_handle );
io_status->Information = 0;
io_status->u.Status = STATUS_PENDING;
ret = fileio_queue_async(fileio, io_status, FALSE);
if (ret != STATUS_SUCCESS)
{
- if (needs_close) close( unix_handle );
if (flags & FD_FLAG_TIMEOUT) NtClose(hEvent);
return ret;
}
More information about the wine-cvs
mailing list