|
|
@ -26,6 +26,7 @@ Contributors:
|
|
|
|
#include "messages_mosq.h"
|
|
|
|
#include "messages_mosq.h"
|
|
|
|
#include "send_mosq.h"
|
|
|
|
#include "send_mosq.h"
|
|
|
|
#include "time_mosq.h"
|
|
|
|
#include "time_mosq.h"
|
|
|
|
|
|
|
|
#include "util_mosq.h"
|
|
|
|
|
|
|
|
|
|
|
|
void message__cleanup(struct mosquitto_message_all **message)
|
|
|
|
void message__cleanup(struct mosquitto_message_all **message)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -123,6 +124,7 @@ int message__queue(struct mosquitto *mosq, struct mosquitto_message_all *message
|
|
|
|
/* mosq->*_message_mutex should be locked before entering this function */
|
|
|
|
/* mosq->*_message_mutex should be locked before entering this function */
|
|
|
|
assert(mosq);
|
|
|
|
assert(mosq);
|
|
|
|
assert(message);
|
|
|
|
assert(message);
|
|
|
|
|
|
|
|
assert(message->msg.qos != 0);
|
|
|
|
|
|
|
|
|
|
|
|
if(dir == mosq_md_out){
|
|
|
|
if(dir == mosq_md_out){
|
|
|
|
mosq->out_queue_len++;
|
|
|
|
mosq->out_queue_len++;
|
|
|
@ -133,12 +135,10 @@ int message__queue(struct mosquitto *mosq, struct mosquitto_message_all *message
|
|
|
|
mosq->out_messages = message;
|
|
|
|
mosq->out_messages = message;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
mosq->out_messages_last = message;
|
|
|
|
mosq->out_messages_last = message;
|
|
|
|
if(message->msg.qos > 0){
|
|
|
|
if(mosq->send_quota > 0){
|
|
|
|
if(mosq->max_inflight_messages == 0 || mosq->inflight_messages < mosq->max_inflight_messages){
|
|
|
|
mosq->send_quota--;
|
|
|
|
mosq->inflight_messages++;
|
|
|
|
}else{
|
|
|
|
}else{
|
|
|
|
rc = 1;
|
|
|
|
rc = 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
}else{
|
|
|
|
mosq->in_queue_len++;
|
|
|
|
mosq->in_queue_len++;
|
|
|
@ -187,17 +187,15 @@ void message__reconnect_reset(struct mosquitto *mosq)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pthread_mutex_lock(&mosq->out_message_mutex);
|
|
|
|
pthread_mutex_lock(&mosq->out_message_mutex);
|
|
|
|
mosq->inflight_messages = 0;
|
|
|
|
mosq->send_quota = mosq->send_maximum;
|
|
|
|
message = mosq->out_messages;
|
|
|
|
message = mosq->out_messages;
|
|
|
|
mosq->out_queue_len = 0;
|
|
|
|
mosq->out_queue_len = 0;
|
|
|
|
while(message){
|
|
|
|
while(message){
|
|
|
|
mosq->out_queue_len++;
|
|
|
|
mosq->out_queue_len++;
|
|
|
|
message->timestamp = 0;
|
|
|
|
message->timestamp = 0;
|
|
|
|
|
|
|
|
|
|
|
|
if(mosq->max_inflight_messages == 0 || mosq->inflight_messages < mosq->max_inflight_messages){
|
|
|
|
if(mosq->send_quota > 0){
|
|
|
|
if(message->msg.qos > 0){
|
|
|
|
mosq->send_quota--;
|
|
|
|
mosq->inflight_messages++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if(message->msg.qos == 1){
|
|
|
|
if(message->msg.qos == 1){
|
|
|
|
message->state = mosq_ms_publish_qos1;
|
|
|
|
message->state = mosq_ms_publish_qos1;
|
|
|
|
}else if(message->msg.qos == 2){
|
|
|
|
}else if(message->msg.qos == 2){
|
|
|
@ -243,9 +241,7 @@ int message__remove(struct mosquitto *mosq, uint16_t mid, enum mosquitto_msg_dir
|
|
|
|
}else if(!mosq->out_messages){
|
|
|
|
}else if(!mosq->out_messages){
|
|
|
|
mosq->out_messages_last = NULL;
|
|
|
|
mosq->out_messages_last = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(cur->msg.qos > 0){
|
|
|
|
util__increment_send_quota(mosq);
|
|
|
|
mosq->inflight_messages--;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
found = true;
|
|
|
|
found = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -256,9 +252,9 @@ int message__remove(struct mosquitto *mosq, uint16_t mid, enum mosquitto_msg_dir
|
|
|
|
if(found){
|
|
|
|
if(found){
|
|
|
|
cur = mosq->out_messages;
|
|
|
|
cur = mosq->out_messages;
|
|
|
|
while(cur){
|
|
|
|
while(cur){
|
|
|
|
if(mosq->max_inflight_messages == 0 || mosq->inflight_messages < mosq->max_inflight_messages){
|
|
|
|
if(mosq->send_quota > 0){
|
|
|
|
if(cur->msg.qos > 0 && cur->state == mosq_ms_invalid){
|
|
|
|
if(cur->msg.qos > 0 && cur->state == mosq_ms_invalid){
|
|
|
|
mosq->inflight_messages++;
|
|
|
|
mosq->send_quota--;
|
|
|
|
if(cur->msg.qos == 1){
|
|
|
|
if(cur->msg.qos == 1){
|
|
|
|
cur->state = mosq_ms_wait_for_puback;
|
|
|
|
cur->state = mosq_ms_wait_for_puback;
|
|
|
|
}else if(cur->msg.qos == 2){
|
|
|
|
}else if(cur->msg.qos == 2){
|
|
|
@ -394,7 +390,7 @@ int mosquitto_max_inflight_messages_set(struct mosquitto *mosq, unsigned int max
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if(!mosq) return MOSQ_ERR_INVAL;
|
|
|
|
if(!mosq) return MOSQ_ERR_INVAL;
|
|
|
|
|
|
|
|
|
|
|
|
mosq->max_inflight_messages = max_inflight_messages;
|
|
|
|
mosq->send_maximum = max_inflight_messages;
|
|
|
|
|
|
|
|
|
|
|
|
return MOSQ_ERR_SUCCESS;
|
|
|
|
return MOSQ_ERR_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|