
Hey, On Fri, Dec 23, 2011 at 09:58:23PM +0200, Zeeshan Ali (Khattak) wrote:
From: "Zeeshan Ali (Khattak)" <zeeshanak@gnome.org>
Its just a set of synchronous and asynchronous wrappers around virDomainManagedSave. --- libvirt-gobject/libvirt-gobject-domain.c | 120 ++++++++++++++++++++++++++++++ libvirt-gobject/libvirt-gobject-domain.h | 11 +++ libvirt-gobject/libvirt-gobject.sym | 3 + 3 files changed, 134 insertions(+), 0 deletions(-)
diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index e4963ed..8496257 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -708,3 +708,123 @@ gboolean gvir_domain_suspend (GVirDomain *dom, cleanup: return ret; } + +/** + * gvir_domain_saved_suspend:
_saved_suspend is good for me even though it took me a while to get what it means. Maybe _persistent_suspend would be better? Hopefully this won't turn into some bikeshedding, but since we are not reusing the libvirt naming,I feelt it was worth making an alternate suggestion :)
+ * @dom: the domain to save and suspend + * @flags: extra flags, currently unused + * @err: Place-holder for possible errors + * + * Just like #gvir_domain_suspend but also saves the state of the domain on disk + * and therefore makes it possible to restore the domain to its previous state + * even after shutdown/reboot of host machine. + * + * Returns: TRUE if domain was saved and suspended successfully, FALSE otherwise. + */ +gboolean gvir_domain_saved_suspend (GVirDomain *dom, + unsigned int flags, + GError **err) +{ + gboolean ret = FALSE; + + g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); + + if (virDomainManagedSave(dom->priv->handle, flags) < 0) { + gvir_set_error_literal(err, GVIR_DOMAIN_ERROR, + 0, + "Unable to saved and suspend domain");
"to save" (no -d)
+ goto cleanup; + } + + ret = TRUE; +cleanup: + return ret; +}
Imo, the code would flow more nicely with a return FALSE; in the error case, return TRUE; otherwise, and no cleanup: and gboolean ret. If you prefer it that way, that's fine with me.
+ +typedef struct { + guint flags; +} DomainSavedSuspendData; + +static void +gvir_domain_saved_suspend_helper(GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable G_GNUC_UNUSED) +{ + GVirDomain *dom = GVIR_DOMAIN(object); + DomainSavedSuspendData *data; + GError *err = NULL; + + data = (DomainSavedSuspendData *) g_object_get_data(G_OBJECT(res), + "DomainSavedSuspendData"); + + if (!gvir_domain_saved_suspend(dom, data->flags, &err)) { + g_simple_async_result_set_from_error(res, err); + g_error_free(err);
There's a g_simple_async_result_take_error
+ } + + g_slice_free (DomainSavedSuspendData, data); +} + +/** + * gir_domain_saved_suspend_async: + * @dom: the domain to save and suspend + * @flags: extra flags, currently unused + * @cancellable: (allow-none)(transfer none): cancellation object + * @callback: (scope async): completion callback + * @user_data: (closure): opaque data for callback + * + * Asynchronous variant of #gvir_domain_saved_suspend. + */ +void gvir_domain_saved_suspend_async (GVirDomain *dom, + unsigned int flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + DomainSavedSuspendData *data; + + g_return_if_fail(GVIR_IS_DOMAIN(dom)); + + data = g_new0(DomainSavedSuspendData, 1);
Don't forget to change this to g_slice_new0 as Marc-André and Daniel have pointed out. Rest of the patch looks good to me, so ACK from me. Christophe
+ data->flags = flags; + + res = g_simple_async_result_new(G_OBJECT(dom), + callback, + user_data, + gvir_domain_saved_suspend); + g_object_set_data(G_OBJECT(res), "DomainSavedSuspendData", data); + g_simple_async_result_run_in_thread(res, + gvir_domain_saved_suspend_helper, + G_PRIORITY_DEFAULT, + cancellable); + g_object_unref(res); +} + +/** + * gir_domain_saved_suspend_finish: + * @dom: the domain to save and suspend + * @result: (transfer none): async method result + * @err: Place-holder for possible errors + * + * Finishes the operation started by #gvir_domain_saved_suspend_async. + * + * Returns: TRUE if domain was saved and suspended successfully, FALSE otherwise. + */ +gboolean gvir_domain_saved_suspend_finish (GVirDomain *dom, + GAsyncResult *result, + GError **err) +{ + g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); + g_return_val_if_fail(G_IS_ASYNC_RESULT(result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT(result)) { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT(result); + g_warn_if_fail (g_simple_async_result_get_source_tag(simple) == + gvir_domain_saved_suspend); + if (g_simple_async_result_propagate_error(simple, err)) + return FALSE; + } + + return TRUE; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index a5923f4..96a1560 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -155,6 +155,17 @@ gboolean gvir_domain_open_graphics(GVirDomain *dom,
gboolean gvir_domain_suspend (GVirDomain *dom, GError **err); +gboolean gvir_domain_saved_suspend (GVirDomain *dom, + unsigned int flags, + GError **err); +void gvir_domain_saved_suspend_async (GVirDomain *dom, + unsigned int flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean gvir_domain_saved_suspend_finish (GVirDomain *dom, + GAsyncResult *result, + GError **err);
G_END_DECLS
diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index 526098d..c04d67a 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -52,6 +52,9 @@ LIBVIRT_GOBJECT_0.0.3 { gvir_domain_resume; gvir_domain_stop; gvir_domain_suspend; + gvir_domain_saved_suspend; + gvir_domain_saved_suspend_async; + gvir_domain_saved_suspend_finish; gvir_domain_delete; gvir_domain_open_console; gvir_domain_open_graphics; -- 1.7.7.4
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list