55 #include <qb/qbipcs.h>
56 #include <qb/qbloop.h>
62 .
name =
"corosync_cmap",
67 .
name =
"corosync_cfg",
72 .
name =
"corosync_cpg",
77 .
name =
"corosync_pload",
81 #ifdef HAVE_MONITORING
83 .
name =
"corosync_mon",
90 .
name =
"corosync_wd",
96 .
name =
"corosync_quorum",
115 static void (*service_unlink_all_complete) (void) = NULL;
130 service_engine = service->
loader();
132 corosync_service[service_engine->
id] = service_engine;
139 init_result = service_engine->
exec_init_fn (corosync_api);
141 return (init_result);
154 name_sufix = strrchr (service->
name,
'_');
158 name_sufix = (
char*)service->
name;
174 "Service engine loaded: %s [%d]", service_engine->
name, service_engine->
id);
176 if (init_result != NULL) {
177 return (init_result);
183 static int service_priority_max(
void)
185 int lpc = 0,
max = 0;
187 if(corosync_service[lpc] != NULL && corosync_service[lpc]->
priority >
max) {
198 corosync_service_unlink_and_exit_priority (
201 int *current_priority,
202 int *current_service_engine)
204 unsigned short service_id;
207 for(; *current_priority >= lowest_priority; *current_priority = *current_priority - 1) {
208 for(*current_service_engine = 0;
210 *current_service_engine = *current_service_engine + 1) {
212 if(corosync_service[*current_service_engine] == NULL ||
213 corosync_service[*current_service_engine]->
priority != *current_priority) {
224 service_id = corosync_service[*current_service_engine]->
id;
239 "Service engine unloaded: %s",
240 corosync_service[*current_service_engine]->
name);
242 corosync_service[*current_service_engine] = NULL;
256 static unsigned int service_unlink_and_exit (
258 const char *service_name,
259 unsigned int service_ver)
261 unsigned short service_id;
264 const char *iter_key_name;
267 unsigned int found_service_ver;
268 char *found_service_name;
271 name_sufix = strrchr (service_name,
'_');
275 name_sufix = (
char*)service_name;
279 found_service_name = NULL;
282 res = sscanf(iter_key_name,
"internal_configuration.service.%hu.%s", &service_id, key_name);
287 snprintf(key_name,
ICMAP_KEYNAME_MAXLEN,
"internal_configuration.service.%hu.name", service_id);
294 free(found_service_name);
298 if (service_ver == found_service_ver && strcmp(found_service_name, service_name) == 0) {
299 free(found_service_name);
303 free(found_service_name);
307 if (service_found && service_id < SERVICES_COUNT_MAX
308 && corosync_service[service_id] != NULL) {
318 "Service engine unloaded: %s",
319 corosync_service[service_id]->
name);
321 corosync_service[service_id] = NULL;
325 snprintf(key_name,
ICMAP_KEYNAME_MAXLEN,
"internal_configuration.service.%u.handle", service_id);
345 i <
sizeof (default_services) /
sizeof (
struct default_service); i++) {
347 default_services[i].
loader();
350 &default_services[i]);
353 "Service engine '%s' failed to load for reason '%s'",
354 default_services[i].
name,
363 static void service_exit_schedwrk_handler (
void *data) {
365 static int current_priority = 0;
366 static int current_service_engine = 0;
367 static int called = 0;
373 "Unloading all Corosync service engines.");
374 current_priority = service_priority_max ();
378 res = corosync_service_unlink_and_exit_priority (
382 ¤t_service_engine);
384 service_unlink_all_complete();
391 service_exit_schedwrk_handler);
396 void (*unlink_all_complete) (
void))
398 static int called = 0;
403 service_unlink_all_complete = unlink_all_complete;
417 service_exit_schedwrk_handler);
427 static void service_unlink_and_exit_schedwrk_handler (
void *data)
433 res = service_unlink_and_exit (
434 service_unlink_and_exit_data->
api,
435 service_unlink_and_exit_data->
name,
436 service_unlink_and_exit_data->
ver);
439 free (service_unlink_and_exit_data);
444 service_unlink_and_exit_schedwrk_handler);
452 const char *service_name,
453 unsigned int service_ver)
455 struct service_unlink_and_exit_data *service_unlink_and_exit_data;
458 service_unlink_and_exit_data = malloc (
sizeof (
struct service_unlink_and_exit_data));
459 service_unlink_and_exit_data->
api =
api;
460 service_unlink_and_exit_data->
name = strdup (service_name);
461 service_unlink_and_exit_data->
ver = service_ver;
465 service_unlink_and_exit_data,
466 service_unlink_and_exit_schedwrk_handler);
struct corosync_service_engine * vsf_quorum_get_service_engine_ver0(void)
unsigned int corosync_service_defaults_link_and_init(struct corosync_api_v1 *corosync_api)
Load all of the default services.
const char * cs_ipcs_service_init(struct corosync_service_engine *service)
const char * icmap_iter_next(icmap_iter_t iter, size_t *value_len, icmap_value_types_t *type)
Totem Single Ring Protocol.
struct corosync_api_v1 * api
void icmap_iter_finalize(icmap_iter_t iter)
struct corosync_service_engine *(* loader)(void)
struct corosync_api_v1 * api
qb_loop_t * cs_poll_handle_get(void)
struct corosync_service_engine * cpg_get_service_engine_ver0(void)
#define corosync_exit_error(err)
cs_error_t icmap_set_string(const char *key_name, const char *value)
struct corosync_service_engine * corosync_service[SERVICES_COUNT_MAX]
struct corosync_service_engine * wd_get_service_engine_ver0(void)
#define log_printf(level, format, args...)
void corosync_service_unlink_all(struct corosync_api_v1 *api, void(*unlink_all_complete)(void))
Unlink and exit all corosync services.
#define ICMAP_KEYNAME_MAXLEN
unsigned int corosync_service_unlink_and_exit(struct corosync_api_v1 *api, const char *service_name, unsigned int service_ver)
Unlink and exit a service.
#define SERVICE_HANDLER_MAXIMUM_COUNT
cs_error_t icmap_set_uint32(const char *key_name, uint32_t value)
int(* config_init_fn)(struct corosync_api_v1 *)
#define LOGSYS_LEVEL_ERROR
cs_error_t icmap_delete(const char *key_name)
const char * service_stats_tx[SERVICES_COUNT_MAX][SERVICE_HANDLER_MAXIMUM_COUNT]
cs_error_t icmap_set_uint16(const char *key_name, uint16_t value)
cs_error_t icmap_get_uint32(const char *key_name, uint32_t *u32)
cs_error_t icmap_set_uint64(const char *key_name, uint64_t value)
struct corosync_service_engine * cmap_get_service_engine_ver0(void)
char * corosync_service_link_and_init(struct corosync_api_v1 *corosync_api, struct default_service *service)
Link and initialize a service.
const char * service_stats_rx[SERVICES_COUNT_MAX][SERVICE_HANDLER_MAXIMUM_COUNT]
LOGSYS_DECLARE_SUBSYS("SERV")
#define SERVICES_COUNT_MAX
int32_t cs_ipcs_service_destroy(int32_t service_id)
int(* schedwrk_cast)(const void *)
cs_error_t icmap_get_string(const char *key_name, char **str)
char *(* exec_init_fn)(struct corosync_api_v1 *)
#define LOGSYS_LEVEL_NOTICE
struct corosync_service_engine * cfg_get_service_engine_ver0(void)
int(* exec_exit_fn)(void)
icmap_iter_t icmap_iter_init(const char *prefix)
struct corosync_service_engine * pload_get_service_engine_ver0(void)
struct corosync_service_engine * mon_get_service_engine_ver0(void)
qb_map_iter_t * icmap_iter_t