summaryrefslogtreecommitdiff
path: root/testThreads.c
diff options
context:
space:
mode:
authorNick Wellnhofer <wellnhofer@aevum.de>2018-01-23 17:33:42 +0100
committerNick Wellnhofer <wellnhofer@aevum.de>2019-01-06 14:32:28 +0100
commit57d4329bd7440257929b763914bcb5439f53f1f5 (patch)
tree7525ddccdf37298f4a7d7f08ef94e37449d5be8f /testThreads.c
parent7f40ed01f7a7c05a804664822777e42005c5f1d8 (diff)
downloadlibxml2-57d4329bd7440257929b763914bcb5439f53f1f5.tar.gz
Merge testThreadsWin32.c into testThreads.c
Apply the same cross-platform modifications as previously in runtest.c.
Diffstat (limited to 'testThreads.c')
-rw-r--r--testThreads.c133
1 files changed, 102 insertions, 31 deletions
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;
}
}