summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2015-02-02 10:12:36 +0000
committerRichard Hughes <richard@hughsie.com>2015-02-02 10:12:40 +0000
commitf3ac072bad60ffb43bef2c0d353255ff1c184fba (patch)
treeb9ec66b57a1710c98b1c3d15d44693896f199cec
parenteda6e7c1865501f60e6dc0ced84964f0e1fb9b41 (diff)
downloadappstream-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.c18
-rw-r--r--libappstream-builder/asb-package.c40
-rw-r--r--libappstream-builder/asb-package.h5
-rw-r--r--libappstream-builder/asb-task.c2
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;
}