diff -r 8b50be3e2998 -r 06caf639d95e plover-gtk/packageset.c --- a/plover-gtk/packageset.c Fri Apr 30 20:37:08 2010 +0100 +++ b/plover-gtk/packageset.c Thu Nov 10 11:19:34 2011 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 J. Ali Harlow + * Copyright (C) 2010, 2011 J. Ali Harlow * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include "plover/plover.h" @@ -31,6 +32,7 @@ G_DEFINE_TYPE(PloverPackageSet,plover_package_set,G_TYPE_OBJECT); typedef struct _PloverPackageSetPrivate { + struct razor_atomic *atomic; struct razor_root *root; struct razor_set *set; GSList *packages; @@ -53,14 +55,9 @@ { PloverPackageSetPrivate *priv=PLOVER_PACKAGE_SET_GET_PRIVATE(obj); if (priv->root) - { - /* priv->set, if set, is owned by priv->root and should not - * be destroyed. - */ razor_root_close(priv->root); - } - else if (priv->set) - razor_set_destroy(priv->set); + if (priv->atomic) + razor_atomic_destroy(priv->atomic); if (G_OBJECT_CLASS(plover_package_set_parent_class)->finalize) G_OBJECT_CLASS(plover_package_set_parent_class)->finalize(obj); } @@ -68,6 +65,11 @@ static void plover_package_set_dispose(GObject *obj) { PloverPackageSetPrivate *priv=PLOVER_PACKAGE_SET_GET_PRIVATE(obj); + if (priv->set) + { + razor_set_unref(priv->set); + priv->set=NULL; + } if (G_OBJECT_CLASS(plover_package_set_parent_class)->dispose) G_OBJECT_CLASS(plover_package_set_parent_class)->dispose(obj); } @@ -102,7 +104,8 @@ PloverPackageSetPrivate *priv; set=plover_package_set_new(); priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set); - priv->root=razor_root_open(root); + priv->atomic=razor_atomic_open("Read root package set"); + priv->root=razor_root_open(root,priv->atomic); if (!priv->root) { g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED, @@ -110,7 +113,7 @@ g_object_unref(set); return NULL; } - priv->set=razor_root_get_system_set(priv->root); + priv->set=razor_set_ref(razor_root_get_system_set(priv->root)); if (!priv->set) { g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED, @@ -132,6 +135,7 @@ #endif gchar *s; struct razor_set *reloc; + struct razor_atomic *atomic; PloverPackageSet *set; PloverPackageSetPrivate *priv; set=plover_package_set_new(); @@ -164,7 +168,7 @@ g_free(s); priv->set=plover_razor_set_create_from_yum(".."); #if HAVE_FCHDIR - fchdir(fd); + (void)fchdir(fd); close(fd); #else chdir(wd); @@ -172,8 +176,18 @@ #endif if (priv->set && relocations) { - reloc=plover_relocate_packages(priv->set,base,relocations); - razor_set_destroy(priv->set); + atomic=razor_atomic_open("Relocate packages"); + reloc=plover_relocate_packages(priv->set,atomic,base,relocations); + if (!reloc) + g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED, + razor_atomic_get_error_msg(atomic)); + razor_atomic_destroy(atomic); + if (!reloc) + { + g_object_unref(set); + return NULL; + } + razor_set_unref(priv->set); priv->set=reloc; } if (!priv->set)