From a9969ca1ca953f5b6e51ae505e5ccaadbf7dc2a5 Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Mon, 17 Jul 2017 17:05:46 +0300 Subject: [PATCH] odissey: add scheme obsolete logic --- sources/periodic.c | 2 +- sources/route_pool.c | 29 ++++++++++------------------- sources/route_pool.h | 4 +--- sources/router.c | 2 +- sources/scheme.c | 13 ++++++++++++- sources/scheme.h | 4 ++-- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/sources/periodic.c b/sources/periodic.c index 1da38fc9..6bebe926 100644 --- a/sources/periodic.c +++ b/sources/periodic.c @@ -134,7 +134,7 @@ od_periodic_expire(od_periodic_t *periodic) od_backend_close(server); /* cleanup unused dynamic route */ - od_routepool_gc_route(&router->route_pool, route); + od_routepool_gc(&router->route_pool, route); } } diff --git a/sources/route_pool.c b/sources/route_pool.c index e985083e..9cfc2ec8 100644 --- a/sources/route_pool.c +++ b/sources/route_pool.c @@ -50,32 +50,23 @@ void od_routepool_free(od_routepool_t *pool) } } -void od_routepool_gc(od_routepool_t *pool) +void od_routepool_gc(od_routepool_t *pool, od_route_t *route) { - od_list_t *i, *n; - od_list_foreach_safe(&pool->list, i, n) { - od_route_t *route; - route = od_container_of(i, od_route_t, link); - od_routepool_gc_route(pool, route); - } -} + if (od_serverpool_total(&route->server_pool) > 0 || + od_clientpool_total(&route->client_pool) > 0) + return; -static inline void -od_routepool_unlink(od_routepool_t *pool, od_route_t *route) -{ + od_schemedb_t *scheme = route->scheme->db; + + /* free route data */ assert(pool->count > 0); pool->count--; od_list_unlink(&route->link); od_route_free(route); -} -void od_routepool_gc_route(od_routepool_t *pool, od_route_t *route) -{ - if (od_serverpool_total(&route->server_pool) == 0 && - od_clientpool_total(&route->client_pool) == 0) - { - od_routepool_unlink(pool, route); - } + /* maybe free obsolete scheme db */ + if (scheme->is_obsolete) + od_schemedb_free(scheme); } od_route_t* diff --git a/sources/route_pool.h b/sources/route_pool.h index 102c05b1..9555de94 100644 --- a/sources/route_pool.h +++ b/sources/route_pool.h @@ -17,9 +17,7 @@ struct od_routepool void od_routepool_init(od_routepool_t*); void od_routepool_free(od_routepool_t*); - -void od_routepool_gc(od_routepool_t*); -void od_routepool_gc_route(od_routepool_t*, od_route_t*); +void od_routepool_gc(od_routepool_t*, od_route_t*); od_route_t* od_routepool_new(od_routepool_t*, od_schemeuser_t*, diff --git a/sources/router.c b/sources/router.c index 0a72af40..4860eae5 100644 --- a/sources/router.c +++ b/sources/router.c @@ -310,7 +310,7 @@ od_router(void *arg) router->clients--; /* maybe remove empty route */ - od_routepool_gc_route(&router->route_pool, route); + od_routepool_gc(&router->route_pool, route); msg_unroute->status = OD_ROK; machine_queue_put(msg_unroute->response, msg); diff --git a/sources/scheme.c b/sources/scheme.c index 54d84624..d3846743 100644 --- a/sources/scheme.c +++ b/sources/scheme.c @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -55,6 +56,9 @@ void od_scheme_init(od_scheme_t *scheme) od_list_init(&scheme->storages); } +static void +od_schemestorage_free(od_schemestorage_t*); + void od_scheme_free(od_scheme_t *scheme) { od_list_t *i, *n; @@ -128,7 +132,8 @@ od_schemestorage_match(od_scheme_t *scheme, char *name, int version) return match; } -void od_schemestorage_free(od_schemestorage_t *storage) +static void +od_schemestorage_free(od_schemestorage_t *storage) { if (storage->name) free(storage->name); @@ -191,6 +196,12 @@ od_schemedb_match(od_scheme_t *scheme, char *name, int version) return match; } +void od_schemedb_mark_obsolete(od_schemedb_t *db) +{ + assert(! db->is_obsolete); + db->is_obsolete = 1; +} + static void od_schemeuser_free(od_schemeuser_t*); diff --git a/sources/scheme.h b/sources/scheme.h index 62c31957..9391731b 100644 --- a/sources/scheme.h +++ b/sources/scheme.h @@ -66,6 +66,7 @@ struct od_schemedb od_list_t users; od_schemeuser_t *user_default; int is_default; + int is_obsolete; int version; od_list_t link; }; @@ -150,14 +151,13 @@ void od_scheme_print(od_scheme_t*, od_log_t*); od_schemestorage_t* od_schemestorage_add(od_scheme_t*, int); -void od_schemestorage_free(od_schemestorage_t*); - od_schemestorage_t* od_schemestorage_match(od_scheme_t*, char*, int); od_schemedb_t* od_schemedb_add(od_scheme_t*, int); +void od_schemedb_mark_obsolete(od_schemedb_t*); void od_schemedb_free(od_schemedb_t*); od_schemedb_t*