由libxml2导致librsvg崩溃?

时间:2013-03-05 03:37:26

标签: libxml2 cairo librsvg

我希望支持将SVG图像渲染为Bitmaps,我正在使用librsvg。到目前为止它运作良好,并使用开罗,万岁!但是我遇到了一个问题:

我们有一个类似于Windows资源管理器的控件,例如它会在目录中创建缩略图大小的文件图像,因此产品将被扩展为生成SVG的缩略图。

它使用后台线程生成缩略图图像,因此UI不会因其工作而被冻结。代码已经生产了很长时间,因此并发问题就没有问题了。但似乎从主线程以外的线程调用rsvg_handle_new()时会发生访问冲突,而不是我使用librsvg时没有问题。

查看堆栈跟踪崩溃似乎发生在xmlSetGlobalState()的libxml2(librsvg的依赖关系)中,问题似乎与此处报告的libxml2 crash on second use on Windows相同,但似乎没有解析度。我会限制我对主线程的使用仅限于我可以,但我坚持使用现有的架构,它会在主线程中产生缩略图。

我发现http://www.xmlsoft.org/threads.html建议首先在主线程中调用xmlInitParser(),这似乎是在创建RsvgHandle期间由librsvg调用的(我认为)。

所以我不确定它是否真的是一个libxml2问题,librsvg使用libxml2的方式有问题,还是我尝试使用librsvg的问题?

任何libxml2或librsvg专家?

2 个答案:

答案 0 :(得分:2)

尽管事实上,malloc()和free()或任何内存处理实现在C< C< C中都不一定是线程安全的。 11,总是存在共享/全局内存的问题。只要它们是只读的,不同线程中同一文件的文件句柄就不会那么糟糕。

但是,从libxml2 2.4.7开始,您可以在API级别启用线程安全性,对于每个文档的单个线程:http://www.xmlsoft.org/threads.html

当我查看libxml2 2.9.1的来源时,我确信线程安全已完全实现,尽管有全局互斥,但它还有一个原子分配函数。

下载:ftp://xmlsoft.org/libxml2

此致 拉比

答案 1 :(得分:0)

100%确保xmlCleanupParser()永远不会在您的代码或任何代码中调用 其他库使用libxml2,它通过假设来破坏全局状态 在整个程序中没有剩余使用解析器。

http://xmlsoft.org/html/libxml-parser.html#xmlCleanupParser

丹尼尔