/ libxml2 / testThreadsWin32.c
testThreadsWin32.c
  1  #include "libxml.h"
  2  #include <stdlib.h>
  3  #include <stdio.h>
  4  
  5  #if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED)
  6  #include <libxml/globals.h>
  7  #include <libxml/threads.h>
  8  #include <libxml/parser.h>
  9  #include <libxml/catalog.h>
 10  #include <windows.h>
 11  #include <string.h>
 12  #include <assert.h>
 13  
 14  #define	MAX_ARGC	20
 15  #define TEST_REPEAT_COUNT 500
 16  
 17  static HANDLE tid[MAX_ARGC];
 18  
 19  static const char *catalog = "test/threads/complex.xml";
 20  static char *testfiles[] = {
 21      "test/threads/abc.xml",
 22      "test/threads/acb.xml",
 23      "test/threads/bac.xml",
 24      "test/threads/bca.xml",
 25      "test/threads/cab.xml",
 26      "test/threads/cba.xml",
 27      "test/threads/invalid.xml",
 28  };
 29  
 30  const char *Okay = "OK";
 31  const char *Failed = "Failed";
 32  
 33  #ifndef xmlDoValidityCheckingDefaultValue
 34  #error xmlDoValidityCheckingDefaultValue is not a macro
 35  #endif
 36  #ifndef xmlGenericErrorContext
 37  #error xmlGenericErrorContext is not a macro
 38  #endif
 39  
 40  static DWORD WINAPI
 41  thread_specific_data(void *private_data)
 42  {
 43      xmlDocPtr myDoc;
 44      const char *filename = (const char *) private_data;
 45      int okay = 1;
 46  
 47      if (!strcmp(filename, "test/threads/invalid.xml")) {
 48          xmlDoValidityCheckingDefaultValue = 0;
 49          xmlGenericErrorContext = stdout;
 50      } else {
 51          xmlDoValidityCheckingDefaultValue = 1;
 52          xmlGenericErrorContext = stderr;
 53      }
 54      myDoc = xmlParseFile(filename);
 55      if (myDoc) {
 56          xmlFreeDoc(myDoc);
 57      } else {
 58          printf("parse failed\n");
 59  	okay = 0;
 60      }
 61      if (!strcmp(filename, "test/threads/invalid.xml")) {
 62          if (xmlDoValidityCheckingDefaultValue != 0) {
 63  	    printf("ValidityCheckingDefaultValue override failed\n");
 64  	    okay = 0;
 65  	}
 66          if (xmlGenericErrorContext != stdout) {
 67  	    printf("xmlGenericErrorContext override failed\n");
 68  	    okay = 0;
 69  	}
 70      } else {
 71          if (xmlDoValidityCheckingDefaultValue != 1) {
 72  	    printf("ValidityCheckingDefaultValue override failed\n");
 73  	    okay = 0;
 74  	}
 75          if (xmlGenericErrorContext != stderr) {
 76  	    printf("xmlGenericErrorContext override failed\n");
 77  	    okay = 0;
 78  	}
 79      }
 80      if (okay == 0)
 81  	return ((DWORD) Failed);
 82      return ((DWORD) Okay);
 83  }
 84  
 85  int
 86  main()
 87  {
 88  	unsigned int i, repeat;
 89  	unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]);
 90  	DWORD results[MAX_ARGC];
 91  	BOOL ret;
 92  
 93  	xmlInitParser();
 94  	for (repeat = 0;repeat < TEST_REPEAT_COUNT;repeat++)
 95  	{
 96  		xmlLoadCatalog(catalog);
 97  
 98  		for (i = 0; i < num_threads; i++)
 99  		{
100  			results[i] = 0;
101  			tid[i] = (HANDLE) -1;
102  		}
103  
104  		for (i = 0; i < num_threads; i++)
105  		{
106  			DWORD useless;
107  			tid[i] = CreateThread(NULL, 0,
108  				thread_specific_data, testfiles[i], 0, &useless);
109  			if (tid[i] == NULL)
110  			{
111  				perror("CreateThread");
112  				exit(1);
113  			}
114  		}
115  
116  		if (WaitForMultipleObjects (num_threads, tid, TRUE, INFINITE) == WAIT_FAILED)
117  			perror ("WaitForMultipleObjects failed");
118  
119  		for (i = 0; i < num_threads; i++)
120  		{
121  			ret = GetExitCodeThread (tid[i], &results[i]);
122  			if (ret == 0)
123  			{
124  				perror("GetExitCodeThread");
125  				exit(1);
126  			}
127  			CloseHandle (tid[i]);
128  		}
129  
130  		xmlCatalogCleanup();
131  		for (i = 0; i < num_threads; i++) {
132  		    if (results[i] != (DWORD) Okay)
133  			printf("Thread %d handling %s failed\n", i, testfiles[i]);
134  		}
135  	}
136  
137  	xmlCleanupParser();
138  	xmlMemoryDump();
139  
140  	return (0);
141  }
142  
143  #else /* !LIBXML_THREADS_ENABLED */
144  int
145  main()
146  {
147      fprintf(stderr, "libxml was not compiled with thread or catalog support\n");
148      return (0);
149  }
150  #endif