fixed some bugs in CFLAGS passing. added a specific threaded test case

* configure.in: fixed some bugs in CFLAGS passing.
* test/threads Makefile.am testThreads.c: added a specific
  threaded test case (really nasty, guaranteed).
Daniel
diff --git a/ChangeLog b/ChangeLog
index 5bd17be..849905e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Oct 17 13:29:02 CEST 2001 Daniel Veillard <daniel@veillard.com>
+
+	* configure.in: fixed some bugs in CFLAGS passing.
+	* test/threads Makefile.am testThreads.c: added a specific
+	  threaded test case (really nasty, guaranteed).
+
 Tue Oct 16 23:01:49 CEST 2001 Daniel Veillard <daniel@veillard.com>
 
 	* catalog.c: serious cleanup on the management of the
diff --git a/Makefile.am b/Makefile.am
index 7104fc0..c87ca99 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -7,7 +7,7 @@
 
 INCLUDES = -I@srcdir@/include -I$(top_builddir)/include @THREAD_CFLAGS@ @Z_CFLAGS@ 
 
-noinst_PROGRAMS=testSAX testHTML testXPath testURI testDocbook
+noinst_PROGRAMS=testSAX testHTML testXPath testURI testDocbook testThreads
 
 bin_PROGRAMS = xmllint xmlcatalog
 
@@ -72,6 +72,11 @@
 testXPath_DEPENDENCIES = $(DEPS)
 testXPath_LDADD= $(LDADDS)
 
+testThreads_SOURCES=testThreads.c
+testThreads_LDFLAGS = 
+testThreads_DEPENDENCIES = $(DEPS)
+testThreads_LDADD= $(LDADDS)
+
 testURI_SOURCES=testURI.c
 testURI_LDFLAGS = 
 testURI_DEPENDENCIES = $(DEPS)
@@ -81,7 +86,7 @@
 
 testall : tests SVGtests SAXtests
 
-tests: XMLtests XMLenttests HTMLtests Validtests URItests XPathtests XPtrtests XIncludetests Scripttests Catatests
+tests: XMLtests XMLenttests HTMLtests Validtests URItests XPathtests XPtrtests XIncludetests Scripttests Catatests @TEST_THREADS@
 
 HTMLtests : testHTML
 	@(echo > .memdump)
@@ -417,6 +422,12 @@
 	      rm result.$$name result2.$$name ; \
 	  fi ; fi ; done)
 
+Threadtests : testThreads
+	@echo "##"
+	@echo "## Threaded regression tests"
+	@echo "##"
+	testThreads
+
 SAXtests : testSAX
 	@(echo > .memdump)
 	@echo "##"
diff --git a/configure.in b/configure.in
index 45145ef..39d36ce 100644
--- a/configure.in
+++ b/configure.in
@@ -249,6 +249,7 @@
 THREAD_LIBS=""
 WITH_THREADS=0
 THREAD_CFLAGS=""
+TEST_THREADS=""
 
 AC_ARG_WITH(threads, [  --with-threads          Add multithread support(off)])
 if test "$with_threads" = "yes" ; then
@@ -259,20 +260,22 @@
 	   THREAD_LIBS="-lpthread"
 	   AC_DEFINE(HAVE_LIBPTHREAD)
 	   AC_DEFINE(HAVE_PTHREAD_H)
-	   WITH_THREADS=1]))
+	   WITH_THREADS="1"]))
 
     if test "$WITH_THREADS" = "1" ; then
-        THREAD_CFLAGS="$XML_CFLAGS -D_REENTRANT"
+	THREAD_CFLAGS="$THREAD_CFLAGS -D_REENTRANT"
+	TEST_THREADS="Threadtests"
     fi
 fi
 AC_ARG_WITH(thread-alloc, [  --with-thread-alloc     Add per-thread memory(off)])
