mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-03 01:12:51 +00:00
Make mailslots use as much of the default async fd implementation as
possible.
This commit is contained in:
parent
9ad5628639
commit
37773dda84
11
server/fd.c
11
server/fd.c
|
@ -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 );
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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 ))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue