knoaman     2003/03/04 13:11:12

  Modified:    c/src/xercesc/util EncodingValidator.cpp
                        EncodingValidator.hpp
               c/src/xercesc/util/regx RangeTokenMap.cpp RangeTokenMap.hpp
                        TokenFactory.cpp TokenFactory.hpp
  Log:
  [Bug 17516] Thread safety problems in ../util/ and ../util/regx.
  
  Revision  Changes    Path
  1.3       +3 -2      xml-xerces/c/src/xercesc/util/EncodingValidator.cpp
  
  Index: EncodingValidator.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/EncodingValidator.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- EncodingValidator.cpp     4 Nov 2002 15:22:03 -0000       1.2
  +++ EncodingValidator.cpp     4 Mar 2003 21:11:12 -0000       1.3
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.3  2003/03/04 21:11:12  knoaman
  + * [Bug 17516] Thread safety problems in ../util/ and ../util/regx.
  + *
    * Revision 1.2  2002/11/04 15:22:03  tng
    * C++ Namespace Support.
    *
  @@ -93,8 +96,6 @@
   
       delete fEncodingRegistry;
       fEncodingRegistry = 0;
  -
  -    fInstance = 0;
   }
   
   // ---------------------------------------------------------------------------
  
  
  
  1.3       +2 -6      xml-xerces/c/src/xercesc/util/EncodingValidator.hpp
  
  Index: EncodingValidator.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/EncodingValidator.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- EncodingValidator.hpp     4 Nov 2002 15:22:03 -0000       1.2
  +++ EncodingValidator.hpp     4 Mar 2003 21:11:12 -0000       1.3
  @@ -76,11 +76,6 @@
   class XMLUTIL_EXPORT EncodingValidator {
   
   public:
  -     // -----------------------------------------------------------------------
  -    //  Constructors and destructors
  -    // -----------------------------------------------------------------------
  -    ~EncodingValidator();
  -
       // -----------------------------------------------------------------------
       //  Validation methods
       // -----------------------------------------------------------------------
  @@ -101,6 +96,7 @@
       //  Constructor and destructors
       // -----------------------------------------------------------------------
       EncodingValidator();
  +    ~EncodingValidator();
   
       // -----------------------------------------------------------------------
       //  Private Helpers methods
  
  
  
  1.3       +22 -14    xml-xerces/c/src/xercesc/util/regx/RangeTokenMap.cpp
  
  Index: RangeTokenMap.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/regx/RangeTokenMap.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- RangeTokenMap.cpp 4 Nov 2002 15:17:00 -0000       1.2
  +++ RangeTokenMap.cpp 4 Mar 2003 21:11:12 -0000       1.3
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.3  2003/03/04 21:11:12  knoaman
  + * [Bug 17516] Thread safety problems in ../util/ and ../util/regx.
  + *
    * Revision 1.2  2002/11/04 15:17:00  tng
    * C++ Namespace Support.
    *
  @@ -131,7 +134,7 @@
   //  RangeTokenMap: Constructors and Destructor
   // ---------------------------------------------------------------------------
   RangeTokenMap::RangeTokenMap() :
  -    fRegistryInitialized(0)
  +    fRegistryInitialized(false)
       , fTokenRegistry(0)
       , fRangeMap(0)
       , fCategories(0)
  @@ -152,8 +155,6 @@
   
       delete fTokenFactory;
       fTokenFactory = 0;
  -
  -    fInstance = 0;
   }
   
   // ---------------------------------------------------------------------------
  @@ -168,7 +169,6 @@
       if (!fTokenRegistry->containsKey(keyword))
                return 0;
   
  -
        RangeTokenElemMap* elemMap = 0;
   
        // Use a faux scope to synchronize while we do this
  @@ -265,16 +265,22 @@
   // ---------------------------------------------------------------------------
   void RangeTokenMap::initializeRegistry() {
   
  -     XMLMutexLock lockInit(&fMutex);
  +    if (fRegistryInitialized)
  +        return;
   
  -     if (fRegistryInitialized)
  -             return;
  +    // Use a faux scope to synchronize while we do this
  +    {
  +        XMLMutexLock lockInit(&fMutex);
   
  -    fTokenFactory = new TokenFactory();
  -    fTokenRegistry = new RefHashTableOf<RangeTokenElemMap>(109);
  -    fRangeMap = new RefHashTableOf<RangeFactory>(29);
  -     fCategories = new XMLStringPool();
  -     fRegistryInitialized = true;
  +        if (!fRegistryInitialized)
  +        {
  +            fTokenFactory = new TokenFactory();
  +            fTokenRegistry = new RefHashTableOf<RangeTokenElemMap>(109);
  +            fRangeMap = new RefHashTableOf<RangeFactory>(29);
  +             fCategories = new XMLStringPool();
  +             fRegistryInitialized = true;
  +        }
  +    }
   }
   
   
  @@ -303,8 +309,10 @@
   //  Notification that lazy data has been deleted
   // -----------------------------------------------------------------------
   void RangeTokenMap::reinitInstance() {
  -     delete fInstance;
  -     fInstance = 0;
  +
  +    delete fInstance;
  +    fInstance = 0;
  +    TokenFactory::fRangeInitialized = false;
   }
   
   XERCES_CPP_NAMESPACE_END
  
  
  
  1.3       +2 -6      xml-xerces/c/src/xercesc/util/regx/RangeTokenMap.hpp
  
  Index: RangeTokenMap.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/regx/RangeTokenMap.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- RangeTokenMap.hpp 4 Nov 2002 15:17:00 -0000       1.2
  +++ RangeTokenMap.hpp 4 Mar 2003 21:11:12 -0000       1.3
  @@ -112,11 +112,6 @@
   class XMLUTIL_EXPORT RangeTokenMap {
   
   public:
  -     // -----------------------------------------------------------------------
  -    //  Constructors and destructors
  -    // -----------------------------------------------------------------------
  -    virtual ~RangeTokenMap();
  -
       // -----------------------------------------------------------------------
       //  Putter methods
       // -----------------------------------------------------------------------
  @@ -152,6 +147,7 @@
       //  Constructor and destructors
       // -----------------------------------------------------------------------
       RangeTokenMap();
  +    ~RangeTokenMap();
   
       // -----------------------------------------------------------------------
       //  Getter methods
  
  
  
  1.5       +42 -32    xml-xerces/c/src/xercesc/util/regx/TokenFactory.cpp
  
  Index: TokenFactory.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/regx/TokenFactory.cpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- TokenFactory.cpp  24 Dec 2002 17:59:07 -0000      1.4
  +++ TokenFactory.cpp  4 Mar 2003 21:11:12 -0000       1.5
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.5  2003/03/04 21:11:12  knoaman
  + * [Bug 17516] Thread safety problems in ../util/ and ../util/regx.
  + *
    * Revision 1.4  2002/12/24 17:59:07  tng
    * Build with ICU 2.4
    *
  @@ -111,12 +114,13 @@
   
   XERCES_CPP_NAMESPACE_BEGIN
   
  +bool TokenFactory::fRangeInitialized = false;
  +
   // ---------------------------------------------------------------------------
   //  TokenFactory: Constructors and Destructor
   // ---------------------------------------------------------------------------
   TokenFactory::TokenFactory() :
  -    fRangeInitialized(0)
  -    , fTokens(new RefVectorOf<Token> (16, true))
  +    fTokens(new RefVectorOf<Token> (16, true))
       , fEmpty(0)
       , fLineBegin(0)
       , fLineBegin2(0)
  @@ -432,40 +436,46 @@
   // ---------------------------------------------------------------------------
   void TokenFactory::initializeRegistry() {
   
  -     XMLMutexLock lockInit(&fMutex);
  -
       if (fRangeInitialized)
           return;
   
  -    RangeTokenMap::instance()->initializeRegistry();
  +    // Use a faux scope to synchronize while we do this
  +    {
  +        XMLMutexLock lockInit(&fMutex);
  +
  +        if (!fRangeInitialized) {
  +
  +            RangeTokenMap::instance()->initializeRegistry();
  +
  +            // Add categories
  +            RangeTokenMap::instance()->addCategory(fgXMLCategory);
  +            RangeTokenMap::instance()->addCategory(fgASCIICategory);
  +            RangeTokenMap::instance()->addCategory(fgUnicodeCategory);
  +            RangeTokenMap::instance()->addCategory(fgBlockCategory);
  +
  +             // Add xml range factory
  +            RangeFactory* rangeFact = new XMLRangeFactory();
  +            RangeTokenMap::instance()->addRangeMap(fgXMLCategory, rangeFact);
  +            rangeFact->initializeKeywordMap();
  +
  +            // Add ascii range factory
  +            rangeFact = new ASCIIRangeFactory();
  +            RangeTokenMap::instance()->addRangeMap(fgASCIICategory, rangeFact);
  +            rangeFact->initializeKeywordMap();
  +
  +            // Add unicode range factory
  +            rangeFact = new UnicodeRangeFactory();
  +            RangeTokenMap::instance()->addRangeMap(fgUnicodeCategory, rangeFact);
  +            rangeFact->initializeKeywordMap();
  +
  +            // Add block range factory
  +            rangeFact = new BlockRangeFactory();
  +            RangeTokenMap::instance()->addRangeMap(fgBlockCategory, rangeFact);
  +            rangeFact->initializeKeywordMap();
   
  -         // Add categories
  -    RangeTokenMap::instance()->addCategory(fgXMLCategory);
  -    RangeTokenMap::instance()->addCategory(fgASCIICategory);
  -    RangeTokenMap::instance()->addCategory(fgUnicodeCategory);
  -    RangeTokenMap::instance()->addCategory(fgBlockCategory);
  -
  -     // Add xml range factory
  -    RangeFactory* rangeFact = new XMLRangeFactory();
  -    RangeTokenMap::instance()->addRangeMap(fgXMLCategory, rangeFact);
  -    rangeFact->initializeKeywordMap();
  -
  -    // Add ascii range factory
  -    rangeFact = new ASCIIRangeFactory();
  -    RangeTokenMap::instance()->addRangeMap(fgASCIICategory, rangeFact);
  -    rangeFact->initializeKeywordMap();
  -
  -    // Add unicode range factory
  -    rangeFact = new UnicodeRangeFactory();
  -    RangeTokenMap::instance()->addRangeMap(fgUnicodeCategory, rangeFact);
  -    rangeFact->initializeKeywordMap();
  -
  -    // Add block range factory
  -    rangeFact = new BlockRangeFactory();
  -    RangeTokenMap::instance()->addRangeMap(fgBlockCategory, rangeFact);
  -    rangeFact->initializeKeywordMap();
  -
  -    fRangeInitialized = true;
  +            fRangeInitialized = true;
  +        }
  +    }
   }
   
   /*
  
  
  
  1.3       +6 -5      xml-xerces/c/src/xercesc/util/regx/TokenFactory.hpp
  
  Index: TokenFactory.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/regx/TokenFactory.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TokenFactory.hpp  4 Nov 2002 15:17:00 -0000       1.2
  +++ TokenFactory.hpp  4 Mar 2003 21:11:12 -0000       1.3
  @@ -153,6 +153,7 @@
        *  objects.
        */
       void initializeRegistry();
  +    friend class RangeTokenMap;
   
       // -----------------------------------------------------------------------
       //  Private data members
  @@ -164,8 +165,8 @@
       //  fToken
       //      Contains user created Token objects. Used for memory cleanup.
       // -----------------------------------------------------------------------
  -    bool                fRangeInitialized;
  -     XMLMutex            fMutex;
  +    static bool         fRangeInitialized;
  +    XMLMutex            fMutex;
       RefVectorOf<Token>* fTokens;
       Token*              fEmpty;
       Token*              fLineBegin;
  @@ -179,8 +180,8 @@
       Token*              fWordEnd;
       Token*              fWordBegin;
       Token*              fDot;
  -     Token*              fCombiningChar;
  -     Token*              fGrapheme;
  +    Token*              fCombiningChar;
  +    Token*              fGrapheme;
   };
   
   XERCES_CPP_NAMESPACE_END
  
  
  

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

Reply via email to