2013-03-05 4 views
0

Je cherche à soutenir le rendu des images SVG en Bitmaps, j'utilise librsvg. Jusqu'à présent cela fonctionne bien et dessine en utilisant Cairo, hourra! Cependant, j'ai rencontré un problème:crash de librsvg dû à libxml2?

Nous avons un contrôle similaire à Windows Explorer, par ex. il crée des images de la taille d'une vignette de fichiers dans un répertoire, de sorte que le produit serait étendu pour générer des vignettes de fichiers SVG.

Il utilise des threads d'arrière-plan pour générer les images miniatures afin que l'interface utilisateur ne soit pas gelée car elle fonctionne. Le code a été en production depuis longtemps, donc pas de problème en ce qui concerne les problèmes de concurrence. Mais il semble que quand rsvg_handle_new() est appelée à partir d'un thread autre que le thread principal, une violation d'accès se produit, quand ce n'est pas le cas je n'ai aucun problème à travailler avec librsvg.

regardant la pile trace l'accident semble se produire dans libxml2 (qui est une dépendance de librsvg) à xmlSetGlobalState(), le problème semble le même que celui rapporté ici libxml2 crash on second use on Windows qui ne semble pas avoir une résolution. Je limiterais mon utilisation de la librairie au thread principal seulement si je le pouvais, mais je suis coincé avec cette architecture existante qui produit les vignettes du thread principal.

J'ai trouvé http://www.xmlsoft.org/threads.html qui suggère d'appeler xmlInitParser() dans le thread principal en premier, qui semble être appelé par librsvg pendant la création de RsvgHandle (je pense).

Donc je ne sais pas si c'est vraiment un problème libxml2, un problème avec la façon dont librsvg utilise libxml2, ou un problème avec la façon dont j'essaie d'utiliser librsvg?

Tous les experts libxml2 ou librsvg?

Répondre

2

Malgré le fait que malloc() et free() ou quelle que soit implémentations gestion de la mémoire ne sont pas thread nécessairement sans danger en C < 11, il y a toujours le problème de la mémoire partagée/global . Les handles de fichiers vers le même fichier dans différents threads ne sont pas si mauvais tant qu'ils sont en lecture seule.

Cependant, en commençant par libxml2 2.4.7, vous pourriez être en mesure de permettre la sécurité des threads au niveau de l'API, pour les fils simples par document: http://www.xmlsoft.org/threads.html

Quand je regarde les sources de libxml2 2.9.1, je Je suis sûr que la sécurité des threads est entièrement implémentée, malgré les mutex globaux, il y a aussi une fonction d'allocation atomique.

Téléchargements: ftp://xmlsoft.org/libxml2

Cordialement, Rabi