int test(int limit) { int i, *ip, *todelete; Node* current = NULL; Tree* t = TreeInitialize(TreeIntCompare); int rc = 0; printf("Tree initialized\n"); srand(time(NULL)); ip = malloc(sizeof(int)); *ip = 2; TreeAdd(t, (void*)ip, sizeof(int)); check(t); i = 2; void* result = TreeRemove(t, (void*)&i); if (result) free(result); int actual[limit]; for (i = 0; i < limit; i++) { void* replaced = NULL; ip = malloc(sizeof(int)); *ip = rand(); replaced = TreeAdd(t, (void*)ip, sizeof(int)); if (replaced) /* duplicate */ { free(replaced); actual[i] = -1; } else actual[i] = *ip; if (i==5) todelete = ip; printf("Tree element added %d\n", *ip); if (1 % 1000 == 0) { rc = check(t); printf("%d elements, check result %d\n", i+1, rc); if (rc != 0) return 88; } } check(t); for (i = 0; i < limit; i++) { int parm = actual[i]; if (parm == -1) continue; Node* found = TreeFind(t, (void*)&parm); if (found) printf("Tree find %d %d\n", parm, *(int*)(found->content)); else { printf("%d not found\n", parm); traverse(t, parm); return -2; } } check(t); for (i = limit -1; i >= 0; i--) { int parm = actual[i]; void *found; if (parm == -1) /* skip duplicate */ continue; found = TreeRemove(t, (void*)&parm); if (found) { printf("%d Tree remove %d %d\n", i, parm, *(int*)(found)); free(found); } else { int count = 0; printf("%d %d not found\n", i, parm); traverse(t, parm); for (i = 0; i < limit; i++) if (actual[i] == parm) ++count; printf("%d occurs %d times\n", parm, count); return -2; } if (i % 1000 == 0) { rc = check(t); printf("%d elements, check result %d\n", i+1, rc); if (rc != 0) return 88; } } printf("finished\n"); return 0; }
/** * Close any active session for a client and clean up. * @param client the client to clean up * @param send_will flag to indicate whether a will messsage should be sent if it has been set */ void MQTTProtocol_closeSession(Clients* client, int send_will) { FUNC_ENTRY; client->good = 0; if (in_MQTTPacket_Factory == client->socket || client->closing) goto exit; client->closing = 1; if (client->socket > 0) { if (client->connected) { if (client->outbound && client->will) { Publish pub; pub.payload = "0"; pub.payloadlen = 1; pub.topic = client->will->topic; #if defined(MQTTS) if (client->protocol == PROTOCOL_MQTTS) MQTTSProtocol_startPublishCommon(client, &pub, 0,0,1); if (client->protocol == PROTOCOL_MQTTS_DTLS) MQTTSProtocol_startPublishCommon(client, &pub, 0,0,1); //TODO LW else #endif MQTTPacket_send_publish(&pub, 0, 0, 1, client->socket, client->clientID); MQTTProtocol_sys_publish(client->will->topic, "0"); } #if defined(MQTTS) if (client->protocol == PROTOCOL_MQTTS_MULTICAST) ; else if (client->protocol == PROTOCOL_MQTTS) MQTTSPacket_send_disconnect(client, 0); else if (client->protocol == PROTOCOL_MQTTS_DTLS) MQTTSPacket_send_disconnect(client, 0); else #endif if (client->outbound) MQTTPacket_send_disconnect(client->socket, client->clientID); } if (ListFindItem(&(state.pending_writes), &(client->socket), intcompare)) { pending_write* pw = (pending_write*)(state.pending_writes.current->content); MQTTProtocol_removePublication(pw->p); ListRemove(&(state.pending_writes), pw); } #if defined(MQTTS) if (client->protocol == PROTOCOL_MQTT || client->outbound == 1) { if (client->protocol == PROTOCOL_MQTTS_MULTICAST) Socket_close_only(client->socket); else #endif Socket_close(client->socket); #if defined(MQTTS) } #endif } if (client->connected || client->connect_state) { client->connected = 0; client->connect_state = 0; } if (client->outbound == 0 && client->will != NULL && send_will) { Publish publish; publish.payload = client->will->msg; publish.payloadlen = strlen(client->will->msg); publish.topic = client->will->topic; publish.header.bits.qos = client->will->qos; publish.header.bits.retain = client->will->retained; Protocol_processPublication(&publish, client->clientID); } #if defined(MQTTS) if (client->protocol == PROTOCOL_MQTTS) MQTTSProtocol_emptyRegistrationList(client->registrations); else if (client->protocol == PROTOCOL_MQTTS_DTLS) MQTTSProtocol_emptyRegistrationList(client->registrations); #endif if (client->cleansession) { if (client->outbound && ((BridgeConnections*)(client->bridge_context))->state != CONNECTION_DELETE) { /* bridge outbound client structures are reused on reconnection */ int i; MQTTProtocol_removeAllSubscriptions(client->clientID); MQTTProtocol_emptyMessageList(client->inboundMsgs); MQTTProtocol_emptyMessageList(client->outboundMsgs); for (i = 0; i < PRIORITY_MAX; ++i) MQTTProtocol_emptyMessageList(client->queuedMsgs[i]); client->msgID = 0; } else { #if defined(MQTTS) if ((client->protocol == PROTOCOL_MQTTS && client->outbound == 0) || (client->protocol == PROTOCOL_MQTTS_DTLS && client->outbound == 0) || client->protocol == PROTOCOL_MQTTS_MULTICAST) { if (!TreeRemove(bstate->mqtts_clients, client) && !TreeRemove(bstate->disconnected_mqtts_clients, client)) Log(LOG_ERROR, 39, NULL); else Log(TRACE_MAX, 2, NULL, client->clientID, client->socket); } else { #endif if (!TreeRemove(bstate->clients, client) && !TreeRemove(bstate->disconnected_clients, client)) Log(LOG_ERROR, 39, NULL); else Log(TRACE_MAX, 2, NULL, client->clientID, client->socket); #if defined(MQTTS) } #endif MQTTProtocol_freeClient(client); } } else { int i; for (i = 0; i < PRIORITY_MAX; ++i) MQTTProtocol_removeQoS0Messages(client->queuedMsgs[i]); #if defined(MQTTS) if ((client->protocol == PROTOCOL_MQTTS && client->outbound == 0)||(client->protocol == PROTOCOL_MQTTS_DTLS && client->outbound == 0)) { if (TreeRemove(bstate->mqtts_clients, client)) { client->socket = 0; TreeAdd(bstate->disconnected_mqtts_clients, client, sizeof(Clients) + strlen(client->clientID)+1 + 3*sizeof(List)); } } else { #endif if (TreeRemove(bstate->clients, client)) { client->socket = 0; TreeAdd(bstate->disconnected_clients, client, sizeof(Clients) + strlen(client->clientID)+1 + 3*sizeof(List)); } #if defined(MQTTS) } #endif client->closing = 0; } exit: FUNC_EXIT; }