Alexandre Julliard : server:
Move the signalling of the named pipe completion event to the server.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Mar 21 17:02:46 CDT 2007
Module: wine
Branch: master
Commit: a133ad56f913b13d95bfd217aa627fdda50d5cd4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a133ad56f913b13d95bfd217aa627fdda50d5cd4
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Mar 21 14:31:54 2007 +0100
server: Move the signalling of the named pipe completion event to the server.
---
dlls/ntdll/file.c | 41 +++++++++++++++--------------------------
server/named_pipe.c | 26 +++++++++-----------------
2 files changed, 24 insertions(+), 43 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index c25e229..0b22583 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -920,14 +920,10 @@ NTSTATUS WINAPI NtDeviceIoControlFile(HANDLE handle, HANDLE event,
/***********************************************************************
* pipe_completion_wait (Internal)
*/
-static void CALLBACK pipe_completion_wait(HANDLE event, PIO_STATUS_BLOCK iosb, ULONG status)
+static void CALLBACK pipe_completion_wait(void *arg, PIO_STATUS_BLOCK iosb, ULONG status)
{
- TRACE("for %p/%p, status=%08x\n", event, iosb, status);
-
- if (iosb)
- iosb->u.Status = status;
- NtSetEvent(event, NULL);
- TRACE("done\n");
+ TRACE("for %p, status=%08x\n", iosb, status);
+ iosb->u.Status = status;
}
/**************************************************************************
@@ -982,20 +978,17 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
req->handle = handle;
req->async.callback = pipe_completion_wait;
req->async.iosb = io;
- req->async.arg = event ? event : internal_event;
+ req->async.arg = NULL;
+ req->async.event = event ? event : internal_event;
io->u.Status = wine_server_call(req);
}
SERVER_END_REQ;
- if(io->u.Status == STATUS_SUCCESS)
+ if (!event && io->u.Status == STATUS_PENDING)
{
- if(event) io->u.Status = STATUS_PENDING;
- else
- {
- do
- io->u.Status = NtWaitForSingleObject(internal_event, TRUE, NULL);
- while(io->u.Status == STATUS_USER_APC);
- }
+ do
+ io->u.Status = NtWaitForSingleObject(internal_event, TRUE, NULL);
+ while(io->u.Status == STATUS_USER_APC);
}
if (internal_event) NtClose(internal_event);
}
@@ -1018,22 +1011,18 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
: NMPWAIT_USE_DEFAULT_WAIT;
req->async.callback = pipe_completion_wait;
req->async.iosb = io;
- req->async.arg = event ? event : internal_event;
+ req->async.arg = NULL;
+ req->async.event = event ? event : internal_event;
wine_server_add_data( req, buff->Name, buff->NameLength );
io->u.Status = wine_server_call( req );
}
SERVER_END_REQ;
- if(io->u.Status == STATUS_SUCCESS)
+ if (!event && io->u.Status == STATUS_PENDING)
{
- if(event)
- io->u.Status = STATUS_PENDING;
- else
- {
- do
- io->u.Status = NtWaitForSingleObject(internal_event, TRUE, NULL);
- while(io->u.Status == STATUS_USER_APC);
- }
+ do
+ io->u.Status = NtWaitForSingleObject(internal_event, TRUE, NULL);
+ while(io->u.Status == STATUS_USER_APC);
}
if (internal_event) NtClose(internal_event);
}
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 61ddd37..a9ca5b1 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -826,6 +826,7 @@ DECL_HANDLER(connect_named_pipe)
server->state = ps_wait_open;
create_async( current, NULL, &server->wait_q, &req->async );
async_terminate_queue( &server->pipe->waiters, STATUS_SUCCESS );
+ set_error( STATUS_PENDING );
break;
case ps_connected_server:
assert( server->fd );
@@ -865,32 +866,23 @@ DECL_HANDLER(wait_named_pipe)
return;
}
server = find_server( pipe, ps_wait_open );
- if (server)
- {
- apc_call_t data;
-
- /* there's already a server waiting for a client to connect */
- memset( &data, 0, sizeof(data) );
- data.type = APC_ASYNC_IO;
- data.async_io.func = req->async.callback;
- data.async_io.user = req->async.arg;
- data.async_io.sb = req->async.iosb;
- data.async_io.status = STATUS_SUCCESS;
- thread_queue_apc( current, NULL, &data );
- release_object( server );
- }
- else
+ if (!server)
{
if (req->timeout == NMPWAIT_WAIT_FOREVER)
- create_async( current, NULL, &pipe->waiters, &req->async );
+ {
+ if (create_async( current, NULL, &pipe->waiters, &req->async ))
+ set_error( STATUS_PENDING );
+ }
else
{
struct timeval when = current_time;
if (req->timeout == NMPWAIT_USE_DEFAULT_WAIT) add_timeout( &when, pipe->timeout );
else add_timeout( &when, req->timeout );
- create_async( current, &when, &pipe->waiters, &req->async );
+ if (create_async( current, &when, &pipe->waiters, &req->async ))
+ set_error( STATUS_PENDING );
}
}
+ else release_object( server );
release_object( pipe );
}
More information about the wine-cvs
mailing list