summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2014-04-29 08:54:39 -0400
committerColin Walters <walters@verbum.org>2014-04-29 10:59:57 -0400
commitf040c02048978945ab82d31ced7c7db565647413 (patch)
tree276cb6b32263b238b7f6ad5fc06499d7ff13788f
parent349083194d2064abf657494a15fc4bf456d80efd (diff)
downloadostree-f040c02048978945ab82d31ced7c7db565647413.tar.gz
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.
-rw-r--r--src/libostree/ostree-async-progress.c44
-rw-r--r--src/libostree/ostree-async-progress.h2
-rw-r--r--src/libostree/ostree-sysroot-upgrader.c3
-rw-r--r--src/ostree/ot-builtin-pull.c3
4 files changed, 49 insertions, 3 deletions
diff --git a/src/libostree/ostree-async-progress.c b/src/libostree/ostree-async-progress.c
index fa7e60b3..96257f48 100644
--- a/src/libostree/ostree-async-progress.c
+++ b/src/libostree/ostree-async-progress.c
@@ -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);
+}
diff --git a/src/libostree/ostree-async-progress.h b/src/libostree/ostree-async-progress.h
index 71b2fba6..66430139 100644
--- a/src/libostree/ostree-async-progress.h
+++ b/src/libostree/ostree-async-progress.h
@@ -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
diff --git a/src/libostree/ostree-sysroot-upgrader.c b/src/libostree/ostree-sysroot-upgrader.c
index b62f8d46..61b6309a 100644
--- a/src/libostree/ostree-sysroot-upgrader.c
+++ b/src/libostree/ostree-sysroot-upgrader.c
@@ -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,
diff --git a/src/ostree/ot-builtin-pull.c b/src/ostree/ot-builtin-pull.c
index b7e4ca40..a29bbb73 100644
--- a/src/ostree/ot-builtin-pull.c
+++ b/src/ostree/ot-builtin-pull.c
@@ -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)