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>

Reply via email to