From f7dc097f8231e9e6e72f1c0f8e1cfc6c454c5031 Mon Sep 17 00:00:00 2001 From: Roger Light Date: Thu, 22 Nov 2018 17:31:17 +0000 Subject: [PATCH] Move client disconnect code to own function. --- lib/connect.c | 39 +++++++++++++++++++++++++++++++++++++++ lib/mosquitto_internal.h | 2 ++ lib/packet_mosq.c | 37 +------------------------------------ 3 files changed, 42 insertions(+), 36 deletions(-) diff --git a/lib/connect.c b/lib/connect.c index 016bc73d..6035f582 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -233,3 +233,42 @@ int mosquitto_disconnect_with_properties(struct mosquitto *mosq, int reason_code return send__disconnect(mosq, reason_code, properties); } + +void do_client_disconnect(struct mosquitto *mosq, int reason_code) +{ + pthread_mutex_lock(&mosq->state_mutex); + mosq->state = mosq_cs_disconnecting; + pthread_mutex_unlock(&mosq->state_mutex); + + net__socket_close(mosq); + + /* Free data and reset values */ + pthread_mutex_lock(&mosq->out_packet_mutex); + mosq->current_out_packet = mosq->out_packet; + if(mosq->out_packet){ + mosq->out_packet = mosq->out_packet->next; + if(!mosq->out_packet){ + mosq->out_packet_last = NULL; + } + } + pthread_mutex_unlock(&mosq->out_packet_mutex); + + pthread_mutex_lock(&mosq->msgtime_mutex); + mosq->next_msg_out = mosquitto_time() + mosq->keepalive; + pthread_mutex_unlock(&mosq->msgtime_mutex); + + pthread_mutex_lock(&mosq->callback_mutex); + if(mosq->on_disconnect){ + mosq->in_callback = true; + mosq->on_disconnect(mosq, mosq->userdata, reason_code); + mosq->in_callback = false; + } + if(mosq->on_disconnect_v5){ + mosq->in_callback = true; + mosq->on_disconnect_v5(mosq, mosq->userdata, reason_code, NULL); + mosq->in_callback = false; + } + pthread_mutex_unlock(&mosq->callback_mutex); + pthread_mutex_unlock(&mosq->current_out_packet_mutex); +} + diff --git a/lib/mosquitto_internal.h b/lib/mosquitto_internal.h index acc1d21e..f1a64e2d 100644 --- a/lib/mosquitto_internal.h +++ b/lib/mosquitto_internal.h @@ -296,5 +296,7 @@ struct mosquitto { #define STREMPTY(str) (str[0] == '\0') +void do_client_disconnect(struct mosquitto *mosq, int reason_code); + #endif diff --git a/lib/packet_mosq.c b/lib/packet_mosq.c index ce61cb50..c7a332f0 100644 --- a/lib/packet_mosq.c +++ b/lib/packet_mosq.c @@ -225,44 +225,9 @@ int packet__write(struct mosquitto *mosq) } pthread_mutex_unlock(&mosq->callback_mutex); }else if(((packet->command)&0xF0) == CMD_DISCONNECT){ - /* FIXME what cleanup needs doing here? - * incoming/outgoing messages? */ - net__socket_close(mosq); - - /* Start of duplicate, possibly unnecessary code. - * This does leave things in a consistent state at least. */ - /* Free data and reset values */ - pthread_mutex_lock(&mosq->out_packet_mutex); - mosq->current_out_packet = mosq->out_packet; - if(mosq->out_packet){ - mosq->out_packet = mosq->out_packet->next; - if(!mosq->out_packet){ - mosq->out_packet_last = NULL; - } - } - pthread_mutex_unlock(&mosq->out_packet_mutex); - + do_client_disconnect(mosq, MOSQ_ERR_SUCCESS); packet__cleanup(packet); mosquitto__free(packet); - - pthread_mutex_lock(&mosq->msgtime_mutex); - mosq->next_msg_out = mosquitto_time() + mosq->keepalive; - pthread_mutex_unlock(&mosq->msgtime_mutex); - /* End of duplicate, possibly unnecessary code */ - - pthread_mutex_lock(&mosq->callback_mutex); - if(mosq->on_disconnect){ - mosq->in_callback = true; - mosq->on_disconnect(mosq, mosq->userdata, MOSQ_ERR_SUCCESS); - mosq->in_callback = false; - } - if(mosq->on_disconnect_v5){ - mosq->in_callback = true; - mosq->on_disconnect_v5(mosq, mosq->userdata, MOSQ_ERR_SUCCESS, NULL); - mosq->in_callback = false; - } - pthread_mutex_unlock(&mosq->callback_mutex); - pthread_mutex_unlock(&mosq->current_out_packet_mutex); return MOSQ_ERR_SUCCESS; #endif }