38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include "libxml.h"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <stdlib.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <stdio.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/globals.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/threads.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/parser.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/catalog.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <windows.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <string.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <assert.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define MAX_ARGC 20
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define TEST_REPEAT_COUNT 500
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic HANDLE tid[MAX_ARGC];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic const char *catalog = "test/threads/complex.xml";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic char *testfiles[] = {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "test/threads/abc.xml",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "test/threads/acb.xml",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "test/threads/bac.xml",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "test/threads/bca.xml",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "test/threads/cab.xml",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "test/threads/cba.xml",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "test/threads/invalid.xml",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync};
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncconst char *Okay = "OK";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncconst char *Failed = "Failed";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifndef xmlDoValidityCheckingDefaultValue
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#error xmlDoValidityCheckingDefaultValue is not a macro
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifndef xmlGenericErrorContext
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#error xmlGenericErrorContext is not a macro
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic DWORD WINAPI
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncthread_specific_data(void *private_data)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDocPtr myDoc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *filename = (const char *) private_data;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int okay = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!strcmp(filename, "test/threads/invalid.xml")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDoValidityCheckingDefaultValue = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericErrorContext = stdout;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDoValidityCheckingDefaultValue = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericErrorContext = stderr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync myDoc = xmlParseFile(filename);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (myDoc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeDoc(myDoc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("parse failed\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync okay = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!strcmp(filename, "test/threads/invalid.xml")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlDoValidityCheckingDefaultValue != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("ValidityCheckingDefaultValue override failed\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync okay = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlGenericErrorContext != stdout) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("xmlGenericErrorContext override failed\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync okay = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlDoValidityCheckingDefaultValue != 1) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("ValidityCheckingDefaultValue override failed\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync okay = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlGenericErrorContext != stderr) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("xmlGenericErrorContext override failed\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync okay = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (okay == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ((DWORD) Failed);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ((DWORD) Okay);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncmain()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned int i, repeat;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync DWORD results[MAX_ARGC];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync BOOL ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInitParser();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (repeat = 0;repeat < TEST_REPEAT_COUNT;repeat++)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlLoadCatalog(catalog);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < num_threads; i++)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync results[i] = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tid[i] = (HANDLE) -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < num_threads; i++)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync DWORD useless;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tid[i] = CreateThread(NULL, 0,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync thread_specific_data, testfiles[i], 0, &useless);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (tid[i] == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror("CreateThread");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync exit(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (WaitForMultipleObjects (num_threads, tid, TRUE, INFINITE) == WAIT_FAILED)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror ("WaitForMultipleObjects failed");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < num_threads; i++)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = GetExitCodeThread (tid[i], &results[i]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync perror("GetExitCodeThread");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync exit(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync CloseHandle (tid[i]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCatalogCleanup();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0; i < num_threads; i++) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (results[i] != (DWORD) Okay)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("Thread %d handling %s failed\n", i, testfiles[i]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCleanupParser();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlMemoryDump();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else /* !LIBXML_THREADS_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncmain()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "libxml was not compiled with thread or catalog support\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif