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 "will_mosq.h"
static unsigned int init_refcount = 0;
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 rc;
if (init_refcount == 0) {
#ifdef WIN32
srand(GetTickCount64());
srand(GetTickCount64());
#elif _POSIX_TIMERS>0 && defined(_POSIX_MONOTONIC_CLOCK)
struct timespec tp;
struct timespec tp;
clock_gettime(CLOCK_MONOTONIC, &tp);
srand(tp.tv_nsec);
clock_gettime(CLOCK_MONOTONIC, &tp);
srand(tp.tv_nsec);
#elif defined(__APPLE__)
uint64_t ticks;
uint64_t ticks;
ticks = mach_absolute_time();
srand((unsigned int)ticks);
ticks = mach_absolute_time();
srand((unsigned int)ticks);
#else
struct timeval tv;
struct timeval tv;
gettimeofday(&tv, NULL);
srand(tv.tv_sec*1000 + tv.tv_usec/1000);
gettimeofday(&tv, NULL);
srand(tv.tv_sec*1000 + tv.tv_usec/1000);
#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)
{
net__cleanup();
if (init_refcount == 1) {
net__cleanup();
}
if (init_refcount > 0) {
--init_refcount;
}
return MOSQ_ERR_SUCCESS;
}

Loading…
Cancel
Save