int transition(GPtrArray *new_activation_mappings, GPtrArray *old_activation_mappings, GPtrArray *target_array, const gboolean dry_run) { GPtrArray *union_array; GPtrArray *deactivation_array; GPtrArray *activation_array; int status; /* Print configurations */ if(old_activation_mappings == NULL) { union_array = new_activation_mappings; deactivation_array = NULL; activation_array = new_activation_mappings; g_print("[coordinator]: Mapping closures to activate:\n"); print_activation_array(activation_array); } else { GPtrArray *intersection_array = intersect_activation_array(new_activation_mappings, old_activation_mappings); g_print("[coordinator]: Mapping closures to deactivate:\n"); deactivation_array = substract_activation_array(old_activation_mappings, intersection_array); print_activation_array(deactivation_array); g_print("[coordinator]: Mapping closures to activate:\n"); activation_array = substract_activation_array(new_activation_mappings, intersection_array); print_activation_array(activation_array); union_array = union_activation_array(old_activation_mappings, new_activation_mappings, intersection_array); /* Remove obsolete intersection array */ g_ptr_array_free(intersection_array, TRUE); } /* Execute deactivation process */ if((status = deactivate_obsolete_mappings(deactivation_array, union_array, target_array, old_activation_mappings, dry_run)) != 0) { cleanup(old_activation_mappings, deactivation_array, activation_array, union_array); return status; } /* Execute activation process (if deactivation process did not fail) */ if((status = activate_new_mappings(activation_array, union_array, target_array, old_activation_mappings, dry_run)) != 0) { cleanup(old_activation_mappings, deactivation_array, activation_array, union_array); return status; } /* Cleanup */ cleanup(old_activation_mappings, deactivation_array, activation_array, union_array); /* Returns the exit status, which is 0 if everything succeeded */ return 0; }
TransitionStatus transition(GPtrArray *new_activation_mappings, GPtrArray *old_activation_mappings, GPtrArray *target_array, const gboolean no_rollback, const gboolean dry_run) { GPtrArray *union_array; GPtrArray *deactivation_array; GPtrArray *activation_array; TransitionStatus status; /* Print configurations */ if(old_activation_mappings == NULL) { union_array = new_activation_mappings; deactivation_array = NULL; activation_array = new_activation_mappings; g_print("[coordinator]: Mapping closures to activate:\n"); print_activation_array(activation_array); } else { GPtrArray *intersection_array = intersect_activation_array(new_activation_mappings, old_activation_mappings); g_print("[coordinator]: Mapping closures to deactivate:\n"); deactivation_array = substract_activation_array(old_activation_mappings, intersection_array); print_activation_array(deactivation_array); g_print("[coordinator]: Mapping closures to activate:\n"); activation_array = substract_activation_array(new_activation_mappings, intersection_array); print_activation_array(activation_array); union_array = union_activation_array(old_activation_mappings, new_activation_mappings, intersection_array); /* Remove obsolete intersection array */ g_ptr_array_free(intersection_array, TRUE); } /* Execute transition steps */ if((status = deactivate_obsolete_mappings(deactivation_array, union_array, target_array, old_activation_mappings, no_rollback, dry_run)) == TRANSITION_SUCCESS && (status = activate_new_mappings(activation_array, union_array, target_array, old_activation_mappings, no_rollback, dry_run)) == TRANSITION_SUCCESS); /* Cleanup */ if(old_activation_mappings != NULL) { g_ptr_array_free(deactivation_array, TRUE); g_ptr_array_free(activation_array, TRUE); g_ptr_array_free(union_array, TRUE); } /* Returns the transition status */ return status; }