Jacek Caban : server: Store named pipe fd in pipe_end throughout its whole life time.

Alexandre Julliard julliard at winehq.org
Mon Oct 9 14:28:41 CDT 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Oct  9 14:28:46 2017 +0200

server: Store named pipe fd in pipe_end throughout its whole life time.

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

---

 server/named_pipe.c | 63 ++++++++++++-----------------------------------------
 1 file changed, 14 insertions(+), 49 deletions(-)

diff --git a/server/named_pipe.c b/server/named_pipe.c
index b5738ad..5796089 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -75,7 +75,6 @@ struct pipe_end
 struct pipe_server
 {
     struct pipe_end      pipe_end;   /* common header for pipe_client and pipe_server */
-    struct fd           *ioctl_fd;   /* file descriptor for ioctls when not connected */
     struct list          entry;      /* entry in named pipe servers list */
     enum pipe_state      state;      /* server state */
     struct pipe_client  *client;     /* client that this server is connected to */
@@ -142,6 +141,7 @@ static const struct object_ops named_pipe_ops =
 
 /* common server and client pipe end functions */
 static enum server_fd_type pipe_end_get_fd_type( struct fd *fd );
+static struct fd *pipe_end_get_fd( struct object *obj );
 static int pipe_end_read( struct fd *fd, struct async *async, file_pos_t pos );
 static int pipe_end_write( struct fd *fd, struct async *async_data, file_pos_t pos );
 static int pipe_end_flush( struct fd *fd, struct async *async );
@@ -150,7 +150,6 @@ static void pipe_end_reselect_async( struct fd *fd, struct async_queue *queue );
 
 /* server end functions */
 static void pipe_server_dump( struct object *obj, int verbose );
-static struct fd *pipe_server_get_fd( struct object *obj );
 static void pipe_server_destroy( struct object *obj);
 static int pipe_server_ioctl( struct fd *fd, ioctl_code_t code, struct async *async );
 
@@ -164,7 +163,7 @@ static const struct object_ops pipe_server_ops =
     default_fd_signaled,          /* signaled */
     no_satisfied,                 /* satisfied */
     no_signal,                    /* signal */
-    pipe_server_get_fd,           /* get_fd */
+    pipe_end_get_fd,              /* get_fd */
     default_fd_map_access,        /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
@@ -193,7 +192,6 @@ static const struct fd_ops pipe_server_fd_ops =
 /* client end functions */
 static void pipe_client_dump( struct object *obj, int verbose );
 static int pipe_client_signaled( struct object *obj, struct wait_queue_entry *entry );
-static struct fd *pipe_client_get_fd( struct object *obj );
 static void pipe_client_destroy( struct object *obj );
 static int pipe_client_ioctl( struct fd *fd, ioctl_code_t code, struct async *async );
 
@@ -207,7 +205,7 @@ static const struct object_ops pipe_client_ops =
     pipe_client_signaled,         /* signaled */
     no_satisfied,                 /* satisfied */
     no_signal,                    /* signal */
-    pipe_client_get_fd,           /* get_fd */
+    pipe_end_get_fd,              /* get_fd */
     default_fd_map_access,        /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
@@ -324,13 +322,10 @@ static void named_pipe_destroy( struct object *obj)
     free_async_queue( &pipe->waiters );
 }
 
-static struct fd *pipe_client_get_fd( struct object *obj )
+static struct fd *pipe_end_get_fd( struct object *obj )
 {
-    struct pipe_client *client = (struct pipe_client *) obj;
-    if (client->pipe_end.fd)
-        return (struct fd *) grab_object( client->pipe_end.fd );
-    set_error( STATUS_PIPE_DISCONNECTED );
-    return NULL;
+    struct pipe_end *pipe_end = (struct pipe_end *) obj;
+    return (struct fd *) grab_object( pipe_end->fd );
 }
 
 static void set_server_state( struct pipe_server *server, enum pipe_state state )
@@ -341,27 +336,17 @@ static void set_server_state( struct pipe_server *server, enum pipe_state state
     {
     case ps_connected_server:
     case ps_wait_disconnect:
-        assert( server->pipe_end.fd );
         break;
     case ps_wait_open:
     case ps_idle_server:
-        assert( !server->pipe_end.fd );
-        set_no_fd_status( server->ioctl_fd, STATUS_PIPE_LISTENING );
+        set_no_fd_status( server->pipe_end.fd, STATUS_PIPE_LISTENING );
         break;
     case ps_wait_connect:
-        assert( !server->pipe_end.fd );
-        set_no_fd_status( server->ioctl_fd, STATUS_PIPE_DISCONNECTED );
+        set_no_fd_status( server->pipe_end.fd, STATUS_PIPE_DISCONNECTED );
         break;
     }
 }
 
-static struct fd *pipe_server_get_fd( struct object *obj )
-{
-    struct pipe_server *server = (struct pipe_server *) obj;
-
-    return (struct fd *)grab_object( server->pipe_end.fd ? server->pipe_end.fd : server->ioctl_fd );
-}
-
 
 static void wake_message( struct pipe_message *message )
 {
@@ -411,19 +396,6 @@ static void pipe_end_disconnect( struct pipe_end *pipe_end, unsigned int status
     }
 }
 
