[PATCH 4/4] winhttp: Stop the send queue before sending the close message.

Hans Leidekker hans at codeweavers.com
Mon Jun 29 08:46:13 CDT 2020


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/winhttp/request.c         | 14 ++++++++++++--
 dlls/winhttp/session.c         |  2 +-
 dlls/winhttp/winhttp_private.h |  1 +
 3 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index 7cb07b5c10..e31803ccfe 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -138,6 +138,14 @@ static DWORD start_queue( struct queue *queue )
     return ERROR_SUCCESS;
 }
 
+void stop_queue( struct queue *queue )
+{
+    if (!queue->pool) return;
+    CloseThreadpool( queue->pool );
+    queue->pool = NULL;
+    TRACE("stopped %p\n", queue);
+}
+
 static DWORD queue_task( struct queue *queue, PTP_WORK_CALLBACK task, void *ctx )
 {
     TP_WORK *work;
@@ -3037,8 +3045,8 @@ static void socket_destroy( struct object_header *hdr )
 
     TRACE("%p\n", socket);
 
-    if (socket->send_q.pool) CloseThreadpool( socket->send_q.pool );
-    if (socket->recv_q.pool) CloseThreadpool( socket->recv_q.pool );
+    stop_queue( &socket->send_q );
+    stop_queue( &socket->recv_q );
 
     release_object( &socket->request->hdr );
     heap_free( socket );
@@ -3526,6 +3534,7 @@ static DWORD socket_shutdown( struct socket *socket, USHORT status, const void *
     struct netconn *netconn = socket->request->netconn;
     DWORD ret;
 
+    stop_queue( &socket->send_q );
     if (!(ret = send_frame( netconn, SOCKET_OPCODE_CLOSE, status, reason, len, TRUE )))
     {
         socket->state = SOCKET_STATE_SHUTDOWN;
@@ -3609,6 +3618,7 @@ static DWORD socket_close( struct socket *socket, USHORT status, const void *rea
 
     if (socket->state < SOCKET_STATE_SHUTDOWN)
     {
+        stop_queue( &socket->send_q );
         if ((ret = send_frame( netconn, SOCKET_OPCODE_CLOSE, status, reason, len, TRUE ))) goto done;
         socket->state = SOCKET_STATE_SHUTDOWN;
     }
diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c
index f3ab8c9b95..080837eb1e 100644
--- a/dlls/winhttp/session.c
+++ b/dlls/winhttp/session.c
@@ -578,7 +578,7 @@ static void request_destroy( struct object_header *hdr )
 
     TRACE("%p\n", request);
 
-    if (request->queue.pool) CloseThreadpool( request->queue.pool );
+    stop_queue( &request->queue );
     release_object( &request->connect->hdr );
 
     if (request->cred_handle_initialized) FreeCredentialsHandle( &request->cred_handle );
diff --git a/dlls/winhttp/winhttp_private.h b/dlls/winhttp/winhttp_private.h
index 9d0b9c308a..23aba00780 100644
--- a/dlls/winhttp/winhttp_private.h
+++ b/dlls/winhttp/winhttp_private.h
@@ -317,6 +317,7 @@ BOOL free_handle( HINTERNET ) DECLSPEC_HIDDEN;
 
 void send_callback( struct object_header *, DWORD, LPVOID, DWORD ) DECLSPEC_HIDDEN;
 void close_connection( struct request * ) DECLSPEC_HIDDEN;
+void stop_queue( struct queue * ) DECLSPEC_HIDDEN;
 
 void netconn_close( struct netconn * ) DECLSPEC_HIDDEN;
 DWORD netconn_create( struct hostdata *, const struct sockaddr_storage *, int, struct netconn ** ) DECLSPEC_HIDDEN;
-- 
2.20.1




More information about the wine-devel mailing list