diff --git a/daemon/dtls.c b/daemon/dtls.c index cd046ea11..d5ba441e5 100644 --- a/daemon/dtls.c +++ b/daemon/dtls.c @@ -384,6 +384,19 @@ struct dtls_cert *dtls_cert() { return ret; } +void dtls_cert_free(void) { + rwlock_lock_w(&__dtls_cert_lock); + + if (__dtls_cert) + obj_put(__dtls_cert); + + __dtls_cert = NULL; + + rwlock_unlock_w(&__dtls_cert_lock); + + return ; +} + static int verify_callback(int ok, X509_STORE_CTX *store) { SSL *ssl; struct dtls_connection *d; diff --git a/daemon/main.c b/daemon/main.c index 00f4d23f2..fe475ed21 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -942,6 +942,11 @@ int main(int argc, char **argv) { ilog(LOG_INFO, "Version %s shutting down", RTPENGINE_VERSION); + redis_close(rtpe_redis); + redis_close(rtpe_redis_write); + redis_close(rtpe_redis_notify); + dtls_cert_free(); + unfill_initial_rtpe_cfg(&initial_rtpe_config); options_free(); diff --git a/daemon/redis.c b/daemon/redis.c index 59da983a1..7ef0d50ed 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -631,6 +631,9 @@ void redis_notify_loop(void *d) { } } + // free libevent + libevent_global_shutdown(); + // unsubscribe notifications redis_notify_subscribe_action(UNSUBSCRIBE_ALL, 0); @@ -677,7 +680,9 @@ err: } -static void redis_close(struct redis *r) { +void redis_close(struct redis *r) { + if (!r) + return; if (r->ctx) redisFree(r->ctx); r->ctx = NULL; diff --git a/include/dtls.h b/include/dtls.h index cc820240d..e67a0e430 100644 --- a/include/dtls.h +++ b/include/dtls.h @@ -66,6 +66,7 @@ void dtls_timer(struct poller *); int dtls_verify_cert(struct packet_stream *ps); const struct dtls_hash_func *dtls_find_hash_func(const str *); struct dtls_cert *dtls_cert(void); +void dtls_cert_free(void); int dtls_connection_init(struct dtls_connection *, struct packet_stream *, int active, struct dtls_cert *cert); int dtls(struct stream_fd *, const str *s, const endpoint_t *sin); diff --git a/include/redis.h b/include/redis.h index fccfa1a19..633109ac8 100644 --- a/include/redis.h +++ b/include/redis.h @@ -102,6 +102,7 @@ void redis_notify_loop(void *d); struct redis *redis_new(const endpoint_t *, int, const char *, enum redis_role, int); +void redis_close(struct redis *r); int redis_restore(struct redis *); void redis_update(struct call *, struct redis *); void redis_update_onekey(struct call *c, struct redis *r);