-static void do_disconnect( struct pipe_server *server )
-{
-    /* we may only have a server fd, if the client disconnected */
-    if (server->client)
-    {
-        assert( server->client->server == server );
-        assert( server->client->pipe_end.fd );
-    }
-    assert( server->pipe_end.fd );
-    release_object( server->pipe_end.fd );
-    server->pipe_end.fd = NULL;
-}
-
 static void pipe_end_destroy( struct pipe_end *pipe_end )
 {
     struct pipe_message *message;
@@ -437,6 +409,7 @@ static void pipe_end_destroy( struct pipe_end *pipe_end )
 
     free_async_queue( &pipe_end->read_q );
     free_async_queue( &pipe_end->write_q );
+    if (pipe_end->fd) release_object( pipe_end->fd );
 }
 
 static void pipe_server_destroy( struct object *obj)
@@ -447,8 +420,6 @@ static void pipe_server_destroy( struct object *obj)
 
     pipe_end_disconnect( &server->pipe_end, STATUS_PIPE_BROKEN );
 
-    if (server->pipe_end.fd) do_disconnect( server );
-
     pipe_end_destroy( &server->pipe_end );
     if (server->client)
     {
@@ -459,7 +430,6 @@ static void pipe_server_destroy( struct object *obj)
     assert( server->pipe->instances );
     server->pipe->instances--;
 
-    if (server->ioctl_fd) release_object( server->ioctl_fd );
     list_remove( &server->entry );
     release_object( server->pipe );
 }
@@ -494,7 +464,6 @@ static void pipe_client_destroy( struct object *obj)
     }
 
     pipe_end_destroy( &client->pipe_end );
-    if (client->pipe_end.fd) release_object( client->pipe_end.fd );
 }
 
 static void named_pipe_device_dump( struct object *obj, int verbose )
@@ -849,7 +818,7 @@ static int pipe_server_ioctl( struct fd *fd, ioctl_code_t code, struct async *as
         {
         case ps_idle_server:
         case ps_wait_connect:
-            fd_queue_async( server->ioctl_fd, async, ASYNC_TYPE_WAIT );
+            fd_queue_async( server->pipe_end.fd, async, ASYNC_TYPE_WAIT );
             set_server_state( server, ps_wait_open );
             async_wake_up( &server->pipe->waiters, STATUS_SUCCESS );
             set_error( STATUS_PENDING );
@@ -871,11 +840,9 @@ static int pipe_server_ioctl( struct fd *fd, ioctl_code_t code, struct async *as
         {
         case ps_connected_server:
             assert( server->client );
-            assert( server->client->pipe_end.fd );
 
             /* dump the client and server fds - client loses all waiting data */
             pipe_end_disconnect( &server->pipe_end, STATUS_PIPE_DISCONNECTED );
-            do_disconnect( server );
             server->client->server = NULL;
             server->client = NULL;
             set_server_state( server, ps_wait_connect );
@@ -883,7 +850,6 @@ static int pipe_server_ioctl( struct fd *fd, ioctl_code_t code, struct async *as
         case ps_wait_disconnect:
             assert( !server->client );
             pipe_end_disconnect( &server->pipe_end, STATUS_PIPE_DISCONNECTED );
-            do_disconnect( server );
             set_server_state( server, ps_wait_connect );
             break;
         case ps_idle_server:
@@ -953,12 +919,12 @@ static struct pipe_server *create_pipe_server( struct named_pipe *pipe, unsigned
 
     list_add_head( &pipe->servers, &server->entry );
     grab_object( pipe );
-    if (!(server->ioctl_fd = alloc_pseudo_fd( &pipe_server_fd_ops, &server->pipe_end.obj, options )))
+    if (!(server->pipe_end.fd = alloc_pseudo_fd( &pipe_server_fd_ops, &server->pipe_end.obj, options )))
     {
         release_object( server );
         return NULL;
     }
-    set_fd_signaled( server->ioctl_fd, 1 );
+    set_fd_signaled( server->pipe_end.fd, 1 );
     set_server_state( server, ps_idle_server );
     return server;
 }
@@ -1048,11 +1014,10 @@ static struct object *named_pipe_open_file( struct object *obj, unsigned int acc
 
     if ((client = create_pipe_client( options, pipe->flags, pipe->outsize, options )))
     {
-        server->pipe_end.fd = (struct fd *)grab_object( server->ioctl_fd );
-        set_no_fd_status( server->ioctl_fd, STATUS_BAD_DEVICE_TYPE );
+        set_no_fd_status( server->pipe_end.fd, STATUS_BAD_DEVICE_TYPE );
         allow_fd_caching( server->pipe_end.fd );
         if (server->state == ps_wait_open)
-            fd_async_wake_up( server->ioctl_fd, ASYNC_TYPE_WAIT, STATUS_SUCCESS );
+            fd_async_wake_up( server->pipe_end.fd, ASYNC_TYPE_WAIT, STATUS_SUCCESS );
         set_server_state( server, ps_connected_server );
         server->client = client;
         client->server = server;




More information about the wine-cvs mailing list