Jacek Caban : server: Create async object in register_async handler.
Alexandre Julliard
julliard at winehq.org
Tue Feb 21 16:56:13 CST 2017
Module: wine
Branch: master
Commit: a604db12612afccd789e4c09884c3c35dc8f1562
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a604db12612afccd789e4c09884c3c35dc8f1562
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Feb 15 22:12:45 2017 +0100
server: Create async object in register_async handler.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
server/fd.c | 15 +++++++++------
server/file.h | 6 +++---
server/mailslot.c | 7 +++----
server/serial.c | 7 +++----
server/sock.c | 8 ++------
5 files changed, 20 insertions(+), 23 deletions(-)
diff --git a/server/fd.c b/server/fd.c
index 202bd56..4aa1b1d 100644
--- a/server/fd.c
+++ b/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 );
}
-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 );
}
-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, data, NULL, type )))
+ if ((async = fd_queue_async( fd, async_get_data( async ), NULL, type )))
{
release_object( async );
set_error( STATUS_PENDING );
@@ -2509,6 +2507,7 @@ DECL_HANDLER(ioctl)
DECL_HANDLER(register_async)
{
unsigned int access;
+ struct async *async;
struct fd *fd;
switch(req->type)
@@ -2526,7 +2525,11 @@ DECL_HANDLER(register_async)
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 );
}
}
diff --git a/server/file.h b/server/file.h
index 3605053..98a1e84 100644
--- a/server/file.h
+++ b/server/file.h
@@ -60,7 +60,7 @@ struct fd_ops
/* perform an ioctl on the file */
obj_handle_t (*ioctl)(struct fd *fd, ioctl_code_t code, const async_data_t *async, int blocking );
/* 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 */
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_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 default_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, struct async *async, int type, int count );
extern void default_fd_reselect_async( struct fd *fd, struct async_queue *queue );
extern void main_loop(void);
extern void remove_process_locks( struct process *process );
diff --git a/server/mailslot.c b/server/mailslot.c
index 783b28b..20bf99c 100644
--- a/server/mailslot.c
+++ b/server/mailslot.c
@@ -94,7 +94,7 @@ static const struct object_ops mailslot_ops =
};
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 =
{
@@ -325,14 +325,13 @@ static struct object *mailslot_open_file( struct object *obj, unsigned int acces
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 async *async;
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,
STATUS_IO_TIMEOUT );
diff --git a/server/serial.c b/server/serial.c
index 6f9cc24..58170cd 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -61,7 +61,7 @@ static struct fd *serial_get_fd( struct object *obj );
static void serial_destroy(struct object *obj);
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 );
struct serial
@@ -183,11 +183,10 @@ static enum server_fd_type serial_get_fd_type( struct fd *fd )
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 );
timeout_t timeout = 0;
- struct async *async;
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;
}
- 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 );
release_object( async );
diff --git a/server/sock.c b/server/sock.c
index e9369e5..c997bf3 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -130,7 +130,7 @@ static int sock_get_poll_events( struct fd *fd );
static void sock_poll_event( struct fd *fd, int event );
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 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 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 async *async;
struct async_queue *queue;
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;
}
- if (!(async = create_async( current, data, NULL ))) return;
queue_async( queue, async );
- release_object( async );
-
sock_reselect( sock );
set_error( STATUS_PENDING );
More information about the wine-cvs
mailing list