diff options
author | Richard Hughes <richard@hughsie.com> | 2016-11-17 21:56:09 +0000 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2016-11-18 20:22:31 +0000 |
commit | 6dd936da1aae4c809c4aa6b0e237eaf790dcc6db (patch) | |
tree | 9d190d808fbdaf70214d860ee5453f2b7b9bc3a1 | |
parent | dd0fb09e8bbdaa8961caad2e5169bdda6b49b6d9 (diff) | |
download | appstream-glib-6dd936da1aae4c809c4aa6b0e237eaf790dcc6db.tar.gz |
Allocate the release sizes at runtime
Saves 81Kb of RSS.
-rw-r--r-- | libappstream-glib/as-release.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/libappstream-glib/as-release.c b/libappstream-glib/as-release.c index 15be5bf..35694c2 100644 --- a/libappstream-glib/as-release.c +++ b/libappstream-glib/as-release.c @@ -51,7 +51,7 @@ typedef struct { AsUrgencyKind urgency; AsReleaseState state; - guint64 size[AS_SIZE_KIND_LAST]; + guint64 *sizes; AsRefString *version; GHashTable *blobs; /* of AsRefString:GBytes */ GHashTable *descriptions; @@ -70,6 +70,7 @@ as_release_finalize (GObject *object) AsRelease *release = AS_RELEASE (object); AsReleasePrivate *priv = GET_PRIVATE (release); + g_free (priv->sizes); if (priv->version != NULL) as_ref_string_unref (priv->version); if (priv->blobs != NULL) @@ -88,12 +89,8 @@ static void as_release_init (AsRelease *release) { AsReleasePrivate *priv = GET_PRIVATE (release); - guint i; - priv->urgency = AS_URGENCY_KIND_UNKNOWN; priv->state = AS_RELEASE_STATE_UNKNOWN; - for (i = 0; i < AS_SIZE_KIND_LAST; i++) - priv->size[i] = 0; } static void @@ -106,6 +103,15 @@ as_release_ensure_checksums (AsRelease *release) } static void +as_release_ensure_sizes (AsRelease *release) +{ + AsReleasePrivate *priv = GET_PRIVATE (release); + if (priv->sizes != NULL) + return; + priv->sizes = g_new0 (guint64, AS_SIZE_KIND_LAST); +} + +static void as_release_ensure_locations (AsRelease *release) { AsReleasePrivate *priv = GET_PRIVATE (release); @@ -180,7 +186,9 @@ as_release_get_size (AsRelease *release, AsSizeKind kind) AsReleasePrivate *priv = GET_PRIVATE (release); if (kind >= AS_SIZE_KIND_LAST) return 0; - return priv->size[kind]; + if (priv->sizes == NULL) + return 0; + return priv->sizes[kind]; } /** @@ -199,7 +207,8 @@ as_release_set_size (AsRelease *release, AsSizeKind kind, guint64 size) AsReleasePrivate *priv = GET_PRIVATE (release); if (kind >= AS_SIZE_KIND_LAST) return; - priv->size[kind] = size; + as_release_ensure_sizes (release); + priv->sizes[kind] = size; } /** @@ -630,15 +639,17 @@ as_release_node_insert (AsRelease *release, GNode *parent, AsNodeContext *ctx) } /* add sizes */ - for (i = 0; i < AS_SIZE_KIND_LAST; i++) { - g_autofree gchar *size_str = NULL; - if (priv->size[i] == 0) - continue; - size_str = g_strdup_printf ("%" G_GUINT64_FORMAT, priv->size[i]); - as_node_insert (n, "size", size_str, - AS_NODE_INSERT_FLAG_NONE, - "type", as_size_kind_to_string (i), - NULL); + if (priv->sizes != NULL) { + for (i = 0; i < AS_SIZE_KIND_LAST; i++) { + g_autofree gchar *size_str = NULL; + if (priv->sizes[i] == 0) + continue; + size_str = g_strdup_printf ("%" G_GUINT64_FORMAT, priv->sizes[i]); + as_node_insert (n, "size", size_str, + AS_NODE_INSERT_FLAG_NONE, + "type", as_size_kind_to_string (i), + NULL); + } } return n; } @@ -719,7 +730,8 @@ as_release_node_parse (AsRelease *release, GNode *node, tmp = as_node_get_data (n); if (tmp == NULL) continue; - priv->size[kind] = g_ascii_strtoull (tmp, NULL, 10); + as_release_ensure_sizes (release); + priv->sizes[kind] = g_ascii_strtoull (tmp, NULL, 10); } /* AppStream: multiple <description> tags */ |