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);