libostree: Add _finish() API to async progress

Since OstreeAsyncProgress queues to the mainloop, we might "lose" the
last message.  Give callers a way to force a flush.
This commit is contained in:
Colin Walters 2014-04-29 08:54:39 -04:00
parent 349083194d
commit f040c02048
4 changed files with 49 additions and 3 deletions

View File

@ -63,6 +63,8 @@ struct OstreeAsyncProgress
GHashTable *uint_values;
GHashTable *uint64_values;
gboolean dead;
char *status;
};
@ -184,9 +186,12 @@ ostree_async_progress_set_status (OstreeAsyncProgress *self,
const char *status)
{
g_mutex_lock (&self->lock);
g_free (self->status);
self->status = g_strdup (status);
ensure_callback_locked (self);
if (!self->dead)
{
g_free (self->status);
self->status = g_strdup (status);
ensure_callback_locked (self);
}
g_mutex_unlock (&self->lock);
}
@ -211,6 +216,9 @@ update_key (OstreeAsyncProgress *self,
g_mutex_lock (&self->lock);
if (self->dead)
goto out;
if (g_hash_table_lookup_extended (hash, qkey, NULL, &orig_value))
{
if (orig_value == value)
@ -270,3 +278,33 @@ ostree_async_progress_new_and_connect (void (*changed) (OstreeAsyncProgress *sel
g_signal_connect (ret, "changed", G_CALLBACK (changed), user_data);
return ret;
}
/**
* ostree_async_progress_finish:
* @self: Self
*
* Process any pending signals, ensuring the main context is cleared
* of sources used by this object. Also ensures that no further
* events will be queued.
*/
void
ostree_async_progress_finish (OstreeAsyncProgress *self)
{
gboolean emit_changed = FALSE;
g_mutex_lock (&self->lock);
if (!self->dead)
{
self->dead = TRUE;
if (self->idle_source)
{
g_source_destroy (self->idle_source);
self->idle_source = NULL;
emit_changed = TRUE;
}
}
g_mutex_unlock (&self->lock);
if (emit_changed)
g_signal_emit (self, signals[CHANGED], 0);
}

View File

@ -64,5 +64,7 @@ void ostree_async_progress_set_uint64 (OstreeAsyncProgress *self,
const char *key,
guint64 value);
void ostree_async_progress_finish (OstreeAsyncProgress *self);
G_END_DECLS

View File

@ -452,6 +452,9 @@ ostree_sysroot_upgrader_pull (OstreeSysrootUpgrader *self,
flags, progress,
cancellable, error))
goto out;
if (progress)
ostree_async_progress_finish (progress);
}
if (!ostree_repo_resolve_rev (repo, origin_refspec, FALSE, &self->new_revision,

View File

@ -89,6 +89,9 @@ ostree_builtin_pull (int argc, char **argv, OstreeRepo *repo, GCancellable *canc
pullflags, progress, cancellable, error))
goto out;
if (progress)
ostree_async_progress_finish (progress);
ret = TRUE;
out:
if (console)