I am using mosquitto compiled for the ATMEL Cortex-A5 as broker .
the borker Memory rises slowly,no stop.
I take some log in `int packet__write(struct mosquitto *mosq)` 。like that
while(packet->to_process > 0){
write_length = net__write(mosq, &(packet->payload[packet->pos]), packet->to_process);
if(write_length > 0){
G_BYTES_SENT_INC(write_length);
packet->to_process -= write_length;
packet->pos += write_length;
}else{
#ifdef WIN32
errno = WSAGetLastError();
#endif
if(errno == EAGAIN || errno == COMPAT_EWOULDBLOCK){
pthread_mutex_unlock(&mosq->current_out_packet_mutex);
log__printf(NULL, MOSQ_LOG_INFO, "(%s,mid:%d): errno == EAGAIN or COMPAT_EWOULDBLOCK",mosq->id,packet->mid );
return MOSQ_ERR_SUCCESS;// ************* no free packet
}else{
pthread_mutex_unlock(&mosq->current_out_packet_mutex);
switch(errno){
case COMPAT_ECONNRESET:
return MOSQ_ERR_CONN_LOST; // ************ no free packet
default:
return MOSQ_ERR_ERRNO; //**************** no free packet
}
}
}
}
my mqtt client is busy and cannot recv msg quickly,
when socket send buf is fill, the net__write will cause errno == EAGAIN, then return MOSQ_ERR_SUCCESS without free packet.
when the next message need to pub, in packet__queue function , will check mosq->out_packet like that
pthread_mutex_lock(&mosq->out_packet_mutex);
if(mosq->out_packet){
log__printf(NULL, MOSQ_LOG_INFO, "(%s,mid:%d): package to out_packet_last->Next,command:%x: outpacket_num:%d",
mosq->id,packet->mid,mosq->out_packet->command,mosq->out_packet_count);
mosq->out_packet_last->next = packet;
}else{
log__printf(NULL, MOSQ_LOG_INFO, "(%s,mid:%d): package to out_packet: outpacket_num:%d",
mosq->id,packet->mid,mosq->out_packet_count);
mosq->out_packet = packet;
}
mosq->out_packet_last = packet;
mosq->out_packet_count++;
pthread_mutex_unlock(&mosq->out_packet_mutex);
i found that some time it will run: mosq->out_packet_last->next = packet; because last time errno == EAGAIN,package no free .
the last I can not fun anywhere to free out_packet_last . so the mosquitto borker Memory rises slowly.