Hi,
I have some concern about current implementation of Init/Clean.
So really when I init parser it set xmlParserInitialized
flag and eats next attempts to initialize,
For cleanup it checks xmlParserInitialized, and clean up global
state,
But problem is for some sort of addins ( modules that
do not know when they loaded/unloaded ) as well as
COM like DLLs ( Win32 ), it is highly possible to call xmlInitParser/xmlCleanupParser
several times,
and without any order, so call of xmlInitParser in one
thread might be corresponding to call xmlCleanupParser in other thread
which effectively screws everything up.
Proposal is following, use reference count instead, like
increment it every time xmlInitParser called and init only during first attempt,
And decrement it on every xmlCleanupParser call and cleanup
only during last call.
Still xmlInitParser/xmlCleanupParser calls won’t be
thread safe, by the matter of fact user should ensure atomic execution of
these functions, but this is fine and expected.
Any suggestions?
Thanks.
P.S
So code might look like that:
static unsigned int xmlParserInitialized = 0;
xmlInitParser(void) {
if(
!xmlParserInitialized ) {
….//init
here
}
if
( xmlParserInitialized < UINT_MAX )
xmlParserInitialized++;
}
void
xmlCleanupParser(void) {
if(
xmlParserInitialized == 1 ) {
…//clean
up here
}
if( xmlParserInitialized )
xmlParserInitialized--;
}