[libxml2] Merge testThreadsWin32.c into testThreads.c



commit 57d4329bd7440257929b763914bcb5439f53f1f5
Author: Nick Wellnhofer <wellnhofer aevum de>
Date:   Tue Jan 23 17:33:42 2018 +0100

    Merge testThreadsWin32.c into testThreads.c
    
    Apply the same cross-platform modifications as previously in runtest.c.

 Makefile.am          |   6 +--
 bakefile/libxml2.bkl |   5 +-
 doc/apibuild.py      |   1 -
 testThreads.c        | 133 ++++++++++++++++++++++++++++++++++-----------
 testThreadsWin32.c   | 150 ---------------------------------------------------
 win32/Makefile.bcb   |   4 +-
 win32/Makefile.mingw |  11 +---
 win32/Makefile.msvc  |   4 +-
 8 files changed, 107 insertions(+), 207 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 9c630be4..174b9843 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -126,11 +126,7 @@ testC14N_LDFLAGS =
 testC14N_DEPENDENCIES = $(DEPS)
 testC14N_LDADD= $(LDADDS)
 
-if THREADS_W32
-testThreads_SOURCES = testThreadsWin32.c
-else
 testThreads_SOURCES = testThreads.c
-endif
 testThreads_LDFLAGS = 
 testThreads_DEPENDENCIES = $(DEPS)
 testThreads_LDADD= $(BASE_THREAD_LIBS) $(LDADDS)
@@ -1253,7 +1249,7 @@ EXTRA_DIST = xml2-config.in xml2Conf.sh.in libxml.spec.in libxml2.spec \
             libxml2-config.cmake.in autogen.sh \
             trionan.c trionan.h triostr.c triostr.h trio.c trio.h \
             triop.h triodef.h libxml.h elfgcchack.h xzlib.h buf.h \
-            enc.h save.h testThreadsWin32.c genUnicode.py TODO_SCHEMAS \
+            enc.h save.h genUnicode.py TODO_SCHEMAS \
             dbgen.pl dbgenattr.pl regressions.py regressions.xml \
             README.tests Makefile.tests libxml2.syms timsort.h \
             README.zOS \
diff --git a/bakefile/libxml2.bkl b/bakefile/libxml2.bkl
index dd6ce2c2..fa2d285e 100644
--- a/bakefile/libxml2.bkl
+++ b/bakefile/libxml2.bkl
@@ -736,12 +736,9 @@ $(TAB)copy "$(DOLLAR)(InputPath)" ..\$(CONFIG_DSTNAME)
        <!-- FIXME:
                <exe id="testModule" 
template="xml2test"><sources>$(XMLBASEDIR)$(DIRSEP)testModule.c</sources></exe>
 
-               <if cond="WITH_THREADS=='posix'">
+               <if cond="WITH_THREADS!='no'">
                        <exe id="testThreads" 
template="xml2test"><sources>$(XMLBASEDIR)$(DIRSEP)testThreads.c</sources></exe>
                </if>
-               <if cond="WITH_THREADS=='ctls' or WITH_THREADS=='native'">
-                       <exe id="testThreadsWin32" 
template="xml2test"><sources>$(XMLBASEDIR)$(DIRSEP)testThreadsWin32.c</sources></exe>
-               </if>
        -->
        </if>
 
diff --git a/doc/apibuild.py b/doc/apibuild.py
index 7a364663..7c69a537 100755
--- a/doc/apibuild.py
+++ b/doc/apibuild.py
@@ -42,7 +42,6 @@ ignored_files = {
   "testThreads.c": "test tool",
   "testC14N.c": "test tool",
   "testRelax.c": "test tool",
-  "testThreadsWin32.c": "test tool",
   "testSAX.c": "test tool",
   "testURI.c": "test tool",
   "testapi.c": "generated regression tests",
diff --git a/testThreads.c b/testThreads.c
index 2ef70a74..bef65377 100644
--- a/testThreads.c
+++ b/testThreads.c
@@ -10,6 +10,8 @@
 #include <libxml/catalog.h>
 #ifdef HAVE_PTHREAD_H
 #include <pthread.h>
+#elif defined HAVE_WIN32_THREADS
+#include <windows.h>
 #elif defined HAVE_BEOS_THREADS
 #include <OS.h>
 #endif
@@ -20,25 +22,32 @@
 #include <assert.h>
 
 #define        MAX_ARGC        20
+#define TEST_REPEAT_COUNT 500
 #ifdef HAVE_PTHREAD_H
 static pthread_t tid[MAX_ARGC];
+#elif defined HAVE_WIN32_THREADS
+static HANDLE tid[MAX_ARGC];
 #elif defined HAVE_BEOS_THREADS
 static thread_id tid[MAX_ARGC];
 #endif
 
+typedef struct {
+    const char *filename;
+    int okay;
+} xmlThreadParams;
+
 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 xmlThreadParams threadParams[] = {
+    { "test/threads/abc.xml", 0 },
+    { "test/threads/acb.xml", 0 },
+    { "test/threads/bac.xml", 0 },
+    { "test/threads/bca.xml", 0 },
+    { "test/threads/cab.xml", 0 },
+    { "test/threads/cba.xml", 0 },
+    { "test/threads/invalid.xml", 0 }
 };
-
-static const char *Okay = "OK";
-static const char *Failed = "Failed";
+static const unsigned int num_threads = sizeof(threadParams) /
+                                        sizeof(threadParams[0]);
 
 #ifndef xmlDoValidityCheckingDefaultValue
 #error xmlDoValidityCheckingDefaultValue is not a macro
@@ -51,7 +60,8 @@ static void *
 thread_specific_data(void *private_data)
 {
     xmlDocPtr myDoc;
-    const char *filename = (const char *) private_data;
+    xmlThreadParams *params = (xmlThreadParams *) private_data;
+    const char *filename = params->filename;
     int okay = 1;
 
     if (!strcmp(filename, "test/threads/invalid.xml")) {
@@ -91,9 +101,8 @@ thread_specific_data(void *private_data)
            okay = 0;
        }
     }
-    if (okay == 0)
-       return((void *) Failed);
-    return ((void *) Okay);
+    params->okay = okay;
+    return(NULL);
 }
 
 #ifdef HAVE_PTHREAD_H
