a lot of performance work especially the speed of streaming through the

* globals.c libxml.h parser.c parserInternals.c tree.c xmllint.c
  xmlreader.c include/libxml/parser.h: a lot of performance work
  especially the speed of streaming through the reader and push
  interface. Some thread related optimizations. Nearly doubled the
  speed of parsing through the reader.
Daniel
diff --git a/tree.c b/tree.c
index abe9cf2..867f074 100644
--- a/tree.c
+++ b/tree.c
@@ -38,6 +38,8 @@
 #include <libxml/HTMLtree.h>
 #endif
 
+int __xmlRegisterCallbacks = 0;
+
 xmlNsPtr xmlNewReconciliedNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns);
 
 /************************************************************************
@@ -744,7 +746,7 @@
 	doc->extSubset = cur;
     cur->doc = doc;
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
@@ -854,7 +856,7 @@
 	}
     }
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
@@ -875,7 +877,7 @@
 	return;
     }
 
-    if (xmlDeregisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
 	xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
 
     if (cur->children != NULL) {
@@ -946,7 +948,7 @@
     cur->doc = cur;
     cur->charset = XML_CHAR_ENCODING_UTF8;
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
@@ -969,7 +971,7 @@
 	return;
     }
 
-    if (xmlDeregisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
 	xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
 
     /*
@@ -1552,7 +1554,7 @@
 	}
     }
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
@@ -1632,7 +1634,7 @@
 	}
     }
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
@@ -1712,7 +1714,7 @@
 	}
     }
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
@@ -1767,7 +1769,7 @@
 	}
     }
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
@@ -1811,7 +1813,7 @@
 	return;
     }
 
-    if (xmlDeregisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
 	xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
 
     /* Check for ID removal -> leading to invalid references ! */
@@ -1912,7 +1914,7 @@
 	cur->content = xmlStrdup(content);
     }
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
@@ -1953,7 +1955,7 @@
     cur->name = xmlStrdup(name);
     cur->ns = ns;
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
@@ -1994,7 +1996,7 @@
     cur->name = name;
     cur->ns = ns;
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
@@ -2118,7 +2120,7 @@
 
     cur->doc = doc;
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
@@ -2151,7 +2153,7 @@
 	cur->content = xmlStrdup(content);
     }
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
@@ -2254,7 +2256,7 @@
     } else
 	cur->name = xmlStrdup(name);
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
@@ -2308,7 +2310,7 @@
 	cur->last = (xmlNodePtr) ent;
     }
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
@@ -2359,7 +2361,7 @@
 	cur->content = xmlStrndup(content, len);
     }
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
@@ -2411,7 +2413,7 @@
 	cur->content = xmlStrdup(content);
     }
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
@@ -2446,7 +2448,7 @@
 	cur->content = xmlStrndup(content, len);
     }
 
-    if (xmlRegisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
@@ -3076,7 +3078,7 @@
 	/* unroll to speed up freeing the document */
 	if (cur->type != XML_DTD_NODE) {
 
-	    if (xmlDeregisterNodeDefaultValue)
+	    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
 		xmlDeregisterNodeDefaultValue(cur);
 
 	    if ((cur->children != NULL) &&
@@ -3161,7 +3163,7 @@
 	return;
     }
 
-    if (xmlDeregisterNodeDefaultValue)
+    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
 	xmlDeregisterNodeDefaultValue(cur);
 
     if ((cur->children != NULL) &&
@@ -3630,7 +3632,7 @@
 	 * in case ret does get coalesced in xmlAddChild
 	 * the deregister-node callback is called; so we register ret now already
 	 */
-	if (xmlRegisterNodeDefaultValue)
+	if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
 	    xmlRegisterNodeDefaultValue((xmlNodePtr)ret);
 
         tmp = xmlAddChild(parent, ret);