dbertoni    2004/01/06 21:32:08

  Modified:    c/samples Makefile.in
               c/samples/ThreadSafe ThreadSafe.cpp
  Log:
  Patch for Bugzilla 24989.
  
  Revision  Changes    Path
  1.6       +12 -2     xml-xalan/c/samples/Makefile.in
  
  Index: Makefile.in
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/samples/Makefile.in,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Makefile.in       6 Jan 2004 02:41:26 -0000       1.5
  +++ Makefile.in       7 Jan 2004 05:32:08 -0000       1.6
  @@ -100,7 +100,8 @@
                     UseStylesheetParam \
                     XalanTransform \
                     XalanTransformerCallback \
  -                  XPathWrapper
  +                  XPathWrapper\
  +                     ThreadSafe
   
   include $(wildcard $(XALANCROOT)/samples/version.incl \
                      $(XALANCROOT)/version.incl)
  @@ -119,7 +120,8 @@
   Samples: CompileStylesheet DocumentBuilder ExternalFunction \
            ParsedSourceWrappers SimpleTransform SerializeNodeSet 
SimpleXPathAPI \
            SimpleXPathCAPI StreamTransform TraceListen TransformToXercesDOM \
  -         UseStylesheetParam XalanTransform XalanTransformerCallback 
XPathWrapper
  +         UseStylesheetParam XalanTransform XalanTransformerCallback 
