diff --git a/exec/main.c b/exec/main.c index 5d388946..48b341c7 100644 --- a/exec/main.c +++ b/exec/main.c @@ -107,6 +107,8 @@ static int num_config_modules; static struct config_iface_ver0 *config_modules[MAX_DYNAMIC_SERVICES]; +static struct objdb_iface_ver0 *objdb = NULL; + SaClmClusterNodeT *(*main_clm_get_by_nodeid) (unsigned int node_id); static void sigusr2_handler (int num) @@ -120,6 +122,50 @@ static void sigusr2_handler (int num) } } +static void *aisexec_exit (void *arg) +{ + if(objdb) { + openais_service_unlink_all (objdb); + } + +#ifdef DEBUG_MEMPOOL + int stats_inuse[MEMPOOL_GROUP_SIZE]; + int stats_avail[MEMPOOL_GROUP_SIZE]; + int stats_memoryused[MEMPOOL_GROUP_SIZE]; + int i; + + mempool_getstats (stats_inuse, stats_avail, stats_memoryused); + log_printf (LOG_LEVEL_DEBUG, "Memory pools:\n"); + for (i = 0; i < MEMPOOL_GROUP_SIZE; i++) { + log_printf (LOG_LEVEL_DEBUG, "order %d size %d inuse %d avail %d memory used %d\n", + i, 1<object_key_get (object_service_handle, + "handle", + strlen ("handle"), + (void *)&found_service_handle, + NULL); + + res = objdb->object_key_get (object_service_handle, + "service_id", + strlen ("service_id"), + (void *)&service_id, + NULL); + + log_printf(LOG_LEVEL_NOTICE, "Unloading openais component: %s v%u\n", + service_name, service_version); + + if (ais_service[*service_id]->exec_exit_fn) { + ais_service[*service_id]->exec_exit_fn (objdb); + } + ais_service[*service_id] = NULL; + + return lcr_ifact_release (*found_service_handle); +} + extern unsigned int openais_service_unlink_and_exit ( struct objdb_iface_ver0 *objdb, char *service_name, unsigned int service_ver) { + unsigned int res; unsigned int object_service_handle; char *found_service_name; unsigned int *found_service_ver; - unsigned int *found_service_handle; - unsigned short *service_id; - unsigned int res; objdb->object_find_reset (OBJECT_PARENT_HANDLE); while (objdb->object_find ( @@ -244,32 +278,53 @@ extern unsigned int openais_service_unlink_and_exit ( */ if ((strcmp (service_name, found_service_name) == 0) && (service_ver == *found_service_ver)) { - - res = objdb->object_key_get (object_service_handle, - "handle", - strlen ("handle"), - (void *)&found_service_handle, - NULL); - - res = objdb->object_key_get (object_service_handle, - "service_id", - strlen ("service_id"), - (void *)&service_id, - NULL); - - if (ais_service[*service_id]->exec_exit_fn) { - ais_service[*service_id]->exec_exit_fn (objdb); - } - ais_service[*service_id] = NULL; - - res = lcr_ifact_release (*found_service_handle); + res = openais_service_unlink_common( + objdb, object_service_handle, service_name, service_ver); objdb->object_destroy (object_service_handle); - return (res); + return res; } } return (-1); } +extern unsigned int openais_service_unlink_all ( + struct objdb_iface_ver0 *objdb) +{ + char *service_name; + unsigned int *service_ver; + unsigned int object_service_handle; + + log_printf(LOG_LEVEL_NOTICE, "Unloading all openais components\n"); + + objdb->object_find_reset (OBJECT_PARENT_HANDLE); + while (objdb->object_find (OBJECT_PARENT_HANDLE, + "service", + strlen ("service"), + &object_service_handle) == 0) { + + objdb->object_key_get (object_service_handle, + "name", + strlen ("name"), + (void *)&service_name, + NULL); + + objdb->object_key_get (object_service_handle, + "ver", + strlen ("ver"), + (void *)&service_ver, + NULL); + + openais_service_unlink_common( + objdb, object_service_handle, service_name, *service_ver); + + objdb->object_destroy (object_service_handle); + log_printf(LOG_LEVEL_NOTICE, "%s was unlinked\n", service_name); + logsys_flush (); + } + + return (0); +} + /* * Links default services into the executive */