diff options
author | Richard Hughes <richard@hughsie.com> | 2015-02-02 10:12:36 +0000 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2015-02-02 10:12:40 +0000 |
commit | f3ac072bad60ffb43bef2c0d353255ff1c184fba (patch) | |
tree | b9ec66b57a1710c98b1c3d15d44693896f199cec | |
parent | eda6e7c1865501f60e6dc0ced84964f0e1fb9b41 (diff) | |
download | appstream-glib-f3ac072bad60ffb43bef2c0d353255ff1c184fba.tar.gz |
Close the packages after they have been processed
This means we have to re-open the files for the few packages used as
extra-packages to other packages, but means we keep the RSS value to a sane
value for a large number of packages. We can't go above 4GB RSS for Fedora...
This also means we spend less time 'shutting down' as the packages have
typically been released as part of the task, rather when the context exits.
-rw-r--r-- | libappstream-builder/asb-package-rpm.c | 18 | ||||
-rw-r--r-- | libappstream-builder/asb-package.c | 40 | ||||
-rw-r--r-- | libappstream-builder/asb-package.h | 5 | ||||
-rw-r--r-- | libappstream-builder/asb-task.c | 2 |
4 files changed, 63 insertions, 2 deletions
diff --git a/libappstream-builder/asb-package-rpm.c b/libappstream-builder/asb-package-rpm.c index 6a231cb..ad2a372 100644 --- a/libappstream-builder/asb-package-rpm.c +++ b/libappstream-builder/asb-package-rpm.c @@ -59,7 +59,8 @@ asb_package_rpm_finalize (GObject *object) AsbPackageRpm *pkg = ASB_PACKAGE_RPM (object); AsbPackageRpmPrivate *priv = GET_PRIVATE (pkg); - headerFree (priv->h); + if (priv->h != NULL) + headerFree (priv->h); G_OBJECT_CLASS (asb_package_rpm_parent_class)->finalize (object); } @@ -545,6 +546,20 @@ asb_package_rpm_strerror (rpmRC rc) } /** + * asb_package_rpm_close: + **/ +static gboolean +asb_package_rpm_close (AsbPackage *pkg, GError **error) +{ + AsbPackageRpm *pkg_rpm = ASB_PACKAGE_RPM (pkg); + AsbPackageRpmPrivate *priv = GET_PRIVATE (pkg_rpm); + if (priv->h != NULL) + headerFree (priv->h); + priv->h = NULL; + return TRUE; +} + +/** * asb_package_rpm_open: **/ static gboolean @@ -656,6 +671,7 @@ asb_package_rpm_class_init (AsbPackageRpmClass *klass) object_class->finalize = asb_package_rpm_finalize; package_class->open = asb_package_rpm_open; + package_class->close = asb_package_rpm_close; package_class->ensure = asb_package_rpm_ensure; package_class->compare = asb_package_rpm_compare; } diff --git a/libappstream-builder/asb-package.c b/libappstream-builder/asb-package.c index fe8d166..f187ae3 100644 --- a/libappstream-builder/asb-package.c +++ b/libappstream-builder/asb-package.c @@ -40,6 +40,7 @@ struct _AsbPackagePrivate { AsbPackageKind kind; gboolean enabled; + gboolean is_open; gchar **filelist; GPtrArray *deps; gchar *filename; @@ -812,9 +813,14 @@ asb_package_open (AsbPackage *pkg, const gchar *filename, GError **error) AsbPackageClass *klass = ASB_PACKAGE_GET_CLASS (pkg); AsbPackagePrivate *priv = GET_PRIVATE (pkg); + /* already open */ + if (priv->is_open) + return TRUE; + /* cache here */ priv->filename = g_strdup (filename); priv->basename = g_path_get_basename (filename); + priv->is_open = TRUE; /* call distro-specific method */ if (klass->open != NULL) @@ -823,6 +829,34 @@ asb_package_open (AsbPackage *pkg, const gchar *filename, GError **error) } /** + * asb_package_close: + * @pkg: A #AsbPackage + * @error: A #GError or %NULL + * + * Closes a package, which can be re-opened if required. + * + * Returns: %TRUE for success, %FALSE otherwise + * + * Since: 0.3.5 + **/ +gboolean +asb_package_close (AsbPackage *pkg, GError **error) +{ + AsbPackageClass *klass = ASB_PACKAGE_GET_CLASS (pkg); + AsbPackagePrivate *priv = GET_PRIVATE (pkg); + + /* already closed */ + if (!priv->is_open) + return TRUE; + priv->is_open = FALSE; + + /* call distro-specific method */ + if (klass->close != NULL) + return klass->close (pkg, error); + return TRUE; +} + +/** * asb_package_ensure: * @pkg: A #AsbPackage * @flags: #AsbPackageEnsureFlags @@ -842,6 +876,12 @@ asb_package_ensure (AsbPackage *pkg, AsbPackageClass *klass = ASB_PACKAGE_GET_CLASS (pkg); AsbPackagePrivate *priv = GET_PRIVATE (pkg); + /* reopen as required */ + if (!priv->is_open) { + if (!asb_package_open (pkg, priv->filename, error)) + return FALSE; + } + /* clear flags */ if (priv->name != NULL) flags &= ~ASB_PACKAGE_ENSURE_NEVRA; diff --git a/libappstream-builder/asb-package.h b/libappstream-builder/asb-package.h index 53fadf9..6c8b4a5 100644 --- a/libappstream-builder/asb-package.h +++ b/libappstream-builder/asb-package.h @@ -72,6 +72,8 @@ struct _AsbPackageClass GError **error); gint (*compare) (AsbPackage *pkg1, AsbPackage *pkg2); + gboolean (*close) (AsbPackage *pkg, + GError **error); /*< private >*/ void (*_asb_reserved1) (void); void (*_asb_reserved2) (void); @@ -80,7 +82,6 @@ struct _AsbPackageClass void (*_asb_reserved5) (void); void (*_asb_reserved6) (void); void (*_asb_reserved7) (void); - void (*_asb_reserved8) (void); }; typedef enum { @@ -110,6 +111,8 @@ gboolean asb_package_log_flush (AsbPackage *pkg, gboolean asb_package_open (AsbPackage *pkg, const gchar *filename, GError **error); +gboolean asb_package_close (AsbPackage *pkg, + GError **error); gboolean asb_package_ensure (AsbPackage *pkg, AsbPackageEnsureFlags flags, GError **error); diff --git a/libappstream-builder/asb-task.c b/libappstream-builder/asb-task.c index 4aacb99..ad926e7 100644 --- a/libappstream-builder/asb-task.c +++ b/libappstream-builder/asb-task.c @@ -468,6 +468,8 @@ skip: /* update UI */ asb_panel_remove (priv->panel); out: + /* clear loaded resources */ + asb_package_close (priv->pkg, NULL); g_list_free_full (apps, (GDestroyNotify) g_object_unref); return TRUE; } |