From 5e0dcc6a268b3061645de20180e5527c408b4261 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Felix=20Geisendo=CC=88rfer?= <felix@debuggable.com>
Date: Fri, 16 Aug 2013 16:03:22 +0200
Subject: [PATCH] xmlTextReaderExpand: Return when node closes

Currently xmlTextReaderExpand waits for the next sibling node to be
parsed before returning, which introduces undesirable latency when
parsing interactive xml streams (i.e. xmpp).

This patch fixes the problem by tracking when the closing tag for a node
is parsed.
---
 include/libxml/tree.h | 1 +
 parser.c              | 1 +
 xmlreader.c           | 2 ++
 3 files changed, 4 insertions(+)

diff --git a/include/libxml/tree.h b/include/libxml/tree.h
index 7e06686..e36795c 100644
--- a/include/libxml/tree.h
+++ b/include/libxml/tree.h
@@ -504,6 +504,7 @@ struct _xmlNode {
     void            *psvi;	/* for type/PSVI informations */
     unsigned short   line;	/* line number */
     unsigned short   extra;	/* extra data for XPath/XSLT */
+    int              closed;	/* closing tag has been processed, used by reader */
 };
 
 /**
diff --git a/parser.c b/parser.c
index 4739add..893f469 100644
--- a/parser.c
+++ b/parser.c
@@ -11569,6 +11569,7 @@ xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) {
 			goto done;
 		    }
 		}
+		ctxt->node->closed = 1;
 		if (ctxt->sax2) {
 		    xmlParseEndTag2(ctxt,
 		           (void *) ctxt->pushTab[ctxt->nameNr * 3 - 3],
diff --git a/xmlreader.c b/xmlreader.c
index 00083d0..6de1445 100644
--- a/xmlreader.c
+++ b/xmlreader.c
@@ -1199,6 +1199,8 @@ xmlTextReaderDoExpand(xmlTextReaderPtr reader) {
 
         if (xmlTextReaderGetSuccessor(reader->node) != NULL)
 	    return(1);
+        if (reader->node->closed == 1)
+	    return(1);
 	if (reader->ctxt->nodeNr < reader->depth)
 	    return(1);
 	if (reader->mode == XML_TEXTREADER_MODE_EOF)
-- 
1.8.1

