mirror of
https://github.com/ostreedev/ostree.git
synced 2025-03-19 22:50:35 +03:00
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:
parent
349083194d
commit
f040c02048
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user