diff --git a/lib/mosquitto.c b/lib/mosquitto.c index c49c53cf39..f1f200fd3e 100644 --- a/lib/mosquitto.c +++ b/lib/mosquitto.c @@ -34,6 +34,7 @@ and the Eclipse Distribution License is available at #include "packet_mosq.h" #include "will_mosq.h" +static unsigned int init_refcount = 0; void mosquitto__destroy(struct mosquitto *mosq); @@ -47,31 +48,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; }