XPathWrapper\
  +         ThreadSafe  
   
   ApacheModuleXSLT: prepare $(XSL_LIB_DIR)/mod_xslt$(SHLIBSUFFIX) 
   
  @@ -247,6 +249,14 @@
        $(LINK) $(XSL_BUILD_OPTIONS) $(PLATFORM_LIB_LINK_OPTIONS)  \
        $(EXTRA_LINK_OPTIONS) $(XALAN_LIB) $(ALLLIBS) $(CXXFLAGS) $^ -o $@      
   $(XSL_OBJ_DIR)/%.o:$(SAMPLES_DIR)/XPathWrapper/%.cpp
  +     $(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o 
$@ $<
  +
  +ThreadSafe: prepare $(XSL_BIN_DIR)/ThreadSafe
  +
  +$(XSL_BIN_DIR)/ThreadSafe: $(XSL_OBJ_DIR)/ThreadSafe.o
  +     $(LINK) $(XSL_BUILD_OPTIONS) $(PLATFORM_LIB_LINK_OPTIONS)  \
  +     $(EXTRA_LINK_OPTIONS) $(XALAN_LIB) $(ALLLIBS) $(CXXFLAGS) $^ -o $@      
  +$(XSL_OBJ_DIR)/%.o:$(SAMPLES_DIR)/ThreadSafe/%.cpp
        $(CC1) $(XSL_BUILD_OPTIONS) -c $(XSL_INCL) $(EXTRA_COMPILE_OPTIONS) -o 
$@ $<
   
   prepare:
  
  
  
  1.26      +101 -14   xml-xalan/c/samples/ThreadSafe/ThreadSafe.cpp
  
  Index: ThreadSafe.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/samples/ThreadSafe/ThreadSafe.cpp,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- ThreadSafe.cpp    6 Jan 2004 02:41:27 -0000       1.25
  +++ ThreadSafe.cpp    7 Jan 2004 05:32:08 -0000       1.26
  @@ -61,9 +61,16 @@
   
   #include <cassert>
   #include <ctime>
  +
  +#if defined(XALAN_CLASSIC_IOSTREAMS)
  +#include <fstream.h>
  +#include <iostream.h>
  +#include <strstream.h>
  +#else
   #include <fstream>
   #include <iostream>
   #include <strstream>
  +#endif
   
   
   
  @@ -76,10 +83,27 @@
   
   
   //This is here for the Windows threads.
  +#if defined(_MSC_VER)
   #define WIN32_LEAN_AND_MEAN
   #include <windows.h>
   #include <winbase.h>
   #define THREADFUNCTIONRETURN DWORD WINAPI
  +    typedef   DWORD      theThreadIDType;
  +    typedef   HANDLE     theThreadType;
  +
  +//This is here for Unix threads
  +#elif defined(XALAN_POSIX2_AVAILABLE)
  +#include <pthread.h>
  +#include <unistd.h>
  +    typedef   unsigned long     theThreadIDType;
  +    typedef   pthread_t         theThreadType;
  +
  +#else
  +//error Unsupported Platform!
  +#endif
  +
  +#define NUM_THREADS 10
  +
   
   
   
  @@ -110,7 +134,7 @@
   // beginning and end of the entire operation.
   void
   outputMessage(
  -                     DWORD           id,
  +              theThreadIDType  id,
                        const char      msg[])
   {
        ostrstream threadMsg;
  @@ -119,23 +143,36 @@
   
        cout << threadMsg.str();
   
  +    #if defined(HPUX)
  +     threadMsg.rdbuf() -> freeze(false);
  +    #else
        threadMsg.freeze(false);
  +    #endif
   }
   
   
  -
  +#if defined(_MSC_VER)
   THREADFUNCTIONRETURN
   theThread(LPVOID     param)
  +#elif defined(XALAN_POSIX2_AVAILABLE)
  +  void  *theThread(void   *param)
  +#endif
   {
   // This routine uses a compiled stylesheet (glbCompiledStylesheet), 
   // and a binary source tree (glbParsedSource) to perform the 
   // transformation.
   
        int     theResult = 0;
  -
  +  
  +   #if defined(_MSC_VER)
        const int       number = reinterpret_cast<int>(param);
  +        const theThreadIDType         theThreadID = GetCurrentThreadId();
   
  -     const DWORD             theThreadID = GetCurrentThreadId();
  +   #elif defined(XALAN_POSIX2_AVAILABLE)
  +        const int       number = *(int *)(param);
  +        const theThreadIDType         theThreadID = pthread_self();
  +
  +   #endif
   
        outputMessage(theThreadID, "Starting ");
   
  @@ -150,7 +187,11 @@
        const XSLTResultTarget  
theResultTarget(XalanDOMString(theFormatterOut.str()));
   
        // Unfreeze the ostrstream, so memory is returned...
  +     #if defined(HPUX)
  +        theFormatterOut.rdbuf() -> freeze(false);
  +     #else
        theFormatterOut.freeze(false);
  +     #endif
   
        outputMessage(theThreadID, "Transforming");
   
  @@ -167,8 +208,12 @@
        }
   
        outputMessage(theThreadID, "Finishing");
  -
  +  
  +  #if defined(_MSC_VER)
        return (theResult);
  +  #elif defined(XALAN_POSIX2_AVAILABLE)
  +        return 0;
  +  #endif
   }
   
   
  @@ -179,21 +224,23 @@
   void
   doThreads(int        nThreads)
   {
  +      int   i=0;
  +      cout << endl << "Clock before starting threads: " << clock() << endl;
  +      
  +
        XALAN_USING_STD(vector)
   
  -     vector<HANDLE>  hThreads;
  +        vector<theThreadType>   hThreads;
   
        hThreads.reserve(nThreads);
   
  -     cout << endl << "Clock before starting threads: " << clock() << endl;
  -
  -     int             i = 0;  
  +#if defined(_MSC_VER)
   
        for (; i < nThreads; ++i)
        {
  -             DWORD  threadID;
  +                theThreadIDType  threadID;
   
  -             const HANDLE    hThread = CreateThread(
  +                const theThreadType  hThread = CreateThread(
                                0, 
                                4096,                                           
        // Stack size for thread.
                                theThread,                                      
        // pointer to thread function
  @@ -208,12 +255,51 @@
   
        WaitForMultipleObjects(hThreads.size(), &hThreads[0], TRUE, INFINITE);
   
  -     cout << endl << "Clock after threads: " << clock() << endl;
  -
        for (i = 0; i < nThreads; ++i)
        {
                CloseHandle(hThreads[i]);
        }
  +
  +#elif defined(XALAN_POSIX2_AVAILABLE)
  +
  +  int result;
  +  void *thread_result;
  +  
  +  for(; i < nThreads; ++i)
  +  { 
  +   result = pthread_create(
  +                          &hThreads[i],    //thread pointer
  +                          NULL,            //thread's attribute default
  +                          theThread,       //thread function
  +                          (void *) &i      //thread function argument
  +                         );
  +  if (result != 0)
  +    {
  +      perror ("Thread creation failed");
  +      exit(EXIT_FAILURE);
  +    }
  +  }
  +
  +  cout << endl << "Waiting for threads to finish..." << endl << endl;
  +  for( i = nThreads - 1; i>=0; i-- )
  +  {
  +    result = pthread_join(
  +                           hThreads[i],
  +                           &thread_result
  +                         );
  +    if (result != 0)
  +     {
  +       perror ("Thread join failed");
  +       exit (EXIT_FAILURE);
  +     }
  +   //for UNIX debugging
  +   // cout << "Thread joined, return value: " << (char *)thread_result << 
endl;
  +  } 
  + 
  +#endif
  +
  +cout << endl << endl << "Clock after threads: " << clock() << endl;
  +
   }
   
   
  @@ -276,7 +362,8 @@
                                                // Create and run the threads...
                                                // Each thread uses the same 
document and 
                                                // stylesheet to perform a 
transformation.
  -                                             doThreads(10);
  +                                    doThreads(NUM_THREADS);
  +
                                        }
                                }
                        }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to