You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pa...@apache.org on 2008/09/12 17:29:58 UTC

svn commit: r694713 - in /felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap: Operator.java Parser.java

Author: pauls
Date: Fri Sep 12 08:29:58 2008
New Revision: 694713

URL: http://svn.apache.org/viewvc?rev=694713&view=rev
Log:
Fix an issue with FilterImpl.toString which could throw a NullPointerException when several Threads where doing a toString at the same time. The fix is making the children member of Operator volatile and assign it optimistic. (FELIX-721)

Modified:
    felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Operator.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Parser.java

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Operator.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Operator.java?rev=694713&r1=694712&r2=694713&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Operator.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Operator.java Fri Sep 12 08:29:58 2008
@@ -32,5 +32,5 @@
 
     // Place to store the reconstructed parsetree
     // Vector -> ArrayList is using jdk1.2 or later
-    public Operator[] children = null;
+    public volatile Operator[] children = null;
 }
\ No newline at end of file

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Parser.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Parser.java?rev=694713&r1=694712&r2=694713&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Parser.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/util/ldap/Parser.java Fri Sep 12 08:29:58 2008
@@ -582,12 +582,16 @@
 
         public void buildTree(Stack operands)
         {
-            children = new Operator[operandCount];
-            // need to preserve stack order
-            for (int i = 0; i < operandCount; i++)
+            if (children == null)
             {
-                children[(operandCount - 1) - i] =
-                    (Operator) operands.pop();
+                Operator[] tmp = new Operator[operandCount];
+                // need to preserve stack order
+                for (int i = 0; i < operandCount; i++)
+                {
+                    tmp[(operandCount - 1) - i] =
+                        (Operator) operands.pop();
+                }
+                children = tmp;
             }
             operands.push(this);
         }
@@ -647,12 +651,17 @@
 
         public void buildTree(Stack operands)
         {
-            children = new Operator[operandCount];
-            // need to preserve stack order
-            for (int i = 0; i < operandCount; i++)
+            if (children == null) 
             {
-                children[(operandCount - 1) - i] =
-                    (Operator) operands.pop();
+                Operator[] tmp = new Operator[operandCount];
+            
+                // need to preserve stack order
+                for (int i = 0; i < operandCount; i++)
+                {
+                    tmp[(operandCount - 1) - i] =
+                        (Operator) operands.pop();
+                }
+                children = tmp;
             }
             operands.push(this);
         }
@@ -693,8 +702,11 @@
 
         public void buildTree(Stack operands)
         {
-            children = new Operator[1];
-            children[0] = (Operator) operands.pop();
+            if (children == null)
+            {
+                children = new Operator[]{
+                    (Operator) operands.pop()};
+            }
             operands.push(this);
         }
 
@@ -787,12 +799,17 @@
 
         public void buildTree(Stack operands)
         {
-            children = new Operator[2];
-            // need to preserve stack order
-            for (int i = 0; i < 2; i++)
-            {
-                Operator o = (Operator) operands.pop();
-                children[1 - i] = o;
+            if (children == null)
+            { 
+                Operator[] tmp = new Operator[2];
+            
+                // need to preserve stack order
+                for (int i = 0; i < 2; i++)
+                {
+                    Operator o = (Operator) operands.pop();
+                    tmp[1 - i] = o;
+                }
+                children = tmp;
             }
             operands.push(this);
         }
@@ -845,11 +862,16 @@
 
         public void buildTree(Stack operands)
         {
-            children = new Operator[2];
-            // need to preserve stack order
-            for (int i = 0; i < 2; i++)
+            if (children == null)
             {
-                children[1 - i] = (Operator) operands.pop();
+                Operator[] tmp = new Operator[2];
+            
+                // need to preserve stack order
+                for (int i = 0; i < 2; i++)
+                {
+                    tmp[1 - i] = (Operator) operands.pop();
+                }
+                children = tmp;
             }
             operands.push(this);
         }
@@ -901,11 +923,16 @@
 
         public void buildTree(Stack operands)
         {
-            children = new Operator[2];
-            // need to preserve stack order
-            for (int i = 0; i < 2; i++)
+            if (children == null)
             {
-                children[1 - i] = (Operator) operands.pop();
+                Operator[] tmp = new Operator[2];
+            
+                // need to preserve stack order
+                for (int i = 0; i < 2; i++)
+                {
+                    tmp[1 - i] = (Operator) operands.pop();
+                }
+                children = tmp;
             }
             operands.push(this);
         }
@@ -957,11 +984,16 @@
 
         public void buildTree(Stack operands)
         {
-            children = new Operator[2];
-            // need to preserve stack order
-            for (int i = 0; i < 2; i++)
+            if (children == null)
             {
-                children[1 - i] = (Operator) operands.pop();
+                Operator[] tmp = new Operator[2];
+            
+                // need to preserve stack order
+                for (int i = 0; i < 2; i++)
+                {
+                    tmp[1 - i] = (Operator) operands.pop();
+                }
+                children = tmp;
             }
             operands.push(this);
         }
@@ -1230,8 +1262,11 @@
 
         public void buildTree(Stack operands)
         {
-            children = new Operator[1];
-            children[0] = (Operator) operands.pop();
+            if (children == null) 
+            {
+                children = new Operator[]{
+                    (Operator) operands.pop()};
+            }
             operands.push(this);
         }