DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT <http://nagoya.apache.org/bugzilla/show_bug.cgi?id=13610>. ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=13610 Multiple Threads using XalanTransformer::transform() cause coredump Summary: Multiple Threads using XalanTransformer::transform() cause coredump Product: XalanC Version: 1.4.x Platform: HP OS/Version: HP-UX Status: NEW Severity: Major Priority: Other Component: XalanC AssignedTo: [EMAIL PROTECTED] ReportedBy: [EMAIL PROTECTED] Hello, I have a small test application (HP-UX 11.00), which starts several threads. Each of them creates an instance of the XalanTransformer class: pTransformer = new XalanTransformer(); and then repeatedly calls the XalanTransformer::transform() method. // ---- a file to file transformation iRes = pTransformer->transform( svXMLName, svXSLName, svOutName ); The application crashes after several transformations. It crashes usually faster when using more than 2 threads, but the following call stack is the case of just 2 threads. It happens when using memory streams as well, it doesn't core when using precompiled stylesheets. I have the same problem when using Xalan version 1.3. I was able to reproduce the core with different stylesheets. * The call stack: ----------------- Thread 1: #0 0xdc400fc8 in rb_tree<ElemTemplateElement *,ElemTemplateElement *,ident<ElemTemplateElement *,ElemTemplateElement *>,less<ElemTemplateElement *>,allocator>::erase () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan- c1_4_0.sl #1 0xdc400e48 in rb_tree<ElemTemplateElement *,ElemTemplateElement *,ident<ElemTemplateElement *,ElemTemplateElement *>,less<ElemTemplateElement *>,allocator>::erase () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan- c1_4_0.sl #2 0xdc409138 in rb_tree<ElemTemplateElement *,ElemTemplateElement *,ident<ElemTemplateElement *,ElemTemplateElement *>,less<ElemTemplateElement *>,allocator>::erase () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan- c1_4_0.sl #3 0xdc415430 in StylesheetHandler::endElement () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan-c1_4_0.sl #4 0xdbe52ff4 in SAXParser::endElement () from /homedev/mvasice/x1.4/xerces- c2_1_0-HP11ACC/lib/libxerces-c.sl.21 #5 0xdbeb0e08 in XMLScanner::scanEndTag () from /homedev/mvasice/x1.4/xerces- c2_1_0-HP11ACC/lib/libxerces-c.sl.21 #6 0xdbeb040c in XMLScanner::scanContent () from /homedev/mvasice/x1.4/xerces- c2_1_0-HP11ACC/lib/libxerces-c.sl.21 #7 0xdbead630 in XMLScanner::scanDocument () from /homedev/mvasice/x1.4/xerces- c2_1_0-HP11ACC/lib/libxerces-c.sl.21 #8 0xdbe523d4 in SAXParser::parse () from /homedev/mvasice/x1.4/xerces-c2_1_0- HP11ACC/lib/libxerces-c.sl.21 #9 0xdc477cb4 in XercesParserLiaison::parseXMLStream () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan-c1_4_0.sl #10 0xdc2de8ac in XalanSourceTreeParserLiaison::parseXMLStream () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan-c1_4_0.sl #11 0xdc4348e0 in XSLTEngineImpl::processStylesheet () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan-c1_4_0.sl #12 0xdc4334bc in XSLTEngineImpl::process () from /homedev/mvasice/x1.4/xml- xalan/c/../lib/libxalan-c1_4_0.sl #13 0xdc489afc in XalanTransformer::doTransform () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan-c1_4_0.sl #14 0xdc4848cc in XalanTransformer::transform () from /homedev/mvasice/x1.4/xml- xalan/c/../lib/libxalan-c1_4_0.sl #15 0x5780 in Transform (pTransformer=0x40022010, szOutName=0x7adcd098 "o0.out") at /homedev/mvasice/mpcpi_app/xml_mt/source/xml_mt.cpp:53 #16 0x5aa4 in Fn (value=0x0) at /homedev/mvasice/mpcpi_app/xml_mt/source/xml_mt.cpp:79 #17 0xc04c9f20 in __pthread_create_system () from /usr/lib/libpthread.1 Thread2: #0 0xdc4093b8 in rb_tree<ElemTemplateElement *,ElemTemplateElement *,ident<ElemTemplateElement *,ElemTemplateElement *>,less<ElemTemplateElement *>,allocator>::lower_bound () from /homedev/mvasice/x1.4/xml- xalan/c/../lib/libxalan-c1_4_0.sl #1 0xdc4091cc in rb_tree<ElemTemplateElement *,ElemTemplateElement *,ident<ElemTemplateElement *,ElemTemplateElement *>,less<ElemTemplateElement *>,allocator>::equal_range () from /homedev/mvasice/x1.4/xml- xalan/c/../lib/libxalan-c1_4_0.sl #2 0xdc4090fc in rb_tree<ElemTemplateElement *,ElemTemplateElement *,ident<ElemTemplateElement *,ElemTemplateElement *>,less<ElemTemplateElement *>,allocator>::erase () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan- c1_4_0.sl #3 0xdc415430 in StylesheetHandler::endElement () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan-c1_4_0.sl #4 0xdbe52ff4 in SAXParser::endElement () from /homedev/mvasice/x1.4/xerces- c2_1_0-HP11ACC/lib/libxerces-c.sl.21 #5 0xdbeb0e08 in XMLScanner::scanEndTag () from /homedev/mvasice/x1.4/xerces- c2_1_0-HP11ACC/lib/libxerces-c.sl.21 #6 0xdbeb040c in XMLScanner::scanContent () from /homedev/mvasice/x1.4/xerces- c2_1_0-HP11ACC/lib/libxerces-c.sl.21 #7 0xdbead630 in XMLScanner::scanDocument () from /homedev/mvasice/x1.4/xerces- c2_1_0-HP11ACC/lib/libxerces-c.sl.21 #8 0xdbe523d4 in SAXParser::parse () from /homedev/mvasice/x1.4/xerces-c2_1_0- HP11ACC/lib/libxerces-c.sl.21 #9 0xdc477cb4 in XercesParserLiaison::parseXMLStream () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan-c1_4_0.sl #10 0xdc2de8ac in XalanSourceTreeParserLiaison::parseXMLStream () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan-c1_4_0.sl #11 0xdc4348e0 in XSLTEngineImpl::processStylesheet () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan-c1_4_0.sl #12 0xdc4334bc in XSLTEngineImpl::process () from /homedev/mvasice/x1.4/xml- xalan/c/../lib/libxalan-c1_4_0.sl #13 0xdc489afc in XalanTransformer::doTransform () from /homedev/mvasice/x1.4/xml-xalan/c/../lib/libxalan-c1_4_0.sl #14 0xdc4848cc in XalanTransformer::transform () from /homedev/mvasice/x1.4/xml- xalan/c/../lib/libxalan-c1_4_0.sl #15 0x5780 in Transform (pTransformer=0x40042010, szOutName=0x7adbc098 "o1.out") at /homedev/mvasice/mpcpi_app/xml_mt/source/xml_mt.cpp:53 #16 0x5aa4 in Fn (value=0x1) at /homedev/mvasice/mpcpi_app/xml_mt/source/xml_mt.cpp:79 #17 0xc04c9f20 in __pthread_create_system () from /usr/lib/libpthread.1 I can't find a way, how to attach files to this report. So here is * the source code (xml_mt.cpp): ------------------------------- // ------------------------------------------------------ // This simple application starts multiple threads. // Each of them calls repeatedly the XalanTransformer::transform() // method, performing a file to file conversion. // // The main thread sleeps for 30s and then the application // terminates, but it cores earlier anyway. // // Run "xml_mt -h" to see all possible options. // ------------------------------------------------------ /* ------------------------------------------------------ */ #include <Include/PlatformDefinitions.hpp> #if defined(XALAN_OLD_STREAM_HEADERS) #include <iostream.h> #include <strstream.h> #else #include <iostream> #include <strstream> #endif #include <xercesc/util/PlatformUtils.hpp> #include <XalanTransformer/XalanTransformer.hpp> /* ------------------------------------------------------ */ #include <stdio.h> #include <pthread.h> #include <unistd.h> /* ------------------------------------------------------ */ const unsigned long ulDefThreadsNumber = 2; const unsigned long ulDefTransformRepeat = 100; const char * szDefXMLName = "i.xml"; const char * szDefXSLName = "i.xsl"; /* ------------------------------------------------------ */ #define READ_BUF_SIZE 256 char svXMLName[READ_BUF_SIZE]; char svXSLName[READ_BUF_SIZE]; unsigned long ulTransformRepeat; unsigned int ulThreads; typedef void * (* StartRtn)(void *); /* ------------------------------------------------------ */ int Transform(XalanTransformer * pTransformer, const char * szOutName) { int iRes; iRes = pTransformer->transform( svXMLName, svXSLName, szOutName ); if(iRes != 0) { printf("Error while performing an XSL transformation: %s \n", pTransformer- >getLastError()); } return iRes; } /* ------------------------------------------------------ */ void * Fn(void * value) { char svOutName[READ_BUF_SIZE]; unsigned long ulUID = (unsigned long)value; unsigned long ulCounter = ulTransformRepeat; sprintf(svOutName, "o%lu.out", ulUID); printf("Starting....... Thread: %lu\n", ulUID); XalanTransformer * pTransformer = new XalanTransformer(); while(ulCounter-- > 0) { printf("Transforming... Thread: %lu, Remains: %lu\n", ulUID, ulCounter); Transform(pTransformer, svOutName); } if(pTransformer) { delete pTransformer; pTransformer = NULL; } printf("Exiting........ Thread: %lu\n", ulUID); pthread_t pThreadId = pthread_self(); pthread_exit(&pThreadId); } /* ------------------------------------------------------ */ int Thread(unsigned long ulUID) { pthread_t * pThreadId = NULL; pThreadId = (pthread_t *)new char[ sizeof( pthread_t ) ]; memset( pThreadId, 0, sizeof( pthread_t ) ); pthread_attr_t attr; memset ( &attr, 0, sizeof(attr) ); (void)pthread_attr_init (&attr); // (void)pthread_attr_setstacksize (&attr, 0x100000); (void)pthread_create( pThreadId, &attr, (StartRtn)Fn, (void *)ulUID ); pthread_attr_destroy(&attr); return 0; } /* ------------------------------------------------------ */ void Help(void) { printf("Usage: xml_mt\n"); printf("\t-t<NUM> ... number of threads to start (default %d)\n", ulDefThreadsNumber); printf("\t-r<NUM> ... number of transformations per thread (default %d)\n", ulDefTransformRepeat); printf("\t-m<STR> ... XML file name (default %s)\n", szDefXMLName); printf("\t-s<STR> ... XSL file name (default %s)\n", szDefXSLName); printf("\n"); exit(1); } /* ------------------------------------------------------ */ int ParseArgs(int argc, char **argv) { const char * p = NULL; for(int i = 1; i < argc; i++) { p = argv[i]; if(p[0] == '-') { switch(tolower(p[1])) { case 't': ulThreads = atoi(&p[2]); break; case 'r': ulTransformRepeat = atoi(&p[2]); break; case 'm': strncpy(svXMLName, &p[2], sizeof(svXMLName)); break; case 's': strncpy(svXSLName, &p[2], sizeof(svXSLName)); break; default: Help(); break; } } } return 0; } /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ int main(int argc, char **argv) { ulThreads = ulDefThreadsNumber; ulTransformRepeat = ulDefTransformRepeat; strcpy(svXMLName, szDefXMLName); strcpy(svXSLName, szDefXSLName); printf("--- The %s is started \n", argv[0]); printf("\n"); if(argc > 1) ParseArgs(argc, argv); // ---- Initialization of Xalan and Xerces XMLPlatformUtils::Initialize() ; XalanTransformer::initialize() ; for(unsigned long ulUID = 0; ulUID < ulThreads; ulUID++) { Thread(ulUID); } sleep(30); printf("\n"); printf("--- The %s is leaving \n", argv[0]); // ---- Cleanup XalanTransformer::terminate() ; XMLPlatformUtils::Terminate() ; return 0; } * Here is the makefile: ----------------------- ALAN_DIR = /homedev/mvasice/x1.4/xml-xalan/c XERCES_DIR = /homedev/mvasice/x1.4/xerces-c2_1_0-HP11ACC XML_CPPFLAGS = -I$(XALAN_DIR)/src \ -I$(XERCES_DIR)/include XML_LIBFLAGS = -L$(XALAN_DIR)/../lib -lxalan-c1_4_0 \ -L$(XERCES_DIR)/lib -lxerces-c CXX = /opt/aCC/bin/aCC LD = $(CXX) CXXFLAGS = -I../include -DCA_11_00 +DA2.0 +DS2.0 -mt -g +d -z - w -D_BOOL_DEFINED -DUNIX_VER=1100 -D_THREAD_SAFE -D_REENTRANT - DRWSTD_MULTI_THREAD -DRW_MULTI_THREAD -DNOREADLINE -DTDEBU G +d -g LDFLAGS = -DCA_11_00 +DA2.0 +DS2.0 -mt -g +d -z -w - D_BOOL_DEFINED -DUNIX_VER=1100 -D_THREAD_SAFE -D_REENTRANT - DRWSTD_MULTI_THREAD -DRW_MULTI_THREAD -DNOREADLINE -DTDEBUG +d -g -Wl,+n,+s - Wl,-B,immediate -Wl,-B,nonfatal xml_mt: xml_mt.o $(LD) $(LDFLAGS) $(XML_LIBFLAGS) -o$@ xml_mt.o xml_mt.o: xml_mt.cpp $(CXX) -c $(CXXFLAGS) $(XML_CPPFLAGS) -o$@ xml_mt.cpp * the XML document (i.xml): --------------------------- <?xml version="1.0" ?> <x a1='val1' a2='val2'> <SessionId x="xxx">1234</SessionId> <toReplace> xxx </toReplace> <y> Hello! </y> </x> * and the XSL document (i.xsl): ------------------------------- <?xml version="1.0"?> <!-- 1 to 1 copy + (used for AQ and RAR) --> <!-- Version 0.1, M. Vasicek, Comms Development --> <!-- (adds the SessionId element, containing UID value) --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <xsl:param name="UID" select="0"/> <xsl:template match="/*"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:element name="SessionId"> <xsl:value-of select="$UID"/> </xsl:element> <xsl:apply-templates select="*|text()"/> </xsl:copy> </xsl:template> <xsl:template match="*"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:apply-templates select="*|text()"/> </xsl:copy> </xsl:template> <xsl:template match="@*"> <xsl:copy> <xsl:value-of select="."/> </xsl:copy> </xsl:template> </xsl:stylesheet>
