0

Libxml2を使用してXMLファイルの読み取り/書き込みを行っています。XMLのロード中にlibxmlエラーをキャッチするために、私はxmlSetGenericErrorFuncを使用しています。

void Myclass::load(const std::string &filename)
{
    xmlGenericErrorFunc handler = (xmlGenericErrorFunc) catchErrors;
    xmlSetGenericErrorFunc(this, handler); //context pointer, error handler
}

コンテキストとエラーハンドラのリセットは、次のように実行できます。

xmlSetGenericErrorFunc(NULL, NULL); 

私のラッパーライブラリは多くのプロセスで使用されています。Libxml2は.soファイルです。

エラーハンドラでコンテキストポインタを使用する場合、コンテキストポインタをリセットせずに一部のプロセスが停止し、他のプロセスで解析エラーが発生すると、クラッシュする可能性はありますか?libxmlはデッドポインタでエラーコールバックを呼び出すことができますか?

どんな助けでもいただければ幸いです。ありがとうございました。

4

1 に答える 1

2

ソースを見た後:

まず、libxml が LIBXML_THREAD_ENABLED でコンパイルされているかどうかを確認します。で確認すると、次のように表示xmllint -versionされます。compiled with: Threads ...

xmlSetGenericErrorFunc(error.c から) セットxmlGenericError(globals.h で定義) は、(スレッドが有効な場合)xmlGlobalState構造体の一部として宣言されます。

現在、xmlGetGlobalStateのドキュメントには、スレッドごとに状態が個別に保持されていることが明確に記載されています。

したがって、理論的には、スレッドは互いに影響を与えないため、あるスレッドでエラー ハンドラを設定しても、別のスレッドの動作は変わらないことに注意する必要があります。そして、あなたは安全な側にいるようです。

于 2012-10-24T18:59:17.427 に答える