1.1 --- a/plover-gtk/packageset.c Fri Apr 30 20:37:08 2010 +0100
1.2 +++ b/plover-gtk/packageset.c Thu Nov 10 11:15:09 2011 +0000
1.3 @@ -1,5 +1,5 @@
1.4 /*
1.5 - * Copyright (C) 2010 J. Ali Harlow <ali@juiblex.co.uk>
1.6 + * Copyright (C) 2010, 2011 J. Ali Harlow <ali@juiblex.co.uk>
1.7 *
1.8 * This program is free software; you can redistribute it and/or modify
1.9 * it under the terms of the GNU General Public License as published by
1.10 @@ -21,6 +21,7 @@
1.11 #include <string.h>
1.12 #include <fcntl.h>
1.13 #include <errno.h>
1.14 +#include <unistd.h>
1.15 #include <glib-object.h>
1.16 #include <razor.h>
1.17 #include "plover/plover.h"
1.18 @@ -31,6 +32,7 @@
1.19 G_DEFINE_TYPE(PloverPackageSet,plover_package_set,G_TYPE_OBJECT);
1.20
1.21 typedef struct _PloverPackageSetPrivate {
1.22 + struct razor_atomic *atomic;
1.23 struct razor_root *root;
1.24 struct razor_set *set;
1.25 GSList *packages;
1.26 @@ -53,14 +55,9 @@
1.27 {
1.28 PloverPackageSetPrivate *priv=PLOVER_PACKAGE_SET_GET_PRIVATE(obj);
1.29 if (priv->root)
1.30 - {
1.31 - /* priv->set, if set, is owned by priv->root and should not
1.32 - * be destroyed.
1.33 - */
1.34 razor_root_close(priv->root);
1.35 - }
1.36 - else if (priv->set)
1.37 - razor_set_destroy(priv->set);
1.38 + if (priv->atomic)
1.39 + razor_atomic_destroy(priv->atomic);
1.40 if (G_OBJECT_CLASS(plover_package_set_parent_class)->finalize)
1.41 G_OBJECT_CLASS(plover_package_set_parent_class)->finalize(obj);
1.42 }
1.43 @@ -68,6 +65,11 @@
1.44 static void plover_package_set_dispose(GObject *obj)
1.45 {
1.46 PloverPackageSetPrivate *priv=PLOVER_PACKAGE_SET_GET_PRIVATE(obj);
1.47 + if (priv->set)
1.48 + {
1.49 + razor_set_unref(priv->set);
1.50 + priv->set=NULL;
1.51 + }
1.52 if (G_OBJECT_CLASS(plover_package_set_parent_class)->dispose)
1.53 G_OBJECT_CLASS(plover_package_set_parent_class)->dispose(obj);
1.54 }
1.55 @@ -102,7 +104,8 @@
1.56 PloverPackageSetPrivate *priv;
1.57 set=plover_package_set_new();
1.58 priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set);
1.59 - priv->root=razor_root_open(root);
1.60 + priv->atomic=razor_atomic_open("Read root package set");
1.61 + priv->root=razor_root_open(root,priv->atomic);
1.62 if (!priv->root)
1.63 {
1.64 g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED,
1.65 @@ -110,7 +113,7 @@
1.66 g_object_unref(set);
1.67 return NULL;
1.68 }
1.69 - priv->set=razor_root_get_system_set(priv->root);
1.70 + priv->set=razor_set_ref(razor_root_get_system_set(priv->root));
1.71 if (!priv->set)
1.72 {
1.73 g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED,
1.74 @@ -132,6 +135,7 @@
1.75 #endif
1.76 gchar *s;
1.77 struct razor_set *reloc;
1.78 + struct razor_atomic *atomic;
1.79 PloverPackageSet *set;
1.80 PloverPackageSetPrivate *priv;
1.81 set=plover_package_set_new();
1.82 @@ -164,7 +168,7 @@
1.83 g_free(s);
1.84 priv->set=plover_razor_set_create_from_yum("..");
1.85 #if HAVE_FCHDIR
1.86 - fchdir(fd);
1.87 + (void)fchdir(fd);
1.88 close(fd);
1.89 #else
1.90 chdir(wd);
1.91 @@ -172,8 +176,18 @@
1.92 #endif
1.93 if (priv->set && relocations)
1.94 {
1.95 - reloc=plover_relocate_packages(priv->set,base,relocations);
1.96 - razor_set_destroy(priv->set);
1.97 + atomic=razor_atomic_open("Relocate packages");
1.98 + reloc=plover_relocate_packages(priv->set,atomic,base,relocations);
1.99 + if (!reloc)
1.100 + g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED,
1.101 + razor_atomic_get_error_msg(atomic));
1.102 + razor_atomic_destroy(atomic);
1.103 + if (!reloc)
1.104 + {
1.105 + g_object_unref(set);
1.106 + return NULL;
1.107 + }
1.108 + razor_set_unref(priv->set);
1.109 priv->set=reloc;
1.110 }
1.111 if (!priv->set)