Skip to content

Commit

Permalink
libostree: Add ostree_async_progress_copy_state()
Browse files Browse the repository at this point in the history
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 flatpak/flatpak#3211 for the application of
this API.
  • Loading branch information
ptomato committed Nov 20, 2019
1 parent 382ad59 commit 54639c0
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 0 deletions.
1 change: 1 addition & 0 deletions apidoc/ostree-sections.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
OstreeAsyncProgress
ostree_async_progress_new
ostree_async_progress_new_and_connect
ostree_async_progress_copy_state
ostree_async_progress_get_status
ostree_async_progress_get
ostree_async_progress_get_variant
Expand Down
1 change: 1 addition & 0 deletions src/libostree/libostree-devel.sym
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

/* Add new symbols here. Release commits should copy this section into -released.sym. */
LIBOSTREE_2019.6 {
ostree_async_progress_copy_state;
} LIBOSTREE_2019.4;

/* Stub section for the stable release *after* this development one; don't
Expand Down
34 changes: 34 additions & 0 deletions src/libostree/ostree-async-progress.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
*
Expand Down
4 changes: 4 additions & 0 deletions src/libostree/ostree-async-progress.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,8 @@ void ostree_async_progress_set_variant (OstreeAsyncProgress *self,
_OSTREE_PUBLIC
void ostree_async_progress_finish (OstreeAsyncProgress *self);

_OSTREE_PUBLIC
void ostree_async_progress_copy_state (OstreeAsyncProgress *self,
OstreeAsyncProgress *dest);

G_END_DECLS

0 comments on commit 54639c0

Please sign in to comment.