You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by sb...@apache.org on 2001/01/09 08:15:11 UTC

cvs commit: xml-xalan/java/src/org/apache/xalan/stree Parent.java

sboag       01/01/08 23:15:11

  Modified:    java/src/org/apache/xalan/stree Parent.java
  Log:
  Set child.m_prev *before* m_next.  From note to Joe K. about this:
  
  I tried hard to reproduce this.  I installed IBM's 1.3 JDK, and ran many tests, but could not cause the problem.
  
  These problems all seem to occur when xsl:number is involved.  This might make be suspect something with getPreviousSibling().  I notice in Parent#appendChild:
  
      if (null == m_first)
      {
        m_first = child;
      }
      else
      {
        m_last.m_next = child;
        child.m_prev = m_last;
      }
  
      m_last = child;
  
  m_last is only used in appendChild, which must always be synchronized at the caller level, and is never entered by the transform thread anyway.  But child getPreviousSibling() can absolutely fail.  So I think this should be changed to:
  
        child.m_prev = m_last;
        m_last.m_next = child;
  
  This should be safe because getPreviousSibling() can't be called until the node is navigated to via m_last.m_next.
  
  However, I'm not sure why this would cause the particular problem you are having with dropped text.  I would think getPreviousSibling problem would manifest itself as a bad numbering value, not a dropped text node.  In fact, in numbering64 it just uses <xsl:value-of select="."/> which is optimized as of this weekend to just use the current node, and then the text value operation uses getFirstChild to get to the text child of that element.  So it seems like it is really getFirstChild which is failing.
  
  Well, I'll try reversing those on the theory that it might help.  Sorry to be making you do these runs... believe me, I wish I could reproduce the problem myself.
  
  I know that we're pretty close to the point of just doing absolute synchronization in getFirstChild, getNextSibling, and getPreviousSibling.  But, not only am I afraid to do that because of performance issues (though I haven't measured what the difference would be), I'm worried that I could somehow introduce a deadlock or hang at this stage of the game.
  
  It's also possible that there's something else going on in xsl:number above the level of Stree which could be screwing things up.
  
  (And the original note from Joe):
  
  The failure frequency seems reduced... but there still seems to be a lurking horror or two, and the pattern of failure seems unchanged.
  
  Seventh pass, numbering64, line 9
  	5: hhh
  	5:
  Eighth pass, numbering27, line 17
  	3+1-1: Level C
  	3+1-1:
  Ninth pass
  numb42, line 3
  	(1.): Level A
  	(1.):
  numb66, line 35
  	C. Second Subsection in third Section in second Chapter
  	C.
  
  Revision  Changes    Path
  1.19      +1 -1      xml-xalan/java/src/org/apache/xalan/stree/Parent.java
  
  Index: Parent.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/stree/Parent.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- Parent.java	2001/01/07 03:59:23	1.18
  +++ Parent.java	2001/01/09 07:15:11	1.19
  @@ -348,8 +348,8 @@
       }
       else
       {
  -      m_last.m_next = child;
         child.m_prev = m_last;
  +      m_last.m_next = child;
       }
   
       m_last = child;