plover-gtk/packageset.c
changeset 14 29d8bb64056c
parent 10 8b50be3e2998
child 19 5cafc65a6183
     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:19:34 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)