You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mk...@apache.org on 2002/11/25 18:30:31 UTC
cvs commit: xml-xalan/java/src/org/apache/xalan/lib Extensions.java ExsltStrings.java
mkwan 2002/11/25 09:30:30
Modified: java/src/org/apache/xalan/lib Extensions.java
ExsltStrings.java
Log:
Fix possible thread contention issue by putting
a lock on the Document object before using it.
Revision Changes Path
1.22 +16 -6 xml-xalan/java/src/org/apache/xalan/lib/Extensions.java
Index: Extensions.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/lib/Extensions.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- Extensions.java 16 Sep 2002 15:54:45 -0000 1.21
+++ Extensions.java 25 Nov 2002 17:30:30 -0000 1.22
@@ -93,7 +93,8 @@
{
// Reuse the Document object to reduce memory usage.
- private static Document lDoc = null;
+ private static Document m_doc = null;
+ private static Extensions m_instance = new Extensions();
/**
* Constructor Extensions
@@ -289,11 +290,17 @@
*/
public static NodeList tokenize(String toTokenize, String delims)
{
-
try
{
- if (lDoc == null)
- lDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+ // Lock the instance to ensure thread safety
+ if (m_doc == null)
+ {
+ synchronized (m_instance)
+ {
+ if (m_doc == null)
+ m_doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+ }
+ }
}
catch(ParserConfigurationException pce)
{
@@ -303,9 +310,12 @@
StringTokenizer lTokenizer = new StringTokenizer(toTokenize, delims);
NodeSet resultSet = new NodeSet();
- while (lTokenizer.hasMoreTokens())
+ synchronized (m_doc)
{
- resultSet.addNode(lDoc.createTextNode(lTokenizer.nextToken()));
+ while (lTokenizer.hasMoreTokens())
+ {
+ resultSet.addNode(m_doc.createTextNode(lTokenizer.nextToken()));
+ }
}
return resultSet;
1.9 +44 -20 xml-xalan/java/src/org/apache/xalan/lib/ExsltStrings.java
Index: ExsltStrings.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/lib/ExsltStrings.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ExsltStrings.java 4 Nov 2002 15:18:20 -0000 1.8
+++ ExsltStrings.java 25 Nov 2002 17:30:30 -0000 1.9
@@ -78,7 +78,8 @@
public class ExsltStrings extends ExsltBase
{
// Reuse the Document object to reduce memory usage.
- private static Document lDoc = null;
+ private static Document m_doc = null;
+ private static ExsltStrings m_instance = new ExsltStrings();
/**
* The str:align function aligns a string within another string.
@@ -231,8 +232,15 @@
{
try
{
- if (lDoc == null)
- lDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+ // Lock the instance to ensure thread safety
+ if (m_doc == null)
+ {
+ synchronized (m_instance)
+ {
+ if (m_doc == null)
+ m_doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+ }
+ }
}
catch(ParserConfigurationException pce)
{
@@ -252,19 +260,22 @@
matchIndex = str.indexOf(pattern, fromIndex);
if (matchIndex >= 0)
{
- token = str.substring(fromIndex, matchIndex);
- fromIndex = matchIndex + pattern.length();
- }
+ token = str.substring(fromIndex, matchIndex);
+ fromIndex = matchIndex + pattern.length();
+ }
else
{
done = true;
token = str.substring(fromIndex);
}
- Element element = lDoc.createElement("token");
- Text text = lDoc.createTextNode(token);
- element.appendChild(text);
- resultSet.addNode(element);
+ synchronized (m_doc)
+ {
+ Element element = m_doc.createElement("token");
+ Text text = m_doc.createTextNode(token);
+ element.appendChild(text);
+ resultSet.addNode(element);
+ }
}
return resultSet;
@@ -315,8 +326,15 @@
{
try
{
- if (lDoc == null)
- lDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+ // Lock the instance to ensure thread safety
+ if (m_doc == null)
+ {
+ synchronized (m_instance)
+ {
+ if (m_doc == null)
+ m_doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+ }
+ }
}
catch(ParserConfigurationException pce)
{
@@ -329,22 +347,28 @@
{
StringTokenizer lTokenizer = new StringTokenizer(toTokenize, delims);
- while (lTokenizer.hasMoreTokens())
+ synchronized (m_doc)
{
- Element element = lDoc.createElement("token");
- element.appendChild(lDoc.createTextNode(lTokenizer.nextToken()));
- resultSet.addNode(element);
+ while (lTokenizer.hasMoreTokens())
+ {
+ Element element = m_doc.createElement("token");
+ element.appendChild(m_doc.createTextNode(lTokenizer.nextToken()));
+ resultSet.addNode(element);
+ }
}
}
// If the delimiter is an empty string, create one token Element for
// every single character.
else
{
- for (int i = 0; i < toTokenize.length(); i++)
+ synchronized (m_doc)
{
- Element element = lDoc.createElement("token");
- element.appendChild(lDoc.createTextNode(toTokenize.substring(i, i+1)));
- resultSet.addNode(element);
+ for (int i = 0; i < toTokenize.length(); i++)
+ {
+ Element element = m_doc.createElement("token");
+ element.appendChild(m_doc.createTextNode(toTokenize.substring(i, i+1)));
+ resultSet.addNode(element);
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org