Reviewed-by: Steven Dake <sdake@xxxxxxxxxx> On 08/09/2012 04:50 AM, Jan Friesse wrote: > When sync started and service is unloaded in meantime, it can happen that > sync will call sync_* functions on unloaded service. > > Signed-off-by: Jan Friesse <jfriesse@xxxxxxxxxx> > --- > exec/main.c | 4 ++++ > exec/sync.c | 25 ++++++++++++++++++------- > 2 files changed, 22 insertions(+), 7 deletions(-) > > diff --git a/exec/main.c b/exec/main.c > index 5bccb87..f03d8fe 100644 > --- a/exec/main.c > +++ b/exec/main.c > @@ -285,6 +285,10 @@ static int corosync_sync_callbacks_retrieve ( > return (-1); > } > > + if (callbacks == NULL) { > + return (0); > + } > + > callbacks->name = corosync_service[service_id]->name; > > callbacks->sync_init = corosync_service[service_id]->sync_init; > diff --git a/exec/sync.c b/exec/sync.c > index b09ea53..0ffe5ce 100644 > --- a/exec/sync.c > +++ b/exec/sync.c > @@ -231,7 +231,10 @@ static void sync_barrier_handler (unsigned int nodeid, const void *msg) > log_printf (LOGSYS_LEVEL_DEBUG, "Committing synchronization for %s", > my_service_list[my_processing_idx].name); > my_service_list[my_processing_idx].state = ACTIVATE; > - my_service_list[my_processing_idx].sync_activate (); > + > + if (my_sync_callbacks_retrieve(my_processing_idx, NULL) != -1) { > + my_service_list[my_processing_idx].sync_activate (); > + } > > my_processing_idx += 1; > if (my_service_list_entries == my_processing_idx) { > @@ -544,14 +547,20 @@ static int schedwrk_processor (const void *context) > } > } > > - my_service_list[my_processing_idx].sync_init (my_trans_list, > - my_trans_list_entries, my_member_list, > - my_member_list_entries, > - &my_ring_id); > + if (my_sync_callbacks_retrieve(my_processing_idx, NULL) != -1) { > + my_service_list[my_processing_idx].sync_init (my_trans_list, > + my_trans_list_entries, my_member_list, > + my_member_list_entries, > + &my_ring_id); > + } > } > if (my_service_list[my_processing_idx].state == PROCESS) { > my_service_list[my_processing_idx].state = PROCESS; > - res = my_service_list[my_processing_idx].sync_process (); > + if (my_sync_callbacks_retrieve(my_processing_idx, NULL) != -1) { > + res = my_service_list[my_processing_idx].sync_process (); > + } else { > + res = 0; > + } > if (res == 0) { > sync_barrier_enter(); > } else { > @@ -595,7 +604,9 @@ void sync_abort (void) > ENTER(); > if (my_state == SYNC_PROCESS) { > schedwrk_destroy (my_schedwrk_handle); > - my_service_list[my_processing_idx].sync_abort (); > + if (my_sync_callbacks_retrieve(my_processing_idx, NULL) != -1) { > + my_service_list[my_processing_idx].sync_abort (); > + } > } > > /* this will cause any "old" barrier messages from causing > _______________________________________________ discuss mailing list discuss@xxxxxxxxxxxx http://lists.corosync.org/mailman/listinfo/discuss