|
|
|
@ -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
|
|
|
|
|
}
|
|
|
|
|