File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libxml2 / testThreadsWin32.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jun 15 19:53:28 2014 UTC (10 years ago) by misho
Branches: libxml2, MAIN
CVS tags: v2_9_1p0, v2_9_1, HEAD
libxml2 2.9.1

    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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>