nodemcu-firmware/app/mqtt/msg_queue.c

86 lines
1.7 KiB
C
Raw Permalink Normal View History

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
2015-03-29 18:24:09 +02:00
#include "msg_queue.h"
#include "user_config.h"
2015-03-29 18:24:09 +02:00
msg_queue_t *msg_enqueue(msg_queue_t **head, mqtt_message_t *msg, uint16_t msg_id, int msg_type, int publish_qos){
if(!head){
return NULL;
}
if (!msg || !msg->data || msg->length == 0){
NODE_DBG("empty message\n");
return NULL;
}
msg_queue_t *node = (msg_queue_t *)calloc(1,sizeof(msg_queue_t));
2015-03-29 18:24:09 +02:00
if(!node){
NODE_DBG("not enough memory\n");
return NULL;
}
2019-02-17 19:26:29 +01:00
First round of MQTT fixes (#3360) * mqtt: remove concept of connection timeout Just rely on the network stack to tell us when things have gone south. * mqtt: remove write-only mqtt_state.port field * mqtt: drop useless conditional * mqtt: decouple message sent flag from timer * mqtt: reconnect callback does not need to hang up The network stack has certainly done that for us at this point. Similarly, since we're about to call mqtt_socket_disconnected, don't bother unregistering the timer here, either. * mqtt: don't tick once per second Set the timer for the duration of the wait and cancel it on the other side. * mqtt: defer message queue destruction to _disconnect We're going to want to publish a disconnect message for real, so doing this in _close does no one any favors * mqtt: miscellaneous cleanups No functional change intended * mqtt: close() should send disconnect message for real This means waiting for _sent() to fire again before telling the network stack to disconnect. * mqtt: tidy connect and dns - Push the self-ref to after all allocations and error returns - Don't try to extract IPv4 from the domain string ourselves, let the resolver, since it can - Don't try to connect to localhost. That can't possibly work. * mqtt: common up some callback invocations * mqtt: don't retransmit messages on timeout There's no point in retransmitting messages on timeout; the network stack will be trying to do it for us anyway. * mqtt: remove unnecessary NULL udata checks * mqtt: hold strings in Lua, not C Eliminates a host of C-side allocations. While here, move the rest of the mqtt_connect_info structure out to its own thing, and pack some flags using a bitfield. * mqtt: mqtt_socket_on use lua_checkoption * mqtt: slightly augment debug messages These changes have made some debugging ever so slightly easier.
2021-01-05 12:07:09 +01:00
node->sent = 0;
node->msg.data = (uint8_t *)calloc(1,msg->length);
2015-03-29 18:24:09 +02:00
if(!node->msg.data){
NODE_DBG("not enough memory\n");
free(node);
2015-03-29 18:24:09 +02:00
return NULL;
}
memcpy(node->msg.data, msg->data, msg->length);
2015-03-29 18:24:09 +02:00
node->msg.length = msg->length;
node->next = NULL;
node->msg_id = msg_id;
node->msg_type = msg_type;
node->publish_qos = publish_qos;
msg_queue_t *tail = *head;
if(tail){
while(tail->next!=NULL) tail = tail->next;
tail->next = node;
} else {
*head = node;
}
return node;
}
void msg_destroy(msg_queue_t *node){
if(!node) return;
if(node->msg.data){
free(node->msg.data);
2015-03-29 18:24:09 +02:00
node->msg.data = NULL;
}
free(node);
2015-03-29 18:24:09 +02:00
}
msg_queue_t * msg_dequeue(msg_queue_t **head){
if(!head || !*head){
return NULL;
}
msg_queue_t *node = *head; // fetch head.
*head = node->next; // update head.
node->next = NULL;
return node;
}
2015-03-31 17:38:28 +02:00
msg_queue_t * msg_peek(msg_queue_t **head){
if(!head || !*head){
return NULL;
}
return *head; // fetch head.
}
int msg_size(msg_queue_t **head){
if(!head || !*head){
return 0;
}
int i = 1;
msg_queue_t *tail = *head;
if(tail){
while(tail->next!=NULL){
tail = tail->next;
i++;
}
}
return i;
}