summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2016-11-17 19:40:08 +0000
committerRichard Hughes <richard@hughsie.com>2016-11-21 15:19:55 +0000
commit56a462e8b47c283f8637f1d11c01b68dffd46ef5 (patch)
tree72a81e96633bccf772c5d1ac64a852e60a36445b
parentda6750f328fd099fdd1d8cde59f88c07af692514 (diff)
downloadappstream-glib-56a462e8b47c283f8637f1d11c01b68dffd46ef5.tar.gz
trivial: Add as_ref_string_new_static()
This reduces the number of common duplicate strings like 'C'.
-rw-r--r--libappstream-glib/as-app.c2
-rw-r--r--libappstream-glib/as-node.c4
-rw-r--r--libappstream-glib/as-ref-string.c18
-rw-r--r--libappstream-glib/as-ref-string.h2
-rw-r--r--libappstream-glib/as-review.c2
5 files changed, 24 insertions, 4 deletions
diff --git a/libappstream-glib/as-app.c b/libappstream-glib/as-app.c
index 7d6679b..df702f5 100644
--- a/libappstream-glib/as-app.c
+++ b/libappstream-glib/as-app.c
@@ -4697,7 +4697,7 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags,
if (value == NULL) {
g_hash_table_insert (priv->metadata,
as_ref_string_ref (key),
- as_ref_string_new (""));
+ as_ref_string_new_static (""));
} else {
g_hash_table_insert (priv->metadata,
as_ref_string_ref (key),
diff --git a/libappstream-glib/as-node.c b/libappstream-glib/as-node.c
index ffbdd6b..9277f81 100644
--- a/libappstream-glib/as-node.c
+++ b/libappstream-glib/as-node.c
@@ -1657,7 +1657,7 @@ as_node_get_localized (const AsNode *node, const gchar *key)
const gchar *data_localized;
GHashTable *hash = NULL;
AsNode *tmp;
- g_autoptr(AsRefString) xml_lang_c = as_ref_string_new_copy ("C");
+ g_autoptr(AsRefString) xml_lang_c = as_ref_string_new_static ("C");
/* does it exist? */
tmp = as_node_get_child_node (node, key, NULL, NULL);
@@ -1937,7 +1937,7 @@ as_node_fix_locale (const gchar *locale)
AsRefString *tmp;
if (locale == NULL)
- return as_ref_string_new ("C");
+ return as_ref_string_new_static ("C");
if (g_strcmp0 (locale, "xx") == 0)
return NULL;
if (g_strcmp0 (locale, "x-test") == 0)
diff --git a/libappstream-glib/as-ref-string.c b/libappstream-glib/as-ref-string.c
index e902713..949e327 100644
--- a/libappstream-glib/as-ref-string.c
+++ b/libappstream-glib/as-ref-string.c
@@ -63,6 +63,18 @@ as_ref_string_get_hash (void)
}
/**
+ * as_ref_string_new_static:
+ * @str: a string
+ *
+ * Returns a refcounted string from a static string. The static string cannot
+ * be unloaded and freed.
+ *
+ * Returns: a %AsRefString
+ *
+ * Since: 0.6.6
+ */
+
+/**
* as_ref_string_new_copy_with_length:
* @str: a string
* @len: length of @str, not including the NUL byte
@@ -136,6 +148,8 @@ as_ref_string_new_with_length (const gchar *str, gsize len)
/* already in hash */
if (g_hash_table_contains (hash, str)) {
hdr = AS_REFPTR_TO_HEADER (str);
+ if (hdr->refcnt < 0)
+ return str;
g_atomic_int_inc (&hdr->refcnt);
return str;
}
@@ -176,6 +190,8 @@ as_ref_string_ref (AsRefString *rstr)
AsRefStringHeader *hdr;
g_return_val_if_fail (rstr != NULL, NULL);
hdr = AS_REFPTR_TO_HEADER (rstr);
+ if (hdr->refcnt < 0)
+ return rstr;
g_atomic_int_inc (&hdr->refcnt);
return rstr;
}
@@ -198,6 +214,8 @@ as_ref_string_unref (AsRefString *rstr)
g_return_val_if_fail (rstr != NULL, NULL);
hdr = AS_REFPTR_TO_HEADER (rstr);
+ if (hdr->refcnt < 0)
+ return rstr;
if (g_atomic_int_dec_and_test (&hdr->refcnt)) {
GHashTable *hash = as_ref_string_get_hash ();
g_hash_table_remove (hash, rstr);
diff --git a/libappstream-glib/as-ref-string.h b/libappstream-glib/as-ref-string.h
index 79f26d9..5c242ac 100644
--- a/libappstream-glib/as-ref-string.h
+++ b/libappstream-glib/as-ref-string.h
@@ -48,6 +48,8 @@ typedef enum {
AS_REF_STRING_DEBUG_LAST
} AsRefStringDebugFlags;
+#define as_ref_string_new_static(o) (("\xff\xff\xff\xff" o) + 4)
+
AsRefString *as_ref_string_new (const gchar *str);
AsRefString *as_ref_string_new_with_length (const gchar *str,
gsize len);
diff --git a/libappstream-glib/as-review.c b/libappstream-glib/as-review.c
index 4a1c5c9..fec2500 100644
--- a/libappstream-glib/as-review.c
+++ b/libappstream-glib/as-review.c
@@ -963,7 +963,7 @@ as_review_node_parse (AsReview *review, GNode *node,
if (value == NULL) {
g_hash_table_insert (priv->metadata,
as_ref_string_ref (key),
- as_ref_string_new (""));
+ as_ref_string_new_static (""));
} else {
g_hash_table_insert (priv->metadata,
as_ref_string_ref (key),