int MQTTClient_disconnect1(MQTTClient handle, int timeout, int internal, int stop) { MQTTClients* m = handle; START_TIME_TYPE start; int rc = MQTTCLIENT_SUCCESS; int was_connected = 0; FUNC_ENTRY; Thread_lock_mutex(mqttclient_mutex); if (m == NULL || m->c == NULL) { rc = MQTTCLIENT_FAILURE; goto exit; } if (m->c->connected == 0 && m->c->connect_state == 0) { rc = MQTTCLIENT_DISCONNECTED; goto exit; } was_connected = m->c->connected; /* should be 1 */ if (m->c->connected != 0) { start = MQTTClient_start_clock(); m->c->connect_state = -2; /* indicate disconnecting */ while (m->c->inboundMsgs->count > 0 || m->c->outboundMsgs->count > 0) { /* wait for all inflight message flows to finish, up to timeout */ if (MQTTClient_elapsed(start) >= timeout) break; Thread_unlock_mutex(mqttclient_mutex); MQTTClient_yield(); Thread_lock_mutex(mqttclient_mutex); } } MQTTClient_closeSession(m->c); while (Thread_check_sem(m->connect_sem)) Thread_wait_sem(m->connect_sem, 100); while (Thread_check_sem(m->connack_sem)) Thread_wait_sem(m->connack_sem, 100); while (Thread_check_sem(m->suback_sem)) Thread_wait_sem(m->suback_sem, 100); while (Thread_check_sem(m->unsuback_sem)) Thread_wait_sem(m->unsuback_sem, 100); exit: if (stop) MQTTClient_stop(); if (internal && m->cl && was_connected) { Log(TRACE_MIN, -1, "Calling connectionLost for client %s", m->c->clientID); Thread_start(connectionLost_call, m); } Thread_unlock_mutex(mqttclient_mutex); FUNC_EXIT_RC(rc); return rc; }
void MQTTClient_terminate(void) { FUNC_ENTRY; MQTTClient_stop(); if (initialized) { ListFree(bstate->clients); ListFree(handles); handles = NULL; Socket_outTerminate(); #if defined(HEAP_H) Heap_terminate(); #endif Log_terminate(); initialized = 0; } FUNC_EXIT; }