Make mailslots use as much of the default async fd implementation as

possible.
This commit is contained in:
Robert Shearman 2005-07-14 12:18:05 +00:00 committed by Alexandre Julliard
parent 9ad5628639
commit 37773dda84
3 changed files with 18 additions and 60 deletions

View file

@ -1409,12 +1409,12 @@ void default_poll_event( struct fd *fd, int event )
wake_up( fd->user, 0 ); wake_up( fd->user, 0 );
} }
void default_fd_queue_async( struct fd *fd, void *apc, void *user, void *io_sb, int type, int count ) void fd_queue_async_timeout( struct fd *fd, void *apc, void *user, void *io_sb, int type, int count, int *timeout )
{ {
struct list *queue; struct list *queue;
int events; int events;
if (!(fd->fd_ops->get_file_info( fd ) & FD_FLAG_OVERLAPPED)) if (!(fd->fd_ops->get_file_info( fd ) & (FD_FLAG_OVERLAPPED|FD_FLAG_TIMEOUT)))
{ {
set_error( STATUS_INVALID_HANDLE ); set_error( STATUS_INVALID_HANDLE );
return; return;
@ -1433,7 +1433,7 @@ void default_fd_queue_async( struct fd *fd, void *apc, void *user, void *io_sb,
return; return;
} }
if (!create_async( current, NULL, queue, apc, user, io_sb )) if (!create_async( current, timeout, queue, apc, user, io_sb ))
return; return;
/* Check if the new pending request can be served immediately */ /* Check if the new pending request can be served immediately */
@ -1443,6 +1443,11 @@ void default_fd_queue_async( struct fd *fd, void *apc, void *user, void *io_sb,
set_fd_events( fd, fd->fd_ops->get_poll_events( fd ) ); set_fd_events( fd, fd->fd_ops->get_poll_events( fd ) );
} }
void default_fd_queue_async( struct fd *fd, void *apc, void *user, void *io_sb, int type, int count )
{
fd_queue_async_timeout( fd, apc, user, io_sb, type, count, NULL );
}
void default_fd_cancel_async( struct fd *fd ) void default_fd_cancel_async( struct fd *fd )
{ {
async_terminate_queue( &fd->read_q, STATUS_CANCELLED ); async_terminate_queue( &fd->read_q, STATUS_CANCELLED );

View file

@ -65,6 +65,7 @@ extern void default_fd_remove_queue( struct object *obj, struct wait_queue_entry
extern int default_fd_signaled( struct object *obj, struct thread *thread ); extern int default_fd_signaled( struct object *obj, struct thread *thread );
extern int default_fd_get_poll_events( struct fd *fd ); extern int default_fd_get_poll_events( struct fd *fd );
extern void default_poll_event( struct fd *fd, int event ); 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 default_fd_queue_async( struct fd *fd, void *apc, void *user, void *io_sb, int type, int count ); 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 void default_fd_cancel_async( struct fd *fd );
extern int no_flush( struct fd *fd, struct event **event ); extern int no_flush( struct fd *fd, struct event **event );

View file

@ -57,7 +57,6 @@ struct mailslot
unsigned int max_msgsize; unsigned int max_msgsize;
unsigned int read_timeout; unsigned int read_timeout;
struct list writers; struct list writers;
struct list read_q;
}; };
/* mailslot functions */ /* mailslot functions */
@ -79,20 +78,17 @@ static const struct object_ops mailslot_ops =
mailslot_destroy /* destroy */ mailslot_destroy /* destroy */
}; };
static int mailslot_get_poll_events( struct fd * );
static void mailslot_poll_event( struct fd *, int );
static int mailslot_get_info( struct fd * ); static int mailslot_get_info( struct fd * );
static void mailslot_queue_async( struct fd *, void*, void*, void*, int, int ); static void mailslot_queue_async( struct fd *, void*, void*, void*, int, int );
static void mailslot_cancel_async( struct fd * );
static const struct fd_ops mailslot_fd_ops = static const struct fd_ops mailslot_fd_ops =
{ {
mailslot_get_poll_events, /* get_poll_events */ default_fd_get_poll_events, /* get_poll_events */
mailslot_poll_event, /* poll_event */ default_poll_event, /* poll_event */
no_flush, /* flush */ no_flush, /* flush */
mailslot_get_info, /* get_file_info */ mailslot_get_info, /* get_file_info */
mailslot_queue_async, /* queue_async */ mailslot_queue_async, /* queue_async */
mailslot_cancel_async /* cancel_async */ default_fd_cancel_async /* cancel_async */
}; };
struct mail_writer struct mail_writer
@ -141,8 +137,6 @@ static void mailslot_destroy( struct object *obj)
assert( mailslot->fd ); assert( mailslot->fd );
assert( mailslot->write_fd ); assert( mailslot->write_fd );
async_terminate_queue( &mailslot->read_q, STATUS_CANCELLED );
release_object( mailslot->fd ); release_object( mailslot->fd );
release_object( mailslot->write_fd ); release_object( mailslot->write_fd );
} }
@ -191,33 +185,11 @@ static struct fd *mailslot_get_fd( struct object *obj )
return (struct fd *)grab_object( mailslot->fd ); return (struct fd *)grab_object( mailslot->fd );
} }
static int mailslot_get_poll_events( struct fd *fd )
{
struct mailslot *mailslot = get_fd_user( fd );
int events = 0;
assert( mailslot->obj.ops == &mailslot_ops );
if (!list_empty( &mailslot->read_q ))
events |= POLLIN;
return events;
}
static void mailslot_poll_event( struct fd *fd, int event )
{
struct mailslot *mailslot = get_fd_user( fd );
if (!list_empty( &mailslot->read_q ) && (POLLIN & event))
async_terminate_head( &mailslot->read_q, STATUS_ALERTED );
set_fd_events( fd, mailslot_get_poll_events(fd) );
}
static void mailslot_queue_async( struct fd *fd, void *apc, void *user, static void mailslot_queue_async( struct fd *fd, void *apc, void *user,
void *iosb, int type, int count ) void *iosb, int type, int count )
{ {
struct mailslot *mailslot = get_fd_user( fd ); struct mailslot *mailslot = get_fd_user( fd );
int events, *ptimeout = NULL; int *timeout = NULL;
assert(mailslot->obj.ops == &mailslot_ops); assert(mailslot->obj.ops == &mailslot_ops);
@ -235,28 +207,9 @@ static void mailslot_queue_async( struct fd *fd, void *apc, void *user,
} }
if (mailslot->read_timeout != MAILSLOT_WAIT_FOREVER) if (mailslot->read_timeout != MAILSLOT_WAIT_FOREVER)
ptimeout = &mailslot->read_timeout; timeout = &mailslot->read_timeout;
if (!create_async( current, ptimeout, &mailslot->read_q, apc, user, iosb )) fd_queue_async_timeout( fd, apc, user, iosb, type, count, timeout );
return;
/* Check if the new pending request can be served immediately */
events = check_fd_events( fd, mailslot_get_poll_events( fd ) );
if (events)
{
mailslot_poll_event( fd, events );
return;
}
set_fd_events( fd, mailslot_get_poll_events( fd ));
}
static void mailslot_cancel_async( struct fd *fd )
{
struct mailslot *mailslot = get_fd_user( fd );
assert(mailslot->obj.ops == &mailslot_ops);
async_terminate_queue( &mailslot->read_q, STATUS_CANCELLED );
} }
static struct mailslot *create_mailslot( const WCHAR *name, size_t len, int max_msgsize, static struct mailslot *create_mailslot( const WCHAR *name, size_t len, int max_msgsize,
@ -288,7 +241,6 @@ static struct mailslot *create_mailslot( const WCHAR *name, size_t len, int max_
mailslot->max_msgsize = max_msgsize; mailslot->max_msgsize = max_msgsize;
mailslot->read_timeout = read_timeout; mailslot->read_timeout = read_timeout;
list_init( &mailslot->writers ); list_init( &mailslot->writers );
list_init( &mailslot->read_q );
if (!socketpair( PF_UNIX, SOCK_DGRAM, 0, fds )) if (!socketpair( PF_UNIX, SOCK_DGRAM, 0, fds ))
{ {