Jacek Caban : server: Store connected pipe_end in pipe_end struct.

Alexandre Julliard julliard at winehq.org
Mon Mar 20 17:16:47 CDT 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Mar 15 23:25:25 2017 +0100

server: Store connected pipe_end in pipe_end struct.

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

---

 server/named_pipe.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/server/named_pipe.c b/server/named_pipe.c
index 6861e0f..55febd7 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -70,6 +70,7 @@ struct pipe_end
     struct object        obj;        /* object header */
     struct fd           *fd;         /* pipe file descriptor */
     unsigned int         flags;      /* pipe flags */
+    struct pipe_end     *connection; /* the other end of the pipe */
 };
 
 struct pipe_server
@@ -368,6 +369,19 @@ static void notify_empty( struct pipe_server *server )
     fd_async_wake_up( server->pipe_end.fd, ASYNC_TYPE_WAIT, STATUS_SUCCESS );
 }
 
+static void pipe_end_disconnect( struct pipe_end *pipe_end, unsigned int status )
+{
+    struct pipe_end *connection = pipe_end->connection;
+
+    pipe_end->connection = NULL;
+
+    if (connection)
+    {
+        connection->connection = NULL;
+        pipe_end_disconnect( connection, status );
+    }
+}
+
 static void do_disconnect( struct pipe_server *server )
 {
     /* we may only have a server fd, if the client disconnected */
@@ -390,6 +404,8 @@ static void pipe_server_destroy( struct object *obj)
 
     assert( obj->ops == &pipe_server_ops );
 
+    pipe_end_disconnect( &server->pipe_end, STATUS_PIPE_BROKEN );
+
     if (server->pipe_end.fd)
     {
         notify_empty( server );
@@ -417,6 +433,8 @@ static void pipe_client_destroy( struct object *obj)
 
     assert( obj->ops == &pipe_client_ops );
 
+    pipe_end_disconnect( &client->pipe_end, STATUS_PIPE_BROKEN );
+
     if (server)
     {
         notify_empty( server );
@@ -641,6 +659,7 @@ static obj_handle_t pipe_server_ioctl( struct fd *fd, ioctl_code_t code, struct
             notify_empty( server );
 
             /* 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;
@@ -648,6 +667,7 @@ static obj_handle_t pipe_server_ioctl( struct fd *fd, ioctl_code_t code, struct
             break;
         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;
@@ -678,6 +698,7 @@ static void init_pipe_end( struct pipe_end *pipe_end, unsigned int pipe_flags )
 {
     pipe_end->fd = NULL;
     pipe_end->flags = pipe_flags;
+    pipe_end->connection = NULL;
 }
 
 static struct pipe_server *create_pipe_server( struct named_pipe *pipe, unsigned int options,
@@ -829,6 +850,11 @@ static struct object *named_pipe_open_file( struct object *obj, unsigned int acc
             release_object( client );
             client = NULL;
         }
+        if (client)
+        {
+            server->pipe_end.connection = &client->pipe_end;
+            client->pipe_end.connection = &server->pipe_end;
+        }
     }
     release_object( server );
     return &client->pipe_end.obj;




More information about the wine-cvs mailing list