From 69928e301add2082adf4ac48e187d476b343a5fd Mon Sep 17 00:00:00 2001 From: Steven Dake Date: Mon, 27 Jul 2009 02:00:05 +0000 Subject: [PATCH] Add notification when totem has completed initialization. This triggers the initialization of the service engines which may need totem for initialization. git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2372 fd59a12c-fef9-0310-b244-a6a79926bd2f --- exec/main.c | 27 +++++++++++++++++---------- exec/totemmrp.c | 8 ++++++++ exec/totemmrp.h | 3 +++ exec/totempg.c | 6 ++++++ exec/totemrrp.c | 1 - exec/totemsrp.c | 16 +++++++++++++++- exec/totemsrp.h | 4 ++++ include/corosync/totem/totempg.h | 3 +++ 8 files changed, 56 insertions(+), 12 deletions(-) diff --git a/exec/main.c b/exec/main.c index 2fdb62e5..96919b63 100644 --- a/exec/main.c +++ b/exec/main.c @@ -716,6 +716,20 @@ static void corosync_setscheduler (void) #endif } +void main_service_ready (void) +{ + int res; + /* + * This must occur after totempg is initialized because "this_ip" must be set + */ + res = corosync_service_defaults_link_and_init (api); + if (res == -1) { + log_printf (LOGSYS_LEVEL_ERROR, "Could not initialize default services\n"); + corosync_exit_error (AIS_DONE_INIT_SERVICES); + } + evil_init (api); +} + int main (int argc, char **argv) { const char *error_string; @@ -973,6 +987,9 @@ int main (int argc, char **argv) corosync_poll_handle, &totem_config); + totempg_service_ready_register ( + main_service_ready); + totempg_groups_initialize ( &corosync_group_handle, deliver_fn, @@ -983,16 +1000,6 @@ int main (int argc, char **argv) &corosync_group, 1); - /* - * This must occur after totempg is initialized because "this_ip" must be set - */ - res = corosync_service_defaults_link_and_init (api); - if (res == -1) { - log_printf (LOGSYS_LEVEL_ERROR, "Could not initialize default services\n"); - corosync_exit_error (AIS_DONE_INIT_SERVICES); - } - evil_init (api); - if (minimum_sync_mode == CS_SYNC_V2) { log_printf (LOGSYS_LEVEL_NOTICE, "Compatibility mode set to none. Using V2 of the synchronization engine.\n"); sync_v2_init ( diff --git a/exec/totemmrp.c b/exec/totemmrp.c index 1bd538a2..d014300b 100644 --- a/exec/totemmrp.c +++ b/exec/totemmrp.c @@ -234,3 +234,11 @@ extern int totemmrp_ring_reenable (void) return (res); } + +extern void totemmrp_service_ready_register ( + void (*totem_service_ready) (void)) +{ + totemsrp_service_ready_register ( + totemsrp_context, + totem_service_ready); +} diff --git a/exec/totemmrp.h b/exec/totemmrp.h index fda10c0d..aa19c1b7 100644 --- a/exec/totemmrp.h +++ b/exec/totemmrp.h @@ -112,4 +112,7 @@ extern int totemmrp_crypto_set (unsigned int); extern int totemmrp_ring_reenable (void); +extern void totemmrp_service_ready_register ( + void (*totem_service_ready) (void)); + #endif /* TOTEMMRP_H_DEFINED */ diff --git a/exec/totempg.c b/exec/totempg.c index f77bedf7..93f7eb26 100644 --- a/exec/totempg.c +++ b/exec/totempg.c @@ -1343,3 +1343,9 @@ int totempg_my_family_get (void) { return (totemmrp_my_family_get()); } +extern void totempg_service_ready_register ( + void (*totem_service_ready) (void)) +{ + totemmrp_service_ready_register (totem_service_ready); +} + diff --git a/exec/totemrrp.c b/exec/totemrrp.c index 406d4fdd..0b803512 100644 --- a/exec/totemrrp.c +++ b/exec/totemrrp.c @@ -1536,7 +1536,6 @@ int totemrrp_initialize ( deliver_fn_context->instance = instance; deliver_fn_context->context = context; deliver_fn_context->iface_no = i; -printf ("deliver fn context %p\n", deliver_fn_context); totemnet_initialize ( poll_handle, diff --git a/exec/totemsrp.c b/exec/totemsrp.c index 574edb63..2194411e 100644 --- a/exec/totemsrp.c +++ b/exec/totemsrp.c @@ -470,6 +470,8 @@ struct totemsrp_instance { const unsigned int *joined_list, size_t joined_list_entries, const struct memb_ring_id *ring_id); + void (*totemsrp_service_ready_fn) (void); + int global_seqno; int my_token_held; @@ -917,7 +919,7 @@ int totemsrp_ifaces_get ( unsigned int *iface_count) { struct totemsrp_instance *instance = (struct totemsrp_instance *)srp_context; - int res; + int res = 0; unsigned int found = 0; unsigned int i; @@ -4246,6 +4248,9 @@ void main_iface_change_fn ( "Created or loaded sequence id %lld.%s for this ring.\n", instance->my_ring_id.seq, totemip_print (&instance->my_ring_id.rep)); + if (instance->totemsrp_service_ready_fn) { + instance->totemsrp_service_ready_fn (); + } } if (instance->iface_changes >= instance->totem_config->interface_count) { @@ -4256,3 +4261,12 @@ void main_iface_change_fn ( void totemsrp_net_mtu_adjust (struct totem_config *totem_config) { totem_config->net_mtu -= sizeof (struct mcast); } + +void totemsrp_service_ready_register ( + void *context, + void (*totem_service_ready) (void)) +{ + struct totemsrp_instance *instance = (struct totemsrp_instance *)context; + + instance->totemsrp_service_ready_fn = totem_service_ready; +} diff --git a/exec/totemsrp.h b/exec/totemsrp.h index e003d7d2..743aaad8 100644 --- a/exec/totemsrp.h +++ b/exec/totemsrp.h @@ -115,4 +115,8 @@ extern int totemsrp_crypto_set ( extern int totemsrp_ring_reenable ( void *srp_context); +void totemsrp_service_ready_register ( + void *srp_context, + void (*totem_service_ready) (void)); + #endif /* TOTEMSRP_H_DEFINED */ diff --git a/include/corosync/totem/totempg.h b/include/corosync/totem/totempg.h index f4bad95c..4609092a 100644 --- a/include/corosync/totem/totempg.h +++ b/include/corosync/totem/totempg.h @@ -153,6 +153,9 @@ extern int totempg_crypto_set (unsigned int type); extern int totempg_ring_reenable (void); +extern void totempg_service_ready_register ( + void (*totem_service_ready) (void)); + #ifdef __cplusplus } #endif