knoaman     2003/08/13 20:00:46

  Modified:    c/src/xercesc/validators/DTD DTDGrammar.hpp DTDGrammar.cpp
  Log:
  Code refactoring to improve performance of validation.
  
  Revision  Changes    Path
  1.9       +30 -10    xml-xerces/c/src/xercesc/validators/DTD/DTDGrammar.hpp
  
  Index: DTDGrammar.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/DTD/DTDGrammar.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- DTDGrammar.hpp    31 Jul 2003 17:09:59 -0000      1.8
  +++ DTDGrammar.hpp    14 Aug 2003 03:00:46 -0000      1.9
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.9  2003/08/14 03:00:46  knoaman
  + * Code refactoring to improve performance of validation.
  + *
    * Revision 1.8  2003/07/31 17:09:59  peiyongz
    * Grammar embed grammar description
    *
  @@ -243,6 +246,12 @@
       // -----------------------------------------------------------------------
       unsigned int putEntityDecl(DTDEntityDecl* const entityDecl) const;
   
  +
  +    // -----------------------------------------------------------------------
  +    //  Notification that lazy data has been deleted
  +    // -----------------------------------------------------------------------
  +    static void reinitDfltEntities();
  +
   private:
       // -----------------------------------------------------------------------
       //  Private helper methods
  @@ -284,14 +293,15 @@
       //  fGramDesc: adopted
       //
       // -----------------------------------------------------------------------
  -    MemoryManager*               fMemoryManager;
  -    NameIdPool<DTDElementDecl>*  fElemDeclPool;
  -    NameIdPool<DTDElementDecl>*  fElemNonDeclPool;
  -    NameIdPool<DTDEntityDecl>*   fEntityDeclPool;
  -    NameIdPool<XMLNotationDecl>* fNotationDeclPool;
  -    unsigned int                 fRootElemId;
  -    bool                         fValidated;
  -    XMLDTDDescription*           fGramDesc;
  +    static NameIdPool<DTDEntityDecl>* fDefaultEntities;
  +    MemoryManager*                    fMemoryManager;
  +    NameIdPool<DTDElementDecl>*       fElemDeclPool;
  +    NameIdPool<DTDElementDecl>*       fElemNonDeclPool;
  +    NameIdPool<DTDEntityDecl>*        fEntityDeclPool;
  +    NameIdPool<XMLNotationDecl>*      fNotationDeclPool;
  +    unsigned int                      fRootElemId;
  +    bool                              fValidated;
  +    XMLDTDDescription*                fGramDesc;
   };
   
   
  @@ -327,12 +337,22 @@
   inline const DTDEntityDecl*
   DTDGrammar::getEntityDecl(const XMLCh* const entName) const
   {
  -    return fEntityDeclPool->getByKey(entName);
  +    DTDEntityDecl* decl = fDefaultEntities->getByKey(entName);
  +
  +    if (!decl)
  +        return fEntityDeclPool->getByKey(entName);
  +
  +    return decl;
   }
   
   inline DTDEntityDecl* DTDGrammar::getEntityDecl(const XMLCh* const entName)
   {
  -    return fEntityDeclPool->getByKey(entName);
  +    DTDEntityDecl* decl = fDefaultEntities->getByKey(entName);
  +
  +    if (!decl)
  +        return fEntityDeclPool->getByKey(entName);
  +
  +    return decl;
   }
   
   
  
  
  
  1.8       +52 -22    xml-xerces/c/src/xercesc/validators/DTD/DTDGrammar.cpp
  
  Index: DTDGrammar.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/DTD/DTDGrammar.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- DTDGrammar.cpp    31 Jul 2003 17:09:59 -0000      1.7
  +++ DTDGrammar.cpp    14 Aug 2003 03:00:46 -0000      1.8
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.8  2003/08/14 03:00:46  knoaman
  + * Code refactoring to improve performance of validation.
  + *
    * Revision 1.7  2003/07/31 17:09:59  peiyongz
    * Grammar embed grammar description
    *
  @@ -97,11 +100,17 @@
   // ---------------------------------------------------------------------------
   #include <xercesc/util/XMLUniDefs.hpp>
   #include <xercesc/util/XMLUni.hpp>
  +#include <xercesc/util/XMLRegisterCleanup.hpp>
   #include <xercesc/validators/DTD/DTDGrammar.hpp>
   #include <xercesc/validators/DTD/XMLDTDDescriptionImpl.hpp>
   
   XERCES_CPP_NAMESPACE_BEGIN
   
  +// ---------------------------------------------------------------------------
  +//  DTDGrammar: Static member data
  +// ---------------------------------------------------------------------------
  +NameIdPool<DTDEntityDecl>* DTDGrammar::fDefaultEntities = 0;
  +
   //---------------------------------------------------------------------------
   //  DTDGrammar: Constructors and Destructor
   // ---------------------------------------------------------------------------
  @@ -128,12 +137,8 @@
       //REVISIT: use grammarPool to create
       fGramDesc = new (fMemoryManager) 
