libostree: Add ostree_async_progress_copy_state()

This allows copying the state from one OstreeAsyncProgress object to
another, atomically, without invoking the callback. This is needed in
libflatpak, in order to chain OstreeAsyncProgress objects so that you
can still receive progress updates when iterating a different
GMainContext than the one that the OstreeAsyncProgress object was
created under.

See https://github.com/flatpak/flatpak/pull/3211 for the application of
this API.
This commit is contained in:
Philip Chimento committed 2019-11-20 12:24:26 -08:00
1 parent 382ad59822
commit 54639c03ca
4 files changed
+40

No files matched your search

+34
View File
@@ -424,6 +424,40 @@ ostree_async_progress_set_uint64 (OstreeAsyncProgress *self,
ostree_async_progress_set_variant (self, key, g_variant_new_uint64 (value));
}
/**
* ostree_async_progress_copy_state:
* @self: An #OstreeAsyncProgress to copy from
* @dest: An #OstreeAsyncProgress to copy to
*
* Atomically copies all the state from @self to @dest, without invoking the
* callback.
* This is used for proxying progress objects across different #GMainContexts.
*
* Since: 2019.6
*/
void
ostree_async_progress_copy_state (OstreeAsyncProgress *self,
OstreeAsyncProgress *dest)
{
g_return_if_fail (OSTREE_IS_ASYNC_PROGRESS (self));
g_return_if_fail (OSTREE_IS_ASYNC_PROGRESS (dest));
g_mutex_lock (&self->lock);
if (self->dead)
goto out;
GLNX_HASH_TABLE_FOREACH_KV (self->values, void *, key, GVariant *, value)
{
if (value)
g_variant_ref (value);
g_hash_table_replace (dest->values, key, value);
}
out:
g_mutex_unlock (&self->lock);
}
/**
* ostree_async_progress_new:
*