-if test "$with_threads" = "yes" -a "$WITH_THREADS" = "1" ; then
-    THREAD_CFLAGS="$XML_CFLAGS -DLIBXML_THREAD_ALLOC_ENABLED"
+if test "$with_threads_alloc" = "yes" -a "$WITH_THREADS" = "1" ; then
+    THREAD_CFLAGS="$THREAD_CFLAGS -DLIBXML_THREAD_ALLOC_ENABLED"
 fi
 
 AC_SUBST(THREAD_LIBS)
 AC_SUBST(WITH_THREADS)
 AC_SUBST(THREAD_CFLAGS)
+AC_SUBST(TEST_THREADS)
 
 AC_ARG_WITH(history, [  --with-history          Add history support to xmllint shell(off)])
 if test "$with_history" = "yes" ; then
diff --git a/test/threads/a.example.org.xml b/test/threads/a.example.org.xml
new file mode 100644
index 0000000..3de2c45
--- /dev/null
+++ b/test/threads/a.example.org.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
+<rewriteSystem systemIdStartString="http://example.org/a" rewritePrefix="a"/>
+<nextCatalog catalog="c.example.org.xml"/>
+</catalog>
diff --git a/test/threads/a/a.dtd b/test/threads/a/a.dtd
new file mode 100644
index 0000000..7699a22
--- /dev/null
+++ b/test/threads/a/a.dtd
@@ -0,0 +1 @@
+<!ELEMENT a EMPTY>
diff --git a/test/threads/abc.dtd b/test/threads/abc.dtd
new file mode 100644
index 0000000..b7a08fe
--- /dev/null
+++ b/test/threads/abc.dtd
@@ -0,0 +1,7 @@
+<!ENTITY % a SYSTEM "http://example.org/a/a.dtd">
+%a;
+<!ENTITY % b SYSTEM "http://example.org/b/b.dtd">
+%b;
+<!ENTITY % c SYSTEM "http://example.org/c/c.dtd">
+%c;
+<!ELEMENT abc (a, b, c)>
diff --git a/test/threads/abc.xml b/test/threads/abc.xml
new file mode 100644
index 0000000..1c3bb96
--- /dev/null
+++ b/test/threads/abc.xml
@@ -0,0 +1,7 @@
+<!DOCTYPE abc SYSTEM "http://example.org/abc.dtd">
+<abc>
+  <a/>
+  <b/>
+  <c/>
+</abc>
+
diff --git a/test/threads/acb.dtd b/test/threads/acb.dtd
new file mode 100644
index 0000000..9fc77c5
--- /dev/null
+++ b/test/threads/acb.dtd
@@ -0,0 +1,7 @@
+<!ENTITY % a SYSTEM "http://example.org/a/a.dtd">
+%a;
+<!ENTITY % c SYSTEM "http://example.org/c/c.dtd">
+%c;
+<!ENTITY % b SYSTEM "http://example.org/b/b.dtd">
+%b;
+<!ELEMENT acb (a, c, b)>
diff --git a/test/threads/acb.xml b/test/threads/acb.xml
new file mode 100644
index 0000000..af2030e
--- /dev/null
+++ b/test/threads/acb.xml
@@ -0,0 +1,7 @@
+<!DOCTYPE acb SYSTEM "http://example.org/acb.dtd">
+<acb>
+  <a/>
+  <c/>
+  <b/>
+</acb>
+
diff --git a/test/threads/b.example.org.xml b/test/threads/b.example.org.xml
new file mode 100644
index 0000000..2dfe5fc
--- /dev/null
+++ b/test/threads/b.example.org.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
+<rewriteSystem systemIdStartString="http://example.org/b" rewritePrefix="b"/>
+<nextCatalog catalog="c.example.org.xml"/>
+</catalog>
diff --git a/test/threads/b/b.dtd b/test/threads/b/b.dtd
new file mode 100644
index 0000000..c1435a8
--- /dev/null
+++ b/test/threads/b/b.dtd
@@ -0,0 +1 @@
+<!ELEMENT b EMPTY>
diff --git a/test/threads/bac.dtd b/test/threads/bac.dtd
new file mode 100644
index 0000000..d36a4e6
--- /dev/null
+++ b/test/threads/bac.dtd
@@ -0,0 +1,7 @@
+<!ENTITY % b SYSTEM "http://example.org/b/b.dtd">
+%b;
+<!ENTITY % a SYSTEM "http://example.org/a/a.dtd">
+%a;
+<!ENTITY % c SYSTEM "http://example.org/c/c.dtd">
+%c;
+<!ELEMENT bac (b, a, c)>
diff --git a/test/threads/bac.xml b/test/threads/bac.xml
new file mode 100644
index 0000000..51799e4
--- /dev/null
+++ b/test/threads/bac.xml
@@ -0,0 +1,7 @@
+<!DOCTYPE bac SYSTEM "http://example.org/bac.dtd">
+<bac>
+  <b/>
+  <a/>
+  <c/>
+</bac>
+
diff --git a/test/threads/bca.dtd b/test/threads/bca.dtd
new file mode 100644
index 0000000..239192a
--- /dev/null
+++ b/test/threads/bca.dtd
@@ -0,0 +1,7 @@
+<!ENTITY % b SYSTEM "http://example.org/b/b.dtd">
+%b;
+<!ENTITY % c SYSTEM "http://example.org/c/c.dtd">
+%c;
+<!ENTITY % a SYSTEM "http://example.org/a/a.dtd">
+%a;
+<!ELEMENT bca (b, c, a)>
diff --git a/test/threads/bca.xml b/test/threads/bca.xml
new file mode 100644
index 0000000..4f4f8bb
--- /dev/null
+++ b/test/threads/bca.xml
@@ -0,0 +1,7 @@
+<!DOCTYPE bca SYSTEM "http://example.org/bca.dtd">
+<bca>
+  <b/>
+  <c/>
+  <a/>
+</bca>
+
diff --git a/test/threads/c.example.org.xml b/test/threads/c.example.org.xml
new file mode 100644
index 0000000..41348b1
--- /dev/null
+++ b/test/threads/c.example.org.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
+<rewriteSystem systemIdStartString="http://example.org/c" rewritePrefix="c"/>
+<rewriteSystem systemIdStartString="http://example.org/" rewritePrefix="./"/>
+</catalog>
diff --git a/test/threads/c/c.dtd b/test/threads/c/c.dtd
new file mode 100644
index 0000000..7248a5b
--- /dev/null
+++ b/test/threads/c/c.dtd
@@ -0,0 +1 @@
+<!ELEMENT c EMPTY>
diff --git a/test/threads/cab.dtd b/test/threads/cab.dtd
new file mode 100644
index 0000000..0a62e91
--- /dev/null
+++ b/test/threads/cab.dtd
@@ -0,0 +1,7 @@
+<!ENTITY % c SYSTEM "http://example.org/c/c.dtd">
+%c;
+<!ENTITY % a SYSTEM "http://example.org/a/a.dtd">
+%a;
+<!ENTITY % b SYSTEM "http://example.org/b/b.dtd">
+%b;
+<!ELEMENT cab (c, a, b)>
diff --git a/test/threads/cab.xml b/test/threads/cab.xml
new file mode 100644
index 0000000..81f45d0
--- /dev/null
+++ b/test/threads/cab.xml
@@ -0,0 +1,7 @@
+<!DOCTYPE cab SYSTEM "http://example.org/cab.dtd">
+<cab>
+  <c/>
+  <a/>
+  <b/>
+</cab>
+
diff --git a/test/threads/cba.dtd b/test/threads/cba.dtd
new file mode 100644
index 0000000..71b96b4
--- /dev/null
+++ b/test/threads/cba.dtd
@@ -0,0 +1,7 @@
+<!ENTITY % c SYSTEM "http://example.org/c/c.dtd">
+%c;
+<!ENTITY % b SYSTEM "http://example.org/b/b.dtd">
+%b;
+<!ENTITY % a SYSTEM "http://example.org/a/a.dtd">
+%a;
+<!ELEMENT cba (c, b, a)>
diff --git a/test/threads/cba.xml b/test/threads/cba.xml
new file mode 100644
index 0000000..5bbd570
--- /dev/null
+++ b/test/threads/cba.xml
@@ -0,0 +1,7 @@
+<!DOCTYPE cba SYSTEM "http://example.org/cba.dtd">
+<cba>
+  <c/>
+  <b/>
+  <a/>
+</cba>
+
diff --git a/test/threads/complex.xml b/test/threads/complex.xml
new file mode 100644
index 0000000..0174e90
--- /dev/null
+++ b/test/threads/complex.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
+<delegateSystem systemIdStartString="http://example.org/"
+                catalog="example.org.xml"/>
+</catalog>
diff --git a/test/threads/example.org.xml b/test/threads/example.org.xml
new file mode 100644
index 0000000..21c2602
--- /dev/null
+++ b/test/threads/example.org.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
+<delegateSystem systemIdStartString="http://example.org/a"
+                catalog="a.example.org.xml"/>
+<delegateSystem systemIdStartString="http://example.org/b"
+                catalog="b.example.org.xml"/>
+<nextCatalog catalog="c.example.org.xml"/>
+</catalog>
diff --git a/test/threads/invalid.xml b/test/threads/invalid.xml
new file mode 100644
index 0000000..9123275
--- /dev/null
+++ b/test/threads/invalid.xml
@@ -0,0 +1,2 @@
+<!-- Well formed but invalid -->
+<doc/>
diff --git a/testThreads.c b/testThreads.c
new file mode 100644
index 0000000..e0c06fb
--- /dev/null
+++ b/testThreads.c
@@ -0,0 +1,87 @@
+#include <stdlib.h>
+#include <features.h>
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_THREAD_ENABLED
+#include <libxml/globals.h>
+#include <libxml/threads.h>
+#include <libxml/parser.h>
+#include <libxml/catalog.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <assert.h>
+
+#define	MAX_ARGC	20
+static pthread_t tid[MAX_ARGC];
+
+static const char *catalog = "test/threads/complex.xml";
+static const char *testfiles[] = {
+    "test/threads/abc.xml",
+    "test/threads/acb.xml",
+    "test/threads/bac.xml",
+    "test/threads/bca.xml",
+    "test/threads/cab.xml",
+    "test/threads/cba.xml",
+    "test/threads/invalid.xml",
+};
+
+static void *
+thread_specific_data(void *private_data)
+{
+    xmlDocPtr myDoc;
+    const char *filename = (const char *) private_data;
+
+    if (!strcmp(filename, "test/thread/invalid.xml") == 0) {
+        xmlDoValidityCheckingDefaultValue = 0;
+        xmlGenericErrorContext = stdout;
+    } else {
+        xmlDoValidityCheckingDefaultValue = 1;
+        xmlGenericErrorContext = stderr;
+    }
+    myDoc = xmlParseFile(filename);
+    if (myDoc) {
+        xmlFreeDoc(myDoc);
+    } else
+        printf("parse failed\n");
+    if (!strcmp(filename, "test/thread/invalid.xml") == 0) {
+        if (xmlDoValidityCheckingDefaultValue != 0)
+	    printf("ValidityCheckingDefaultValue override failed\n");
+        if (xmlGenericErrorContext != stdout)
+	    printf("ValidityCheckingDefaultValue override failed\n");
+    } else {
+        if (xmlDoValidityCheckingDefaultValue != 1)
+	    printf("ValidityCheckingDefaultValue override failed\n");
+        if (xmlGenericErrorContext != stderr)
+	    printf("ValidityCheckingDefaultValue override failed\n");
+    }
+    return (NULL);
+}
+
+int
+main()
+{
+    unsigned int i;
+    unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]);
+
+    xmlInitParser();
+    xmlLoadCatalog(catalog);
+
+    for (i = 0; i < num_threads; i++)
+        pthread_create(&tid[i], 0, thread_specific_data, (void *) testfiles[i]);
+    for (i = 0; i < num_threads; i++)
+        pthread_join(tid[i], NULL);
+
+    xmlCleanupParser();
+    xmlMemoryDump();
+    return (0);
+}
+
+#else /* !LIBXML_THREADS_ENABLED */
+int
+main()
+{
+    fprintf(stderr, "libxml was not compiled with thread support\n");
+    return (0);
+}
+#endif