/** * hif_state_finalize: **/ static void hif_state_finalize (GObject *object) { HifState *state; g_return_if_fail (object != NULL); g_return_if_fail (HIF_IS_STATE (object)); state = HIF_STATE (object); /* no more locks */ hif_state_release_locks (state); hif_state_reset (state); g_free (state->priv->id); g_free (state->priv->action_hint); g_free (state->priv->step_data); g_free (state->priv->step_profile); if (state->priv->cancellable != NULL) g_object_unref (state->priv->cancellable); g_timer_destroy (state->priv->timer); g_free (state->priv->speed_data); g_ptr_array_unref (state->priv->lock_ids); g_object_unref (state->priv->lock); G_OBJECT_CLASS (hif_state_parent_class)->finalize (object); }
/** * hif_state_done_real: **/ gboolean hif_state_done_real (HifState *state, GError **error, const gchar *strloc) { gboolean ret; gdouble elapsed; gfloat percentage; g_return_val_if_fail (state != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* check */ ret = hif_state_check (state, error); if (!ret) goto out; /* do we care */ if (!state->priv->report_progress) goto out; /* did we call done on a state that did not have a size set? */ if (state->priv->steps == 0) { g_set_error (error, HIF_ERROR, PK_ERROR_ENUM_INTERNAL_ERROR, "done on a state %p that did not have a size set! [%s]", state, strloc); hif_state_print_parent_chain (state, 0); ret = FALSE; goto out; } /* check the interval was too big in allow_cancel false mode */ if (state->priv->enable_profile) { elapsed = g_timer_elapsed (state->priv->timer, NULL); if (!state->priv->allow_cancel_changed_state && state->priv->current > 0) { if (elapsed > 0.1f) { g_warning ("%.1fms between hif_state_done() and no hif_state_set_allow_cancel()", elapsed * 1000); hif_state_print_parent_chain (state, 0); } } /* save the duration in the array */ if (state->priv->step_profile != NULL) state->priv->step_profile[state->priv->current] = elapsed; g_timer_start (state->priv->timer); } /* is already at 100%? */ if (state->priv->current >= state->priv->steps) { g_set_error (error, HIF_ERROR, PK_ERROR_ENUM_INTERNAL_ERROR, "already at 100%% state [%s]", strloc); hif_state_print_parent_chain (state, 0); ret = FALSE; goto out; } /* is child not at 100%? */ if (state->priv->child != NULL) { HifStatePrivate *child_priv = state->priv->child->priv; if (child_priv->current != child_priv->steps) { g_print ("child is at %i/%i steps and parent done [%s]\n", child_priv->current, child_priv->steps, strloc); hif_state_print_parent_chain (state->priv->child, 0); ret = TRUE; /* do not abort, as we want to clean this up */ } } /* we just checked for cancel, so it's not true to say we're blocking */ hif_state_set_allow_cancel (state, TRUE); /* another */ state->priv->current++; /* find new percentage */ if (state->priv->step_data == NULL) { percentage = hif_state_discrete_to_percent (state->priv->current, state->priv->steps); } else { /* this is cumalative, for speedy access */ percentage = state->priv->step_data[state->priv->current - 1]; } hif_state_set_percentage (state, (guint) percentage); /* show any profiling stats */ if (state->priv->enable_profile && state->priv->current == state->priv->steps && state->priv->step_profile != NULL) { hif_state_show_profile (state); } /* reset child if it exists */ if (state->priv->child != NULL) hif_state_reset (state->priv->child); out: return ret; }
/** * hif_sack_add_source: */ gboolean hif_sack_add_source (HySack sack, HifSource *src, guint permissible_cache_age, HifSackAddFlags flags, HifState *state, GError **error) { gboolean ret = TRUE; GError *error_local = NULL; gint rc; HifState *state_local; int flags_hy = HY_BUILD_CACHE; /* set state */ ret = hif_state_set_steps (state, error, 5, /* check repo */ 95, /* load solv */ -1); if (!ret) return FALSE; /* check repo */ state_local = hif_state_get_child (state); ret = hif_source_check (src, permissible_cache_age, state_local, &error_local); if (!ret) { g_debug ("failed to check, attempting update: %s", error_local->message); g_clear_error (&error_local); hif_state_reset (state_local); ret = hif_source_update (src, HIF_SOURCE_UPDATE_FLAG_FORCE, state_local, &error_local); if (!ret) { if (g_error_matches (error_local, HIF_ERROR, HIF_ERROR_CANNOT_FETCH_SOURCE)) { g_warning ("Skipping refresh of %s: %s", hif_source_get_id (src), error_local->message); g_error_free (error_local); return TRUE; } g_propagate_error (error, error_local); return FALSE; } } /* done */ if (!hif_state_done (state, error)) return FALSE; /* only load what's required */ if ((flags & HIF_SACK_ADD_FLAG_FILELISTS) > 0) flags_hy |= HY_LOAD_FILELISTS; if ((flags & HIF_SACK_ADD_FLAG_UPDATEINFO) > 0) flags_hy |= HY_LOAD_UPDATEINFO; /* load solv */ g_debug ("Loading repo %s", hif_source_get_id (src)); hif_state_action_start (state, HIF_STATE_ACTION_LOADING_CACHE, NULL); rc = hy_sack_load_yum_repo (sack, hif_source_get_repo (src), flags_hy); if (rc == HY_E_FAILED) rc = hy_get_errno (); if (!hif_rc_to_gerror (rc, error)) { g_prefix_error (error, "Failed to load repo %s: ", hif_source_get_id (src)); return FALSE; } /* done */ return hif_state_done (state, error); }