Re: [xml] xmlDocDump crashing on windows
- From: Igor Zlatkovic <igor zlatkovic com>
 
- To: Eric Zurcher csiro au
 
- Cc: xml gnome org
 
- Subject: Re: [xml] xmlDocDump crashing on windows
 
- Date: Fri, 28 Nov 2003 02:47:24 +0100
 
Eric Zurcher csiro au wrote:
<Igor changed the subject line to fit the thread>
Thanks, Igor. Maybe someday I'll learn to pay a bit more attention...
Hee hee :-)
Sorry, but I don't entirely understand your comments. The libxml2 API/ABI
already provides a set of memory management functions: xmlFree, xmlMalloc,
xmlRealloc, and xmlMemStrdup. I'm not suggesting any changes to these at
all.
Well, my comment was that these are not functions. They are preprocessor 
macros. I was talking about memory functions while you focused on stdin, 
stdout and that gang. I went a bit off track with that, see below for why.
My reference to the memory functions was just an analogy. What I'm proposing
is that, just as libxml2 provides the memory functions, it might also be
useful to have exported functions (or perhaps just variables) for access to
the basic file streams - specifically:
XMLPUBFUN FILE * XMLCALL xmlStdIn(void);
XMLPUBFUN FILE * XMLCALL xmlStdOut(void);
XMLPUBFUN FILE * XMLCALL xmlStdErr(void);
It would also be useful to have:
XMLPUBFUN FILE * XMLCALL xmlFOpen(const char* filename, const char* mode);
XMLPUBFUN int XMLCALL xmlFClose(FILE* stream);
The implementation within libxml2 could be trivial, e.g.:
XMLPUBFUN FILE * XMLCALL xmlStdIn(void) { return stdin; }
>
What would be the point of this? It means that an application would be able
to make a call like:
 xmlDocDump(xmlStdOut(), doc);
instead of:
 xmlDocDump(stdout, doc);
which would still work even when the application and DLL are using totally
different runtimes. My application (perhaps compiled with BCB) would be
telling xmlDocDump to write to the stdout of the DLL (perhaps compiled with
MSVC), not the stdout of my application. 
The main hazard I see is that the returned FILE pointers might not actually
be the sort of FILE pointers that the application would "think" they are. 
That would not be a problem. One pointer is like the other, as long as you 
don't try to dereference it.
Implementing what you suggest above is easy and wouldn't break anything. It 
would perhaps fix the issues with stdin/stdout. but the basic problem, means 
crashing, would still remain. And that precisely because of the malloc/free 
which you wouldn't change. As I posted few days ago, doing a
  xmlFreeDoc(xmlNewDoc("1.0"));
will crash the app if the app and libxml use different runtimes because 
memory functions are incompatible. Fixing these the way you fixed stdin 
would break the ABI. This is where I left the stdin topic and talked about 
memory functions.
See, I can well imagine a full-scaled app which doesn't need or use stdout, 
but not even the hello world atop libxml can avoid the use of memory 
functions. This is why I gave them more weight. What you named just an 
analogy was the main showstopper in my previous post.
We could do what you suggested and in addition have the users call 
xmlMemSetup(), always, before they do anything else. That should redirect 
all memory operations to functions from the app's runtime. Sounds fine, but...
One thing is sure: The users won't call xmlMemSetup, no matter how often you 
write it in the docs and will still fill bug reports about crashing. At 
least for me, the only reason to mess with support for multiple runtimes is 
precisely to avoid those bug reports. And to be honest, if we implement what 
you suggest, most users will still use stdout and complain when the app 
crashes, before they find out that there exists xmlStdOut which should be 
used instead.
When you require an action from the users, you can place a secure bet on 
that the majority won't take it, but will complain about misfunctional 
libxml instead. Therefore, I think a good solution would be the one which 
libxml can handle by itself, without the user's intervention. If I knew of 
one for this particular problem, I would have implemented it long ago.
Well, as it is, the developers will get the flames anyway, so they can as 
well choose a solution which is more convenient for them. The most 
convenient for me was to force msvcrt on everything that runs in the same 
address space with libxml. I choose this way because I saw just 
disadvantages with other runtimes and noone proved that wrong.
I can live very well with your xmlStdOut and the sort. For the reasons 
outlined above, I would suggest a thing: We can do it, if you need it, if 
you will benefit from it. We should not do it for the hope to save the users 
from the runtime issues. It won't help them, it will just give them more 
ground for confusion.
Ciao,
Igor
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]