forked from Mirrors/wine-wine
server: Create async object in register_async handler.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>oldstable
parent
8ef4f9a0c8
commit
a604db1261
15
server/fd.c
15
server/fd.c
|
@ -2091,16 +2091,14 @@ void fd_reselect_async( struct fd *fd, struct async_queue *queue )
|
||||||
fd->fd_ops->reselect_async( fd, queue );
|
fd->fd_ops->reselect_async( fd, queue );
|
||||||
}
|
}
|
||||||
|
|
||||||
void no_fd_queue_async( struct fd *fd, const async_data_t *data, int type, int count )
|
void no_fd_queue_async( struct fd *fd, struct async *async, int type, int count )
|
||||||
{
|
{
|
||||||
set_error( STATUS_OBJECT_TYPE_MISMATCH );
|
set_error( STATUS_OBJECT_TYPE_MISMATCH );
|
||||||
}
|
}
|
||||||
|
|
||||||
void default_fd_queue_async( struct fd *fd, const async_data_t *data, int type, int count )
|
void default_fd_queue_async( struct fd *fd, struct async *async, int type, int count )
|
||||||
{
|
{
|
||||||
struct async *async;
|
if ((async = fd_queue_async( fd, async_get_data( async ), NULL, type )))
|
||||||
|
|
||||||
if ((async = fd_queue_async( fd, data, NULL, type )))
|
|
||||||
{
|
{
|
||||||
release_object( async );
|
release_object( async );
|
||||||
set_error( STATUS_PENDING );
|
set_error( STATUS_PENDING );
|
||||||
|
@ -2509,6 +2507,7 @@ DECL_HANDLER(ioctl)
|
||||||
DECL_HANDLER(register_async)
|
DECL_HANDLER(register_async)
|
||||||
{
|
{
|
||||||
unsigned int access;
|
unsigned int access;
|
||||||
|
struct async *async;
|
||||||
struct fd *fd;
|
struct fd *fd;
|
||||||
|
|
||||||
switch(req->type)
|
switch(req->type)
|
||||||
|
@ -2526,7 +2525,11 @@ DECL_HANDLER(register_async)
|
||||||
|
|
||||||
if ((fd = get_handle_fd_obj( current->process, req->async.handle, access )))
|
if ((fd = get_handle_fd_obj( current->process, req->async.handle, access )))
|
||||||
{
|
{
|
||||||
if (get_unix_fd( fd ) != -1) fd->fd_ops->queue_async( fd, &req->async, req->type, req->count );
|
if (get_unix_fd( fd ) != -1 && (async = create_async( current, &req->async, NULL )))
|
||||||
|
{
|
||||||
|
fd->fd_ops->queue_async( fd, async, req->type, req->count );
|
||||||
|
release_object( async );
|
||||||
|
}
|
||||||
release_object( fd );
|
release_object( fd );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@ struct fd_ops
|
||||||
/* perform an ioctl on the file */
|
/* perform an ioctl on the file */
|
||||||
obj_handle_t (*ioctl)(struct fd *fd, ioctl_code_t code, const async_data_t *async, int blocking );
|
obj_handle_t (*ioctl)(struct fd *fd, ioctl_code_t code, const async_data_t *async, int blocking );
|
||||||
/* queue an async operation */
|
/* queue an async operation */
|
||||||
void (*queue_async)(struct fd *, const async_data_t *data, int type, int count);
|
void (*queue_async)(struct fd *, struct async *async, int type, int count);
|
||||||
/* selected events for async i/o need an update */
|
/* selected events for async i/o need an update */
|
||||||
void (*reselect_async)( struct fd *, struct async_queue *queue );
|
void (*reselect_async)( struct fd *, struct async_queue *queue );
|
||||||
};
|
};
|
||||||
|
@ -105,8 +105,8 @@ extern obj_handle_t no_fd_write( struct fd *fd, struct async *async, int blockin
|
||||||
extern obj_handle_t no_fd_flush( struct fd *fd, const async_data_t *async, int blocking );
|
extern obj_handle_t no_fd_flush( struct fd *fd, const async_data_t *async, int blocking );
|
||||||
extern obj_handle_t no_fd_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async, int blocking );
|
extern obj_handle_t no_fd_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async, int blocking );
|
||||||
extern obj_handle_t default_fd_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async, int blocking );
|
extern obj_handle_t default_fd_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async, int blocking );
|
||||||
extern void no_fd_queue_async( struct fd *fd, const async_data_t *data, int type, int count );
|
extern void no_fd_queue_async( struct fd *fd, struct async *async, int type, int count );
|
||||||
extern void default_fd_queue_async( struct fd *fd, const async_data_t *data, int type, int count );
|
extern void default_fd_queue_async( struct fd *fd, struct async *async, int type, int count );
|
||||||
extern void default_fd_reselect_async( struct fd *fd, struct async_queue *queue );
|
extern void default_fd_reselect_async( struct fd *fd, struct async_queue *queue );
|
||||||
extern void main_loop(void);
|
extern void main_loop(void);
|
||||||
extern void remove_process_locks( struct process *process );
|
extern void remove_process_locks( struct process *process );
|
||||||
|
|
|
@ -94,7 +94,7 @@ static const struct object_ops mailslot_ops =
|
||||||
};
|
};
|
||||||
|
|
||||||
static enum server_fd_type mailslot_get_fd_type( struct fd *fd );
|
static enum server_fd_type mailslot_get_fd_type( struct fd *fd );
|
||||||
static void mailslot_queue_async( struct fd *fd, const async_data_t *data, int type, int count );
|
static void mailslot_queue_async( struct fd *fd, struct async *async, int type, int count );
|
||||||
|
|
||||||
static const struct fd_ops mailslot_fd_ops =
|
static const struct fd_ops mailslot_fd_ops =
|
||||||
{
|
{
|
||||||
|
@ -325,14 +325,13 @@ static struct object *mailslot_open_file( struct object *obj, unsigned int acces
|
||||||
return &writer->obj;
|
return &writer->obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mailslot_queue_async( struct fd *fd, const async_data_t *data, int type, int count )
|
static void mailslot_queue_async( struct fd *fd, struct async *async, int type, int count )
|
||||||
{
|
{
|
||||||
struct mailslot *mailslot = get_fd_user( fd );
|
struct mailslot *mailslot = get_fd_user( fd );
|
||||||
struct async *async;
|
|
||||||
|
|
||||||
assert(mailslot->obj.ops == &mailslot_ops);
|
assert(mailslot->obj.ops == &mailslot_ops);
|
||||||
|
|
||||||
if ((async = fd_queue_async( fd, data, NULL, type )))
|
if ((async = fd_queue_async( fd, async_get_data( async ), NULL, type )))
|
||||||
{
|
{
|
||||||
async_set_timeout( async, mailslot->read_timeout ? mailslot->read_timeout : -1,
|
async_set_timeout( async, mailslot->read_timeout ? mailslot->read_timeout : -1,
|
||||||
STATUS_IO_TIMEOUT );
|
STATUS_IO_TIMEOUT );
|
||||||
|
|
|
@ -61,7 +61,7 @@ static struct fd *serial_get_fd( struct object *obj );
|
||||||
static void serial_destroy(struct object *obj);
|
static void serial_destroy(struct object *obj);
|
||||||
|
|
||||||
static enum server_fd_type serial_get_fd_type( struct fd *fd );
|
static enum server_fd_type serial_get_fd_type( struct fd *fd );
|
||||||
static void serial_queue_async( struct fd *fd, const async_data_t *data, int type, int count );
|
static void serial_queue_async( struct fd *fd, struct async *async, int type, int count );
|
||||||
static void serial_reselect_async( struct fd *fd, struct async_queue *queue );
|
static void serial_reselect_async( struct fd *fd, struct async_queue *queue );
|
||||||
|
|
||||||
struct serial
|
struct serial
|
||||||
|
@ -183,11 +183,10 @@ static enum server_fd_type serial_get_fd_type( struct fd *fd )
|
||||||
return FD_TYPE_SERIAL;
|
return FD_TYPE_SERIAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void serial_queue_async( struct fd *fd, const async_data_t *data, int type, int count )
|
static void serial_queue_async( struct fd *fd, struct async *async, int type, int count )
|
||||||
{
|
{
|
||||||
struct serial *serial = get_fd_user( fd );
|
struct serial *serial = get_fd_user( fd );
|
||||||
timeout_t timeout = 0;
|
timeout_t timeout = 0;
|
||||||
struct async *async;
|
|
||||||
|
|
||||||
assert(serial->obj.ops == &serial_ops);
|
assert(serial->obj.ops == &serial_ops);
|
||||||
|
|
||||||
|
@ -201,7 +200,7 @@ static void serial_queue_async( struct fd *fd, const async_data_t *data, int typ
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((async = fd_queue_async( fd, data, NULL, type )))
|
if ((async = fd_queue_async( fd, async_get_data( async ), NULL, type )))
|
||||||
{
|
{
|
||||||
if (timeout) async_set_timeout( async, timeout * -10000, STATUS_TIMEOUT );
|
if (timeout) async_set_timeout( async, timeout * -10000, STATUS_TIMEOUT );
|
||||||
release_object( async );
|
release_object( async );
|
||||||
|
|
|
@ -130,7 +130,7 @@ static int sock_get_poll_events( struct fd *fd );
|
||||||
static void sock_poll_event( struct fd *fd, int event );
|
static void sock_poll_event( struct fd *fd, int event );
|
||||||
static enum server_fd_type sock_get_fd_type( struct fd *fd );
|
static enum server_fd_type sock_get_fd_type( struct fd *fd );
|
||||||
static obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async, int blocking );
|
static obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async, int blocking );
|
||||||
static void sock_queue_async( struct fd *fd, const async_data_t *data, int type, int count );
|
static void sock_queue_async( struct fd *fd, struct async *async, int type, int count );
|
||||||
static void sock_reselect_async( struct fd *fd, struct async_queue *queue );
|
static void sock_reselect_async( struct fd *fd, struct async_queue *queue );
|
||||||
|
|
||||||
static int sock_get_ntstatus( int err );
|
static int sock_get_ntstatus( int err );
|
||||||
|
@ -564,10 +564,9 @@ obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sock_queue_async( struct fd *fd, const async_data_t *data, int type, int count )
|
static void sock_queue_async( struct fd *fd, struct async *async, int type, int count )
|
||||||
{
|
{
|
||||||
struct sock *sock = get_fd_user( fd );
|
struct sock *sock = get_fd_user( fd );
|
||||||
struct async *async;
|
|
||||||
struct async_queue *queue;
|
struct async_queue *queue;
|
||||||
|
|
||||||
assert( sock->obj.ops == &sock_ops );
|
assert( sock->obj.ops == &sock_ops );
|
||||||
|
@ -594,10 +593,7 @@ static void sock_queue_async( struct fd *fd, const async_data_t *data, int type,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(async = create_async( current, data, NULL ))) return;
|
|
||||||
queue_async( queue, async );
|
queue_async( queue, async );
|
||||||
release_object( async );
|
|
||||||
|
|
||||||
sock_reselect( sock );
|
sock_reselect( sock );
|
||||||
|
|
||||||
set_error( STATUS_PENDING );
|
set_error( STATUS_PENDING );
|
||||||
|
|
Loading…
Reference in New Issue