diff options
-rw-r--r-- | libappstream-glib/as-app.c | 2 | ||||
-rw-r--r-- | libappstream-glib/as-node.c | 4 | ||||
-rw-r--r-- | libappstream-glib/as-ref-string.c | 18 | ||||
-rw-r--r-- | libappstream-glib/as-ref-string.h | 2 | ||||
-rw-r--r-- | libappstream-glib/as-review.c | 2 |
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), |