Сбой librsvg из-за libxml2?

Я хочу поддерживать рендеринг изображений SVG в виде растровых изображений, я использую librsvg. Пока работает хорошо и рисует с помощью Cairo, ура! Однако я столкнулся с проблемой:

У нас есть элемент управления, похожий на проводник Windows, например. он создает миниатюрные изображения файлов в каталоге, поэтому продукт будет расширен для создания миниатюр SVG.

Он использует фоновые потоки для создания миниатюрных изображений, поэтому пользовательский интерфейс не зависает во время работы. Код находится в разработке в течение длительного времени, поэтому проблем с параллелизмом не возникает. Но кажется, что когда rsvg_handle_new() вызывается из потока, отличного от основного потока, возникает нарушение прав доступа, когда это не так, у меня нет проблем с работой с librsvg.

Глядя на трассировку стека, кажется, что сбой происходит в libxml2 (который является зависимостью librsvg) в xmlSetGlobalState(), проблема кажется такой же, как описано здесь сбой libxml2 при втором использовании в Windows, который, похоже, не имеет решения. Я бы ограничил использование библиотеки основным потоком, только если бы мог, но я застрял в этой существующей архитектуре, которая создает эскизы вне основного потока.

Я нашел http://www.xmlsoft.org/threads.html, который предлагает вызвать xmlInitParser( ) в основном потоке сначала, который, кажется, вызывается librsvg во время создания RsvgHandle (я думаю).

Поэтому я не уверен, действительно ли это проблема с libxml2, проблема с тем, как librsvg использует libxml2, или проблема с тем, как я пытаюсь использовать librsvg?

Есть эксперты по libxml2 или librsvg?


person JosephA    schedule 05.03.2013    source источник


Ответы (2)


Несмотря на то, что malloc() и free() или любые другие реализации обработки памяти не обязательно являются потокобезопасными в C ‹ 11, всегда существует проблема разделяемой/глобальной памяти. Файловые дескрипторы одного и того же файла в разных потоках не так уж плохи, если они доступны только для чтения.

Однако, начиная с libxml2 2.4.7, вы можете включить безопасность потоков на уровне API для отдельных потоков на документ: http://www.xmlsoft.org/threads.html

Когда я смотрю на исходники libxml2 2.9.1, я уверен, что безопасность потоков реализована полностью, несмотря на глобальные мьютексы, есть также функция атомарного распределения.

Загрузки: ftp://xmlsoft.org/libxml2

С уважением, Раби

person rabi    schedule 17.05.2014

убедитесь на 100%, что xmlCleanupParser() никогда не вызывается в вашем коде или в любой другой библиотеке, использующей libxml2, она разрушает глобальное состояние, предполагая, что анализатор больше не используется во всей программе.

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

Даниэль

person user2138619    schedule 06.03.2013