XMLDTDDescriptionImpl(XMLUni::fgDTDEntityString, fMemoryManager);
   
  -    //
  -    //  Call our own reset method. This lets us have the pool setup stuff
  -    //  done in just one place (because this stame setup stuff has to be
  -    //  done every time we are reset.)
  -    //
  -    reset();
  +    // Create default entities
  +    resetEntityDeclPool();
   }
   
   DTDGrammar::~DTDGrammar()
  @@ -146,6 +151,14 @@
   }
   
   // -----------------------------------------------------------------------
  +//  Notification that lazy data has been deleted
  +// -----------------------------------------------------------------------
  +void DTDGrammar::reinitDfltEntities() {
  +     delete fDefaultEntities;
  +     fDefaultEntities = 0;
  +}
  +
  +// -----------------------------------------------------------------------
   //  Virtual methods
   // -----------------------------------------------------------------------
   XMLElementDecl* DTDGrammar::findOrAddElemDecl (const   unsigned int    uriId
  @@ -207,27 +220,44 @@
       fElemDeclPool->removeAll();
       fElemNonDeclPool->removeAll();
       fNotationDeclPool->removeAll();
  -    resetEntityDeclPool();
  +    fEntityDeclPool->removeAll();
       fValidated = false;
   }
   
   void DTDGrammar::resetEntityDeclPool() {
   
  -    fEntityDeclPool->removeAll();
  -    //
  -    //  Add the default entity entries for the character refs that must always
  -    //  be present. We indicate that they are from the internal subset. They
  -    //  aren't really, but they have to look that way so that they are still
  -    //  valid for use within a standalone document.
  -    //
  -    //  We also mark them as special char entities, which allows them to be
  -    //  used in places whether other non-numeric general entities cannot.
  -    //
  -    fEntityDeclPool->put(new DTDEntityDecl(XMLUni::fgAmp, chAmpersand, true, true));
  -    fEntityDeclPool->put(new DTDEntityDecl(XMLUni::fgLT, chOpenAngle, true, true));
  -    fEntityDeclPool->put(new DTDEntityDecl(XMLUni::fgGT, chCloseAngle, true, true));
  -    fEntityDeclPool->put(new DTDEntityDecl(XMLUni::fgQuot, chDoubleQuote, true, 
true));
  -    fEntityDeclPool->put(new DTDEntityDecl(XMLUni::fgApos, chSingleQuote, true, 
true));
  +    static XMLRegisterCleanup builtInRegistryCleanup;
  +
  +    // Initialize default entities if not initialized
  +    if (fDefaultEntities == 0) {
  +
  +        NameIdPool<DTDEntityDecl>* t = new NameIdPool<DTDEntityDecl>(11, 12);
  +
  +        if (XMLPlatformUtils::compareAndSwap((void **)&fDefaultEntities, t, 0) != 0)
  +        {
  +            delete t;
  +        }
  +        else
  +        {
  +            builtInRegistryCleanup.registerCleanup(reinitDfltEntities);
  +
  +            //
  +            // Add the default entity entries for the character refs that must
  +            // always be present. We indicate that they are from the internal
  +            // subset. They aren't really, but they have to look that way so
  +            // that they are still valid for use within a standalone document.
  +            //
  +            // We also mark them as special char entities, which allows them
  +            // to be used in places whether other non-numeric general entities
  +            // cannot.
  +            //
  +            fDefaultEntities->put(new DTDEntityDecl(XMLUni::fgAmp, chAmpersand, 
true, true));
  +            fDefaultEntities->put(new DTDEntityDecl(XMLUni::fgLT, chOpenAngle, 
true, true));
  +            fDefaultEntities->put(new DTDEntityDecl(XMLUni::fgGT, chCloseAngle, 
true, true));
  +            fDefaultEntities->put(new DTDEntityDecl(XMLUni::fgQuot, chDoubleQuote, 
true, true));
  +            fDefaultEntities->put(new DTDEntityDecl(XMLUni::fgApos, chSingleQuote, 
true, true));
  +        }
  +    }
   }
   
   void DTDGrammar::setGrammarDescription( XMLGrammarDescription* gramDesc)
  
  
  

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

Reply via email to