Alexandre Julliard : server:
Make the create_async function take an absolute timeout.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jul 26 09:00:45 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 40723f795ba390b70594f278106af637c9afb8d4
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=40723f795ba390b70594f278106af637c9afb8d4
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Jul 26 11:47:42 2006 +0200
server: Make the create_async function take an absolute timeout.
---
server/fd.c | 16 +++++-----------
server/file.h | 5 +++--
server/mailslot.c | 12 ++++++++----
server/named_pipe.c | 16 ++++++++--------
server/serial.c | 6 ++++--
5 files changed, 28 insertions(+), 27 deletions(-)
diff --git a/server/fd.c b/server/fd.c
index 7806bae..319f55c 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -1116,8 +1116,8 @@ static void async_callback(void *private
}
/* create an async on a given queue of a fd */
-struct async *create_async(struct thread *thread, int* timeout, struct list *queue,
- void *io_apc, void *io_user, void* io_sb)
+struct async *create_async( struct thread *thread, const struct timeval *timeout,
+ struct list *queue, void *io_apc, void *io_user, void* io_sb )
{
struct async *async = mem_alloc( sizeof(struct async) );
@@ -1130,14 +1130,7 @@ struct async *create_async(struct thread
list_add_tail( queue, &async->entry );
- if (timeout)
- {
- struct timeval when;
-
- gettimeofday( &when, NULL );
- add_timeout( &when, *timeout );
- async->timeout = add_timeout_user( &when, async_callback, async );
- }
+ if (timeout) async->timeout = add_timeout_user( timeout, async_callback, async );
else async->timeout = NULL;
return async;
@@ -1583,7 +1576,8 @@ void default_poll_event( struct fd *fd,
wake_up( fd->user, 0 );
}
-void fd_queue_async_timeout( struct fd *fd, void *apc, void *user, void *io_sb, int type, int count, int *timeout )
+void fd_queue_async_timeout( struct fd *fd, void *apc, void *user, void *io_sb, int type, int count,
+ const struct timeval *timeout )
{
struct list *queue;
int events;
diff --git a/server/file.h b/server/file.h
index 6bbf9b0..68cbb3e 100644
--- a/server/file.h
+++ b/server/file.h
@@ -66,7 +66,8 @@ extern void default_fd_remove_queue( str
extern int default_fd_signaled( struct object *obj, struct thread *thread );
extern int default_fd_get_poll_events( struct fd *fd );
extern void default_poll_event( struct fd *fd, int event );
-extern void fd_queue_async_timeout( struct fd *fd, void *apc, void *user, void *io_sb, int type, int count, int *timeout );
+extern void fd_queue_async_timeout( struct fd *fd, void *apc, void *user, void *io_sb, int type,
+ int count, const struct timeval *timeout );
extern void default_fd_queue_async( struct fd *fd, void *apc, void *user, void *io_sb, int type, int count );
extern void default_fd_cancel_async( struct fd *fd );
extern int no_flush( struct fd *fd, struct event **event );
@@ -117,7 +118,7 @@ extern int is_serial_fd( struct fd *fd )
extern struct object *create_serial( struct fd *fd, unsigned int options );
/* async I/O functions */
-extern struct async *create_async( struct thread *thread, int* timeout,
+extern struct async *create_async( struct thread *thread, const struct timeval *timeout,
struct list *queue, void *, void *, void *);
extern void async_terminate_head( struct list *queue, int status );
diff --git a/server/mailslot.c b/server/mailslot.c
index 3ff6b5c..57a15b5 100644
--- a/server/mailslot.c
+++ b/server/mailslot.c
@@ -249,7 +249,6 @@ static void mailslot_queue_async( struct
void *iosb, int type, int count )
{
struct mailslot *mailslot = get_fd_user( fd );
- int *timeout = NULL;
assert(mailslot->obj.ops == &mailslot_ops);
@@ -266,9 +265,14 @@ static void mailslot_queue_async( struct
return;
}
- if (mailslot->read_timeout != -1) timeout = &mailslot->read_timeout;
-
- fd_queue_async_timeout( fd, apc, user, iosb, type, count, timeout );
+ if (mailslot->read_timeout != -1)
+ {
+ struct timeval when;
+ gettimeofday( &when, NULL );
+ add_timeout( &when, mailslot->read_timeout );
+ fd_queue_async_timeout( fd, apc, user, iosb, type, count, &when );
+ }
+ else fd_queue_async_timeout( fd, apc, user, iosb, type, count, NULL );
}
static void mailslot_device_dump( struct object *obj, int verbose )
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 5c4da77..202cf68 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -868,18 +868,18 @@ DECL_HANDLER(wait_named_pipe)
}
else
{
- int timeout;
- if (req->timeout == NMPWAIT_USE_DEFAULT_WAIT)
- timeout = pipe->timeout;
- else
- timeout = req->timeout;
-
if (req->timeout == NMPWAIT_WAIT_FOREVER)
create_async( current, NULL, &pipe->waiters,
req->func, req->event, NULL );
else
- create_async( current, &timeout, &pipe->waiters,
- req->func, req->event, NULL );
+ {
+ struct timeval when;
+
+ gettimeofday( &when, NULL );
+ 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->func, req->event, NULL );
+ }
}
release_object( pipe );
diff --git a/server/serial.c b/server/serial.c
index 859202c..cc3086c 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -246,6 +246,7 @@ static void serial_queue_async( struct f
{
struct serial *serial = get_fd_user( fd );
struct list *queue;
+ struct timeval when;
int timeout;
int events;
@@ -270,8 +271,9 @@ static void serial_queue_async( struct f
return;
}
- if (!create_async( current, &timeout, queue, apc, user, iosb ))
- return;
+ gettimeofday( &when, NULL );
+ add_timeout( &when, timeout );
+ if (!create_async( current, &when, queue, apc, user, iosb )) return;
/* Check if the new pending request can be served immediately */
events = check_fd_events( fd, serial_get_poll_events( fd ) );
More information about the wine-cvs
mailing list