File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libxml2 / testThreads.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jul 22 01:22:19 2013 UTC (10 years, 10 months ago) by misho
Branches: libxml2, MAIN
CVS tags: v2_9_1p0, v2_9_1, v2_8_0p0, v2_8_0, HEAD
2.8.0

    1: #include "libxml.h"
    2: 
    3: #include <stdlib.h>
    4: #include <stdio.h>
    5: 
    6: #if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_SAX1_ENABLED)
    7: #include <libxml/globals.h>
    8: #include <libxml/threads.h>
    9: #include <libxml/parser.h>
   10: #include <libxml/catalog.h>
   11: #ifdef HAVE_PTHREAD_H
   12: #include <pthread.h>
   13: #elif defined HAVE_BEOS_THREADS
   14: #include <OS.h>
   15: #endif
   16: #include <string.h>
   17: #if !defined(_MSC_VER)
   18: #include <unistd.h>
   19: #endif
   20: #include <assert.h>
   21: 
   22: #define	MAX_ARGC	20
   23: #ifdef HAVE_PTHREAD_H
   24: static pthread_t tid[MAX_ARGC];
   25: #elif defined HAVE_BEOS_THREADS
   26: static thread_id tid[MAX_ARGC];
   27: #endif
   28: 
   29: static const char *catalog = "test/threads/complex.xml";
   30: static const char *testfiles[] = {
   31:     "test/threads/abc.xml",
   32:     "test/threads/acb.xml",
   33:     "test/threads/bac.xml",
   34:     "test/threads/bca.xml",
   35:     "test/threads/cab.xml",
   36:     "test/threads/cba.xml",
   37:     "test/threads/invalid.xml",
   38: };
   39: 
   40: static const char *Okay = "OK";
   41: static const char *Failed = "Failed";
   42: 
   43: #ifndef xmlDoValidityCheckingDefaultValue
   44: #error xmlDoValidityCheckingDefaultValue is not a macro
   45: #endif
   46: #ifndef xmlGenericErrorContext
   47: #error xmlGenericErrorContext is not a macro
   48: #endif
   49: 
   50: static void *
   51: thread_specific_data(void *private_data)
   52: {
   53:     xmlDocPtr myDoc;
   54:     const char *filename = (const char *) private_data;
   55:     int okay = 1;
   56: 
   57:     if (!strcmp(filename, "test/threads/invalid.xml")) {
   58:         xmlDoValidityCheckingDefaultValue = 0;
   59:         xmlGenericErrorContext = stdout;
   60:     } else {
   61:         xmlDoValidityCheckingDefaultValue = 1;
   62:         xmlGenericErrorContext = stderr;
   63:     }
   64:     myDoc = xmlParseFile(filename);
   65:     if (myDoc) {
   66:         xmlFreeDoc(myDoc);
   67:     } else {
   68:         printf("parse failed\n");
   69: 	okay = 0;
   70:     }
   71:     if (!strcmp(filename, "test/threads/invalid.xml")) {
   72:         if (xmlDoValidityCheckingDefaultValue != 0) {
   73: 	    printf("ValidityCheckingDefaultValue override failed\n");
   74: 	    okay = 0;
   75: 	}
   76:         if (xmlGenericErrorContext != stdout) {
   77: 	    printf("xmlGenericErrorContext override failed\n");
   78: 	    okay = 0;
   79: 	}
   80:     } else {
   81:         if (xmlDoValidityCheckingDefaultValue != 1) {
   82: 	    printf("ValidityCheckingDefaultValue override failed\n");
   83: 	    okay = 0;
   84: 	}
   85:         if (xmlGenericErrorContext != stderr) {
   86: 	    printf("xmlGenericErrorContext override failed\n");
   87: 	    okay = 0;
   88: 	}
   89:     }
   90:     if (okay == 0)
   91: 	return((void *) Failed);
   92:     return ((void *) Okay);
   93: }
   94: 
   95: #ifdef HAVE_PTHREAD_H
   96: int
   97: main(void)
   98: {
   99:     unsigned int i, repeat;
  100:     unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]);
  101:     void *results[MAX_ARGC];
  102:     int ret;
  103: 
  104:     xmlInitParser();
  105:     for (repeat = 0;repeat < 500;repeat++) {
  106: 	xmlLoadCatalog(catalog);
  107: 
  108:         memset(results, 0, sizeof(*results)*num_threads);
  109:         memset(tid, 0xff, sizeof(*tid)*num_threads);
  110: 
  111: 	for (i = 0; i < num_threads; i++) {
  112: 	    ret = pthread_create(&tid[i], NULL, thread_specific_data,
  113: 				 (void *) testfiles[i]);
  114: 	    if (ret != 0) {
  115: 		perror("pthread_create");
  116: 		exit(1);
  117: 	    }
  118: 	}
  119: 	for (i = 0; i < num_threads; i++) {
  120: 	    ret = pthread_join(tid[i], &results[i]);
  121: 	    if (ret != 0) {
  122: 		perror("pthread_join");
  123: 		exit(1);
  124: 	    }
  125: 	}
  126: 
  127: 	xmlCatalogCleanup();
  128: 	for (i = 0; i < num_threads; i++)
  129: 	    if (results[i] != (void *) Okay)
  130: 		printf("Thread %d handling %s failed\n", i, testfiles[i]);
  131:     }
  132:     xmlCleanupParser();
  133:     xmlMemoryDump();
  134:     return (0);
  135: }
  136: #elif defined HAVE_BEOS_THREADS
  137: int
  138: main(void)
  139: {
  140:     unsigned int i, repeat;
  141:     unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]);
  142:     void *results[MAX_ARGC];
  143:     status_t ret;
  144: 
  145:     xmlInitParser();
  146:     printf("Parser initialized\n");
  147:     for (repeat = 0;repeat < 500;repeat++) {
  148:     printf("repeat: %d\n",repeat);
  149: 	xmlLoadCatalog(catalog);
  150: 	printf("loaded catalog: %s\n", catalog);
  151: 	for (i = 0; i < num_threads; i++) {
  152: 	    results[i] = NULL;
  153: 	    tid[i] = (thread_id) -1;
  154: 	}
  155: 	printf("cleaned threads\n");
  156: 	for (i = 0; i < num_threads; i++) {
  157: 		tid[i] = spawn_thread(thread_specific_data, "xmlTestThread", B_NORMAL_PRIORITY, (void *) testfiles[i]);
  158: 		if (tid[i] < B_OK) {
  159: 			perror("beos_thread_create");
  160: 			exit(1);
  161: 		}
  162: 		printf("beos_thread_create %d -> %d\n", i, tid[i]);
  163: 	}
  164: 	for (i = 0; i < num_threads; i++) {
  165: 	    ret = wait_for_thread(tid[i], &results[i]);
  166: 	    printf("beos_thread_wait %d -> %d\n", i, ret);
  167: 	    if (ret != B_OK) {
  168: 			perror("beos_thread_wait");
  169: 			exit(1);
  170: 	    }
  171: 	}
  172: 
  173: 	xmlCatalogCleanup();
  174: 	ret = B_OK;
  175: 	for (i = 0; i < num_threads; i++)
  176: 	    if (results[i] != (void *) Okay) {
  177: 			printf("Thread %d handling %s failed\n", i, testfiles[i]);
  178: 			ret = B_ERROR;
  179: 		}
  180:     }
  181:     xmlCleanupParser();
  182:     xmlMemoryDump();
  183: 
  184: 	if (ret == B_OK)
  185: 		printf("testThread : BeOS : SUCCESS!\n");
  186: 	else
  187: 		printf("testThread : BeOS : FAILED!\n");
  188: 
  189:     return (0);
  190: }
  191: #endif /* pthreads or BeOS threads */
  192: 
  193: #else /* !LIBXML_THREADS_ENABLED */
  194: int
  195: main(void)
  196: {
  197:     fprintf(stderr, "libxml was not compiled with thread or catalog support\n");
  198:     return (0);
  199: }
  200: #endif

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