Jacek Caban : server: Introduce async_is_blocking helper and use it in sock_ioctl.

Alexandre Julliard julliard at winehq.org
Wed Apr 12 15:02:34 CDT 2017


Module: wine
Branch: master
Commit: 5c8d11270d18eaa3bb11dc7cae3f0006df0d7171
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5c8d11270d18eaa3bb11dc7cae3f0006df0d7171

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Apr 12 13:53:41 2017 +0200

server: Introduce async_is_blocking helper and use it in sock_ioctl.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 server/async.c | 5 +++++
 server/file.h  | 1 +
 server/sock.c  | 4 ++--
 3 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/server/async.c b/server/async.c
index 7323047..f9d8af3 100644
--- a/server/async.c
+++ b/server/async.c
@@ -472,6 +472,11 @@ struct iosb *async_get_iosb( struct async *async )
     return async->iosb ? (struct iosb *)grab_object( async->iosb ) : NULL;
 }
 
+int async_is_blocking( struct async *async )
+{
+    return !async->event && !async->data.apc && !async->data.apc_context;
+}
+
 /* find the first pending async in queue */
 struct async *find_pending_async( struct async_queue *queue )
 {
diff --git a/server/file.h b/server/file.h
index 94cc37f..5bb935c 100644
--- a/server/file.h
+++ b/server/file.h
@@ -187,6 +187,7 @@ extern struct completion *fd_get_completion( struct fd *fd, apc_param_t *p_key )
 extern void fd_copy_completion( struct fd *src, struct fd *dst );
 extern struct iosb *create_iosb( const void *in_data, data_size_t in_size, data_size_t out_size );
 extern struct iosb *async_get_iosb( struct async *async );
+extern int async_is_blocking( struct async *async );
 extern struct async *find_pending_async( struct async_queue *queue );
 extern void cancel_process_asyncs( struct process *process );
 
diff --git a/server/sock.c b/server/sock.c
index 59ab427..fde38c8 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -545,14 +545,14 @@ obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async,
     switch(code)
     {
     case WS_SIO_ADDRESS_LIST_CHANGE:
-        if ((sock->state & FD_WINE_NONBLOCKING) && blocking)
+        if ((sock->state & FD_WINE_NONBLOCKING) && async_is_blocking( async ))
         {
             set_error( STATUS_CANT_WAIT );
             return 0;
         }
         if (!(ifchange_q = sock_get_ifchange_q( sock ))) return 0;
         queue_async( ifchange_q, async );
-        if (blocking) wait_handle = alloc_handle( current->process, async, SYNCHRONIZE, 0 );
+        if (async_is_blocking( async )) wait_handle = alloc_handle( current->process, async, SYNCHRONIZE, 0 );
         set_error( STATUS_PENDING );
         return wait_handle;
     default:




More information about the wine-cvs mailing list