mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-08-23 01:18:53 +02:00
Merge branch 'wip/chergert/fix-3664' into 'main'
girepository: add singleton GIRepository back Closes #3664 See merge request GNOME/glib!4630
This commit is contained in:
@@ -2271,3 +2271,33 @@ gi_typelib_blob_type_to_info_type (GITypelibBlobType blob_type)
|
||||
return (GIInfoType) blob_type;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gi_repository_dup_default:
|
||||
*
|
||||
* Gets the singleton process-global default `GIRepository`.
|
||||
*
|
||||
* The singleton is needed for situations where you must coordinate between
|
||||
* bindings and libraries which also need to interact with introspection which
|
||||
* could affect the bindings. For example, a Python application using a
|
||||
* GObject-based library through `GIRepository` to load plugins also written in
|
||||
* Python.
|
||||
*
|
||||
* Returns: (transfer full): the global singleton repository
|
||||
*
|
||||
* Since: 2.86
|
||||
*/
|
||||
GIRepository *
|
||||
gi_repository_dup_default (void)
|
||||
{
|
||||
static GIRepository *instance;
|
||||
|
||||
if (g_once_init_enter (&instance))
|
||||
{
|
||||
GIRepository *repository = gi_repository_new ();
|
||||
g_object_add_weak_pointer (G_OBJECT (repository), (gpointer *)&instance);
|
||||
g_once_init_leave (&instance, repository);
|
||||
}
|
||||
|
||||
return g_object_ref (instance);
|
||||
}
|
||||
|
@@ -242,6 +242,9 @@ void gi_cclosure_marshal_generic (GClosure *closure,
|
||||
void *invocation_hint,
|
||||
void *marshal_data);
|
||||
|
||||
GI_AVAILABLE_IN_2_86
|
||||
GIRepository *gi_repository_dup_default (void);
|
||||
|
||||
#include <girepository/girepository-autocleanups.h>
|
||||
|
||||
G_END_DECLS
|
||||
|
@@ -895,6 +895,20 @@ test_repository_loaded_namespaces (RepositoryFixture *fx,
|
||||
g_strfreev (namespaces);
|
||||
}
|
||||
|
||||
static void
|
||||
test_repository_dup_default (void)
|
||||
{
|
||||
GIRepository *repository1 = gi_repository_dup_default ();
|
||||
GIRepository *repository2 = gi_repository_dup_default ();
|
||||
|
||||
g_assert_nonnull (repository1);
|
||||
g_assert_nonnull (repository2);
|
||||
g_assert_true (repository1 == repository2);
|
||||
|
||||
g_clear_object (&repository1);
|
||||
g_clear_object (&repository2);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc,
|
||||
char *argv[])
|
||||
@@ -924,6 +938,7 @@ main (int argc,
|
||||
ADD_REPOSITORY_TEST ("/repository/vfunc-info-with-invoker-on-object", test_repository_vfunc_info_with_invoker_on_object, &typelib_load_spec_gio);
|
||||
ADD_REPOSITORY_TEST ("/repository/find-by-gtype", test_repository_find_by_gtype, &typelib_load_spec_gio_platform);
|
||||
ADD_REPOSITORY_TEST ("/repository/loaded-namespaces", test_repository_loaded_namespaces, &typelib_load_spec_gio_platform);
|
||||
g_test_add_func ("/repository/dup_default", test_repository_dup_default);
|
||||
|
||||
return g_test_run ();
|
||||
}
|
||||
|
Reference in New Issue
Block a user