diff options
-rw-r--r-- | storage/connect/libdoc.cpp | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/storage/connect/libdoc.cpp b/storage/connect/libdoc.cpp index 31aa90da076..e6046a07c5c 100644 --- a/storage/connect/libdoc.cpp +++ b/storage/connect/libdoc.cpp @@ -8,6 +8,9 @@ #include <libxml/tree.h> #include <libxml/xpath.h> #include <libxml/xpathInternals.h> +#include <libxml/catalog.h> +#include <libxml/xmlschemastypes.h> +#include <libxml/relaxng.h> //#if defined(WIN32) //#include <windows.h> //#else // !WIN32 @@ -290,10 +293,46 @@ if (!rc) /******************************************************************/ /* XML library cleanup function. */ /******************************************************************/ +/* + This is a copy of xmlCleanupParser() from the libxml2 sources + with xmlResetLastError() commented. + + xmlResetLastError() called from the original xmlCleanupParser() causes + valgrind to report memory leaks. This happens because + ha_initialize_handlerton() is called from the main thread in mysqld.cc, + while ha_finalize_handlerton() is called from a non-main thread. + libxml2 gets confused because of xmlInitParser() and xmlCleanupParser() + being called from the different threads. + + Perhaps the code in mysqld.cc should eventually be modified + to shutdown plugins from the main thread. +*/ +static void +xmlCleanupParser_replacement(void) + { + xmlCleanupCharEncodingHandlers(); +#ifdef LIBXML_CATALOG_ENABLED + xmlCatalogCleanup(); +#endif + xmlDictCleanup(); + xmlCleanupInputCallbacks(); +#ifdef LIBXML_OUTPUT_ENABLED + xmlCleanupOutputCallbacks(); +#endif +#ifdef LIBXML_SCHEMAS_ENABLED + xmlSchemaCleanupTypes(); + xmlRelaxNGCleanupTypes(); +#endif + //xmlResetLastError(); + xmlCleanupGlobals(); + xmlCleanupThreads(); /* must be last if called not from the main thread */ + xmlCleanupMemory(); + } + + void XmlCleanupParserLib(void) { - xmlCleanupParser(); - xmlMemoryDump(); + xmlCleanupParser_replacement(); } // end of XmlCleanupParserLib /******************************************************************/ |