@@ -101,27 +110,25 @@ int
 main(void)
 {
     unsigned int i, repeat;
-    unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]);
-    void *results[MAX_ARGC];
     int ret;
 
     xmlInitParser();
-    for (repeat = 0;repeat < 500;repeat++) {
+    for (repeat = 0;repeat < TEST_REPEAT_COUNT;repeat++) {
        xmlLoadCatalog(catalog);
 
-        memset(results, 0, sizeof(*results)*num_threads);
         memset(tid, 0xff, sizeof(*tid)*num_threads);
 
        for (i = 0; i < num_threads; i++) {
            ret = pthread_create(&tid[i], NULL, thread_specific_data,
-                                (void *) testfiles[i]);
+                                (void *) &threadParams[i]);
            if (ret != 0) {
                perror("pthread_create");
                exit(1);
            }
        }
        for (i = 0; i < num_threads; i++) {
-           ret = pthread_join(tid[i], &results[i]);
+            void *result;
+           ret = pthread_join(tid[i], &result);
            if (ret != 0) {
                perror("pthread_join");
                exit(1);
@@ -130,35 +137,97 @@ main(void)
 
        xmlCatalogCleanup();
        for (i = 0; i < num_threads; i++)
-           if (results[i] != (void *) Okay)
-               printf("Thread %d handling %s failed\n", i, testfiles[i]);
+           if (threadParams[i].okay == 0)
+               printf("Thread %d handling %s failed\n", i,
+                       threadParams[i].filename);
     }
     xmlCleanupParser();
     xmlMemoryDump();
     return (0);
 }
+#elif defined HAVE_WIN32_THREADS
+static DWORD WINAPI
+win32_thread_specific_data(void *private_data)
+{
+    thread_specific_data(private_data);
+    return(0);
+}
+
+int
+main(void)
+{
+    unsigned int i, repeat;
+    BOOL ret;
+
+    xmlInitParser();
+    for (repeat = 0;repeat < TEST_REPEAT_COUNT;repeat++)
+    {
+        xmlLoadCatalog(catalog);
+
+        for (i = 0; i < num_threads; i++)
+        {
+            tid[i] = (HANDLE) -1;
+        }
+
+        for (i = 0; i < num_threads; i++)
+        {
+            DWORD useless;
+            tid[i] = CreateThread(NULL, 0,
+                win32_thread_specific_data, &threadParams[i], 0, &useless);
+            if (tid[i] == NULL)
+            {
+                perror("CreateThread");
+                exit(1);
+            }
+        }
+
+        if (WaitForMultipleObjects (num_threads, tid, TRUE, INFINITE) == WAIT_FAILED)
+            perror ("WaitForMultipleObjects failed");
+
+        for (i = 0; i < num_threads; i++)
+        {
+            DWORD exitCode;
+            ret = GetExitCodeThread (tid[i], &exitCode);
+            if (ret == 0)
+            {
+                perror("GetExitCodeThread");
+                exit(1);
+            }
+            CloseHandle (tid[i]);
+        }
+
+        xmlCatalogCleanup();
+        for (i = 0; i < num_threads; i++) {
+            if (threadParams[i].okay == 0)
+            printf("Thread %d handling %s failed\n", i,
+                   threadParams[i].filename);
+        }
+    }
+
+    xmlCleanupParser();
+    xmlMemoryDump();
+
+    return (0);
+}
 #elif defined HAVE_BEOS_THREADS
 int
 main(void)
 {
     unsigned int i, repeat;
-    unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]);
-    void *results[MAX_ARGC];
     status_t ret;
 
     xmlInitParser();
     printf("Parser initialized\n");
