diff options
author | Nick Wellnhofer <wellnhofer@aevum.de> | 2018-01-23 17:33:42 +0100 |
---|---|---|
committer | Nick Wellnhofer <wellnhofer@aevum.de> | 2019-01-06 14:32:28 +0100 |
commit | 57d4329bd7440257929b763914bcb5439f53f1f5 (patch) | |
tree | 7525ddccdf37298f4a7d7f08ef94e37449d5be8f /testThreads.c | |
parent | 7f40ed01f7a7c05a804664822777e42005c5f1d8 (diff) | |
download | libxml2-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.c | 133 |
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; } } |