add a refcount to library init/cleanup

Add a refcount around mosquitto_lib_init and mosquitto_lib_cleanup so
that multiple calls to init/cleanup don't trigger memory leaks or
double-frees.

Signed-off-by: Martin Kelly <mkelly@xevo.com>
pull/1658/merge
Martin Kelly 5 years ago committed by Roger A. Light
parent 22ffefe7f6
commit 8d54aaef89

@ -33,6 +33,7 @@ Contributors:
#include "packet_mosq.h" #include "packet_mosq.h"
#include "will_mosq.h" #include "will_mosq.h"
static unsigned int init_refcount = 0;
void mosquitto__destroy(struct mosquitto *mosq); void mosquitto__destroy(struct mosquitto *mosq);
@ -46,31 +47,47 @@ int mosquitto_lib_version(int *major, int *minor, int *revision)
int mosquitto_lib_init(void) int mosquitto_lib_init(void)
{ {
int rc;
if (init_refcount == 0) {
#ifdef WIN32 #ifdef WIN32
srand(GetTickCount64()); srand(GetTickCount64());
#elif _POSIX_TIMERS>0 && defined(_POSIX_MONOTONIC_CLOCK) #elif _POSIX_TIMERS>0 && defined(_POSIX_MONOTONIC_CLOCK)
struct timespec tp; struct timespec tp;
clock_gettime(CLOCK_MONOTONIC, &tp); clock_gettime(CLOCK_MONOTONIC, &tp);
srand(tp.tv_nsec); srand(tp.tv_nsec);
#elif defined(__APPLE__) #elif defined(__APPLE__)
uint64_t ticks; uint64_t ticks;
ticks = mach_absolute_time(); ticks = mach_absolute_time();
srand((unsigned int)ticks); srand((unsigned int)ticks);
#else #else
struct timeval tv; struct timeval tv;
gettimeofday(&tv, NULL); gettimeofday(&tv, NULL);
srand(tv.tv_sec*1000 + tv.tv_usec/1000); srand(tv.tv_sec*1000 + tv.tv_usec/1000);
#endif #endif
return net__init(); rc = net__init();
if (rc != MOSQ_ERR_SUCCESS) {
return rc;
}
}
init_refcount++;
return MOSQ_ERR_SUCCESS;
} }
int mosquitto_lib_cleanup(void) int mosquitto_lib_cleanup(void)
{ {
net__cleanup(); if (init_refcount == 1) {
net__cleanup();
}
if (init_refcount > 0) {
--init_refcount;
}
return MOSQ_ERR_SUCCESS; return MOSQ_ERR_SUCCESS;
} }

Loading…
Cancel
Save