Zebediah Figura : server: Terminate accept asyncs when the last socket handle is closed.
Alexandre Julliard
julliard at winehq.org
Wed Feb 10 15:34:02 CST 2021
Module: wine
Branch: master
Commit: 27db283449479180bd3f6ba37d3f34f1cda4d03b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=27db283449479180bd3f6ba37d3f34f1cda4d03b
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Mon Feb 8 17:40:40 2021 -0600
server: Terminate accept asyncs when the last socket handle is closed.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
server/sock.c | 27 +++++++++++++++++++--------
1 file changed, 19 insertions(+), 8 deletions(-)
diff --git a/server/sock.c b/server/sock.c
index 4ec21fc73b3..6523418f779 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -165,6 +165,7 @@ struct sock
static void sock_dump( struct object *obj, int verbose );
static int sock_signaled( struct object *obj, struct wait_queue_entry *entry );
static struct fd *sock_get_fd( struct object *obj );
+static int sock_close_handle( struct object *obj, struct process *process, obj_handle_t handle );
static void sock_destroy( struct object *obj );
static struct object *sock_get_ifchange( struct sock *sock );
static void sock_release_ifchange( struct sock *sock );
@@ -201,7 +202,7 @@ static const struct object_ops sock_ops =
NULL, /* unlink_name */
no_open_file, /* open_file */
no_kernel_obj_list, /* get_kernel_obj_list */
- fd_close_handle, /* close_handle */
+ sock_close_handle, /* close_handle */
sock_destroy /* destroy */
};
@@ -885,11 +886,27 @@ static struct fd *sock_get_fd( struct object *obj )
return (struct fd *)grab_object( sock->fd );
}
-static void sock_destroy( struct object *obj )
+static int sock_close_handle( struct object *obj, struct process *process, obj_handle_t handle )
{
struct sock *sock = (struct sock *)obj;
struct accept_req *req, *next;
+ if (sock->obj.handle_count == 1) /* last handle */
+ {
+ if (sock->accept_recv_req)
+ async_terminate( sock->accept_recv_req->async, STATUS_CANCELLED );
+
+ LIST_FOR_EACH_ENTRY_SAFE( req, next, &sock->accept_list, struct accept_req, entry )
+ async_terminate( req->async, STATUS_CANCELLED );
+ }
+
+ return fd_close_handle( obj, process, handle );
+}
+
+static void sock_destroy( struct object *obj )
+{
+ struct sock *sock = (struct sock *)obj;
+
assert( obj->ops == &sock_ops );
/* FIXME: special socket shutdown stuff? */
@@ -897,12 +914,6 @@ static void sock_destroy( struct object *obj )
if ( sock->deferred )
release_object( sock->deferred );
- if (sock->accept_recv_req)
- async_terminate( sock->accept_recv_req->async, STATUS_CANCELLED );
-
- LIST_FOR_EACH_ENTRY_SAFE( req, next, &sock->accept_list, struct accept_req, entry )
- async_terminate( req->async, STATUS_CANCELLED );
-
async_wake_up( &sock->ifchange_q, STATUS_CANCELLED );
sock_release_ifchange( sock );
free_async_queue( &sock->read_q );
More information about the wine-cvs
mailing list