GLib-GObject-WARNING **: cannot register existing type...

本文探讨了在 Linux 下使用依赖于 libglib-2.0 和 libgobject-2.0 的共享库时遇到的问题:重复加载库导致无法注册已存在的类型 `WebKitWebView`。文章深入分析了错误发生的原因,并探讨了 g_type_register_static_simple 宏的实现细节。
部署运行你感兴趣的模型镜像

Problem:
When using dl functions under linux, dynamic load shared library,which depends on libglib-2.0 & libgobject-2.0, and close it, everything is ok now; But after  dlopen  the library again, error happened, just as follows:

(app:15420): GLib-GObject-WARNING **: cannot register existing type `WebKitWebView'
(app:15420): GLib-CRITICAL **: g_once_init_leave: assertion `initialization_value != 0' failed.

Solution:

where “cannot register existing type***”  happened?  
@ gtype.c
static gboolean check_type_name_I (const gchar * type_name) {....}
---> g_type_from_name(type_name))
error occured if type_name already exists in static_type_node_ht, but glib don’t give any method to unregister the typename;

the dependency relation is like this:
check_type_name_I <--- g_type_register_static <----  g_type_register_static_simple

@gtype.h
g_type_register_static_simple  is defined in gtype.h
#define G_DEFINE_TYPE(TN, t_n, T_P)             G_DEFINE_TYPE_EXTENDED (TN,
t_n, T_P, 0,
{})

#define G_DEFINE_TYPE_EXTENDED(TN, t_n, T_P, _f_, _C_)
_G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, _f_) {_C_;}
_G_DEFINE_TYPE_EXTENDED_END()

G_DEFINE_TYPE_EXTENDED

@ webkit_web_view.cpp

G_DEFINE_TYPE_EXTENDED
(WebKitWebView,
webkit_web_view,
GTK_TYPE_CONTAINER,
0,
{});

the macro above generate codes:
GType webkit_web_view_get_type
(void)
{

 static volatile gsize g_define_type_id__volatile =
0;

if (g_once_init_enter(&g_define_type_id__volatile))

{

   GType g_define_type_id = g_type_register_static_simple
   (GTK_TYPE_CONTAINER,g_intern_static_string("WebKitWebView"),sizeof(WebKitWebViewClass),
   (GClassInitFunc)webkit_web_view_class_intern_init, sizeof(WebKitWebView),
   (GInstanceInitFunc)webkit_web_view_init,(GTypeFlags) 0);

   g_once_init_leave (&g_define_type_id__volatile,g_define_type_id);
   return g_define_type_id__volatile;
}

WEBKIT_TYPE_WEB_VIEW == webkit_web_view_get_type

when calling webkit_web_view_new , WEBKIT_TYPE_WEB_VIEW is called, that’s why the error occures.

Until now, the problem has been located, but why the shared library was modify (the type info registered exists fater reload), dl mode is not COW ?  i try to load all dependency library to make a copy, still the same....

您可能感兴趣的与本文相关的镜像

EmotiVoice

EmotiVoice

AI应用

EmotiVoice是由网易有道AI算法团队开源的一块国产TTS语音合成引擎,支持中英文双语,包含2000多种不同的音色,以及特色的情感合成功能,支持合成包含快乐、兴奋、悲伤、愤怒等广泛情感的语音。

sh-3.2# gst-inspect-1.0 -b (gst-plugin-scanner:5027): GStreamer-WARNING **: 19:43:08.929: Failed to load plugin '/usr/lib64/gstreamer-1.0/libgstffmpeg.so': /usr/lib64/gstreamer-1.0/libgstffmpeg.so: undefined symbol: get_primary_transferfunc size of instance = 1624 size of class = 1848 size of basesrc = 648 size of basesrcclass = 824 (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.642: cannot register existing type 'GstTypeSMVideoEnc' (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: g_param_spec_enum: assertion 'G_TYPE_IS_ENUM (enum_type)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: validate_pspec_to_install: assertion 'G_IS_PARAM_SPEC (pspec)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: g_param_spec_ref_sink: assertion 'G_IS_PARAM_SPEC (pspec)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: g_param_spec_unref: assertion 'G_IS_PARAM_SPEC (pspec)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: cannot register existing type 'GstTypeSMVideoEncDRM' (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: g_param_spec_enum: assertion 'G_TYPE_IS_ENUM (enum_type)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: validate_pspec_to_install: assertion 'G_IS_PARAM_SPEC (pspec)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: g_param_spec_ref_sink: assertion 'G_IS_PARAM_SPEC (pspec)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: g_param_spec_unref: assertion 'G_IS_PARAM_SPEC (pspec)' failed Blacklisted files: libgstffmpeg.so Total count: 1 blacklisted file
04-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值