diff --git a/lib/mosquitto_internal.h b/lib/mosquitto_internal.h index e0c6b7d7..a21f927b 100644 --- a/lib/mosquitto_internal.h +++ b/lib/mosquitto_internal.h @@ -362,6 +362,7 @@ struct mosquitto { struct mosquitto__client_sub **subs; char *auth_method; int subs_capacity; /* allocated size of the subs instance */ + int subs_count; /* number of currently active subscriptions */ # ifndef WITH_EPOLL int pollfd_index; # endif diff --git a/src/handle_connect.c b/src/handle_connect.c index df25f348..42f7900b 100644 --- a/src/handle_connect.c +++ b/src/handle_connect.c @@ -165,7 +165,9 @@ int connect__on_authorised(struct mosquitto *context, void *auth_data_out, uint1 context->subs = found_context->subs; found_context->subs = NULL; context->subs_capacity = found_context->subs_capacity; + context->subs_count = found_context->subs_count; found_context->subs_capacity = 0; + found_context->subs_count = 0; context->last_mid = found_context->last_mid; for(i=0; isubs_capacity; i++){ diff --git a/src/plugin_public.c b/src/plugin_public.c index 368c7670..9b62e887 100644 --- a/src/plugin_public.c +++ b/src/plugin_public.c @@ -172,7 +172,7 @@ BROKER_EXPORT int mosquitto_client_protocol_version(const struct mosquitto *clie BROKER_EXPORT int mosquitto_client_sub_count(const struct mosquitto *client) { if(client){ - return client->subs_capacity; + return client->subs_count; }else{ return 0; } diff --git a/src/subs.c b/src/subs.c index 5fb40134..94ed2e66 100644 --- a/src/subs.c +++ b/src/subs.c @@ -238,6 +238,7 @@ static int sub__add_shared(struct mosquitto *context, const char *sub, uint8_t q for(i=0; isubs_capacity; i++){ if(!context->subs[i]){ context->subs[i] = csub; + context->subs_count++; assigned = true; break; } @@ -252,6 +253,7 @@ static int sub__add_shared(struct mosquitto *context, const char *sub, uint8_t q } context->subs = subs; context->subs_capacity++; + context->subs_count++; context->subs[context->subs_capacity-1] = csub; } #ifdef WITH_SYS_TREE @@ -295,6 +297,7 @@ static int sub__add_normal(struct mosquitto *context, const char *sub, uint8_t q for(i=0; isubs_capacity; i++){ if(!context->subs[i]){ context->subs[i] = csub; + context->subs_count++; assigned = true; break; } @@ -309,6 +312,7 @@ static int sub__add_normal(struct mosquitto *context, const char *sub, uint8_t q } context->subs = subs; context->subs_capacity++; + context->subs_count++; context->subs[context->subs_capacity-1] = csub; } #ifdef WITH_SYS_TREE @@ -381,6 +385,7 @@ static int sub__remove_normal(struct mosquitto *context, struct mosquitto__subhi * each subleaf. Might be worth considering though. */ for(i=0; isubs_capacity; i++){ if(context->subs[i] && context->subs[i]->hier == subhier){ + context->subs_count--; mosquitto__FREE(context->subs[i]); break; } @@ -419,7 +424,7 @@ static int sub__remove_shared(struct mosquitto *context, struct mosquitto__subhi if(context->subs[i] && context->subs[i]->hier == subhier && context->subs[i]->shared == shared){ - + context->subs_count--; mosquitto__FREE(context->subs[i]); break; } @@ -744,6 +749,7 @@ int sub__clean_session(struct mosquitto *context) } mosquitto__FREE(context->subs); context->subs_capacity = 0; + context->subs_count = 0; return MOSQ_ERR_SUCCESS; }