summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Playfair Cal <daniel.playfair.cal@gmail.com>2019-07-08 04:30:56 +0000
committerDaniel Playfair Cal <daniel.playfair.cal@gmail.com>2019-07-08 04:30:56 +0000
commit1b201175cdd37bca8e54d3b4d3d5ef235d6b41ae (patch)
tree751ce0b19f257e77737ac7b696301eb4b4e890eb
parentf5fe1b501e25ba8ec34c057df0833dcc27b8280a (diff)
parent46a33a077d1519dcab558841b076e6fbac6e84d9 (diff)
downloaddconf-1b201175cdd37bca8e54d3b4d3d5ef235d6b41ae.tar.gz
Merge branch 'wip/lantw/use-weak-symbols-in-gvdb' into 'master'
build: Use weak bindings in gvdb to fix linking with LLD Closes #47 See merge request GNOME/dconf!28
-rw-r--r--gvdb/gvdb-reader.c13
-rw-r--r--gvdb/gvdb-reader.h37
-rw-r--r--gvdb/meson.build1
-rw-r--r--service/dconf-gvdb-utils.c4
-rw-r--r--tests/dconf-mock-gvdb.c2
-rw-r--r--tests/gvdb.c12
6 files changed, 44 insertions, 25 deletions
diff --git a/gvdb/gvdb-reader.c b/gvdb/gvdb-reader.c
index aa3154f..9509388 100644
--- a/gvdb/gvdb-reader.c
+++ b/gvdb/gvdb-reader.c
@@ -332,7 +332,7 @@ gvdb_table_list_from_item (GvdbTable *table,
/**
* gvdb_table_get_names:
* @table: a #GvdbTable
- * @length: the number of items returned, or %NULL
+ * @length: (optional): the number of items returned, or %NULL
*
* Gets a list of all names contained in @table.
*
@@ -344,11 +344,11 @@ gvdb_table_list_from_item (GvdbTable *table,
* above calls in the case of the corrupted file. Note also that the
* returned strings may not be utf8.
*
- * Returns: a %NULL-terminated list of strings, of length @length
+ * Returns: (array length=length): a %NULL-terminated list of strings, of length @length
**/
gchar **
gvdb_table_get_names (GvdbTable *table,
- gint *length)
+ gsize *length)
{
gchar **names;
gint n_names;
@@ -462,7 +462,7 @@ gvdb_table_get_names (GvdbTable *table,
{
GPtrArray *fixed_names;
- fixed_names = g_ptr_array_new ();
+ fixed_names = g_ptr_array_sized_new (n_names);
for (i = 0; i < n_names; i++)
if (names[i] != NULL)
g_ptr_array_add (fixed_names, names[i]);
@@ -474,7 +474,10 @@ gvdb_table_get_names (GvdbTable *table,
}
if (length)
- *length = n_names;
+ {
+ G_STATIC_ASSERT (sizeof (*length) >= sizeof (n_names));
+ *length = n_names;
+ }
return names;
}
diff --git a/gvdb/gvdb-reader.h b/gvdb/gvdb-reader.h
index 3982773..79a97d3 100644
--- a/gvdb/gvdb-reader.h
+++ b/gvdb/gvdb-reader.h
@@ -22,40 +22,55 @@
#include <glib.h>
+/* We cannot enable the weak attribute unconditionally here because both
+ * gvdb/gvdb-reader.c and tests/dconf-mock-gvdb.c include this file. The
+ * intention of using weak symbols here is to allow the latter to override
+ * functions defined in the former, so functions in tests/dconf-mock-gvdb.c
+ * must have strong bindings. */
+#ifdef GVDB_USE_WEAK_SYMBOLS
+# ifdef __GNUC__
+# define GVDB_GNUC_WEAK __attribute__((weak))
+# else
+# define GVDB_GNUC_WEAK
+# endif
+#else
+# define GVDB_GNUC_WEAK
+#endif
+
typedef struct _GvdbTable GvdbTable;
G_BEGIN_DECLS
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
GvdbTable * gvdb_table_new_from_bytes (GBytes *bytes,
gboolean trusted,
GError **error);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
GvdbTable * gvdb_table_new (const gchar *filename,
gboolean trusted,
GError **error);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
void gvdb_table_free (GvdbTable *table);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
gchar ** gvdb_table_get_names (GvdbTable *table,
- gint *length);
-G_GNUC_INTERNAL
+ gsize *length);
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
gchar ** gvdb_table_list (GvdbTable *table,
const gchar *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
GvdbTable * gvdb_table_get_table (GvdbTable *table,
const gchar *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
GVariant * gvdb_table_get_raw_value (GvdbTable *table,
const gchar *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
GVariant * gvdb_table_get_value (GvdbTable *table,
const gchar *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
gboolean gvdb_table_has_value (GvdbTable *table,
const gchar *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
gboolean gvdb_table_is_valid (GvdbTable *table);
G_END_DECLS
diff --git a/gvdb/meson.build b/gvdb/meson.build
index 1a1aba8..6b98825 100644
--- a/gvdb/meson.build
+++ b/gvdb/meson.build
@@ -10,6 +10,7 @@ gvdb_deps = [
cflags = [
'-DG_LOG_DOMAIN="gvdb (via dconf)"',
'-DG_LOG_USE_STRUCTURED=1',
+ '-DGVDB_USE_WEAK_SYMBOLS',
]
libgvdb = static_library(
diff --git a/service/dconf-gvdb-utils.c b/service/dconf-gvdb-utils.c
index 93a4719..d77ae97 100644
--- a/service/dconf-gvdb-utils.c
+++ b/service/dconf-gvdb-utils.c
@@ -102,8 +102,8 @@ dconf_gvdb_utils_read_and_back_up_file (const gchar *filename,
if (table != NULL)
{
gchar **names;
- gint n_names;
- gint i;
+ gsize n_names;
+ gsize i;
names = gvdb_table_get_names (table, &n_names);
for (i = 0; i < n_names; i++)
diff --git a/tests/dconf-mock-gvdb.c b/tests/dconf-mock-gvdb.c
index 4f58de1..174bd71 100644
--- a/tests/dconf-mock-gvdb.c
+++ b/tests/dconf-mock-gvdb.c
@@ -170,7 +170,7 @@ gvdb_table_list (GvdbTable *table,
gchar **
gvdb_table_get_names (GvdbTable *table,
- gint *length)
+ gsize *length)
{
if (length)
*length = 0;
diff --git a/tests/gvdb.c b/tests/gvdb.c
index d054067..765f4b8 100644
--- a/tests/gvdb.c
+++ b/tests/gvdb.c
@@ -35,8 +35,8 @@ test_reader_empty (void)
GError *error = NULL;
GvdbTable *table;
gchar **names;
- gint n_names;
- gint i;
+ gsize n_names;
+ gsize i;
table = gvdb_table_new (SRCDIR "/gvdbs/empty_gvdb", TRUE, &error);
g_assert_no_error (error);
@@ -85,7 +85,7 @@ verify_table (GvdbTable *table)
{
GVariant *value;
gchar **list;
- gint n_names;
+ gsize n_names;
gboolean has;
/* We could not normally expect these to be in a particular order but
@@ -221,7 +221,7 @@ test_nested (void)
GvdbTable *table;
GvdbTable *locks;
gchar **names;
- gint n_names;
+ gsize n_names;
gboolean has;
table = gvdb_table_new (SRCDIR "/gvdbs/nested_gvdb", TRUE, &error);
@@ -277,8 +277,8 @@ inspect_carefully (GvdbTable *table,
};
gint found_items;
gchar **names;
- gint n_names;
- gint i;
+ gsize n_names;
+ gsize i;
if (level > 100)
return;