-    for (repeat = 0;repeat < 500;repeat++) {
+    for (repeat = 0;repeat < TEST_REPEAT_COUNT;repeat++) {
     printf("repeat: %d\n",repeat);
        xmlLoadCatalog(catalog);
        printf("loaded catalog: %s\n", catalog);
        for (i = 0; i < num_threads; i++) {
-           results[i] = NULL;
            tid[i] = (thread_id) -1;
        }
        printf("cleaned threads\n");
        for (i = 0; i < num_threads; i++) {
-               tid[i] = spawn_thread(thread_specific_data, "xmlTestThread", B_NORMAL_PRIORITY, (void *) 
testfiles[i]);
+               tid[i] = spawn_thread(thread_specific_data, "xmlTestThread", B_NORMAL_PRIORITY, (void *) 
&threadParams[i]);
                if (tid[i] < B_OK) {
                        perror("beos_thread_create");
                        exit(1);
@@ -166,7 +235,8 @@ main(void)
                printf("beos_thread_create %d -> %d\n", i, tid[i]);
        }
        for (i = 0; i < num_threads; i++) {
-           ret = wait_for_thread(tid[i], &results[i]);
+            void *result;
+           ret = wait_for_thread(tid[i], &result);
            printf("beos_thread_wait %d -> %d\n", i, ret);
            if (ret != B_OK) {
                        perror("beos_thread_wait");
@@ -177,8 +247,9 @@ main(void)
        xmlCatalogCleanup();
        ret = B_OK;
        for (i = 0; i < num_threads; i++)
-           if (results[i] != (void *) Okay) {
-                       printf("Thread %d handling %s failed\n", i, testfiles[i]);
+           if (threadParams[i].okay == 0) {
+                       printf("Thread %d handling %s failed\n", i,
+                               threadParams[i].filename);
                        ret = B_ERROR;
                }
     }
diff --git a/win32/Makefile.bcb b/win32/Makefile.bcb
index 41002da5..d326fb99 100644
--- a/win32/Makefile.bcb
+++ b/win32/Makefile.bcb
@@ -225,9 +225,7 @@ UTILS = $(BINDIR)\xmllint.exe\
        $(BINDIR)\testlimits.exe
 
 
-!if "$(WITH_THREADS)" == "yes" || "$(WITH_THREADS)" == "ctls" || "$(WITH_THREADS)" == "native"
-UTILS = $(UTILS) $(BINDIR)\testThreadsWin32.exe
-!else if "$(WITH_THREADS)" == "posix"
+!if "$(WITH_THREADS)" != "no"
 UTILS = $(UTILS) $(BINDIR)\testThreads.exe
 !endif
 
diff --git a/win32/Makefile.mingw b/win32/Makefile.mingw
index 3d4cb888..9dfa4abe 100644
--- a/win32/Makefile.mingw
+++ b/win32/Makefile.mingw
@@ -220,16 +220,7 @@ UTILS = $(BINDIR)/xmllint.exe\
        $(BINDIR)/testapi.exe\
        $(BINDIR)/testlimits.exe
 
-ifeq ($(WITH_THREADS),yes)
-UTILS += $(BINDIR)/testThreadsWin32.exe
-endif
-ifeq ($(WITH_THREADS),ctls) 
-UTILS += $(BINDIR)/testThreadsWin32.exe
-endif
-ifeq ($(WITH_THREADS),native)
-UTILS += $(BINDIR)/testThreadsWin32.exe
-endif
-ifeq ($(WITH_THREADS),posix)
+ifneq ($(WITH_THREADS),no)
 UTILS += $(BINDIR)/testThreads.exe
 endif
 
diff --git a/win32/Makefile.msvc b/win32/Makefile.msvc
index ee4250af..f6a0182d 100644
--- a/win32/Makefile.msvc
+++ b/win32/Makefile.msvc
@@ -274,9 +274,7 @@ UTILS = $(BINDIR)\xmllint.exe\
        $(BINDIR)\testlimits.exe\
        $(BINDIR)\testrecurse.exe
        
-!if "$(WITH_THREADS)" == "yes" || "$(WITH_THREADS)" == "ctls" || "$(WITH_THREADS)" == "native"
-UTILS = $(UTILS) $(BINDIR)\testThreadsWin32.exe
-!else if "$(WITH_THREADS)" == "posix"
+!if "$(WITH_THREADS)" != "no"
 UTILS = $(UTILS) $(BINDIR)\testThreads.exe
 !endif
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]