Annotation of embedaddon/libxml2/testThreads.c, revision 1.1
1.1 ! misho 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: for (i = 0; i < num_threads; i++) {
! 109: results[i] = NULL;
! 110: tid[i] = (pthread_t) -1;
! 111: }
! 112:
! 113: for (i = 0; i < num_threads; i++) {
! 114: ret = pthread_create(&tid[i], NULL, thread_specific_data,
! 115: (void *) testfiles[i]);
! 116: if (ret != 0) {
! 117: perror("pthread_create");
! 118: exit(1);
! 119: }
! 120: }
! 121: for (i = 0; i < num_threads; i++) {
! 122: ret = pthread_join(tid[i], &results[i]);
! 123: if (ret != 0) {
! 124: perror("pthread_join");
! 125: exit(1);
! 126: }
! 127: }
! 128:
! 129: xmlCatalogCleanup();
! 130: for (i = 0; i < num_threads; i++)
! 131: if (results[i] != (void *) Okay)
! 132: printf("Thread %d handling %s failed\n", i, testfiles[i]);
! 133: }
! 134: xmlCleanupParser();
! 135: xmlMemoryDump();
! 136: return (0);
! 137: }
! 138: #elif defined HAVE_BEOS_THREADS
! 139: int
! 140: main(void)
! 141: {
! 142: unsigned int i, repeat;
! 143: unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]);
! 144: void *results[MAX_ARGC];
! 145: status_t ret;
! 146:
! 147: xmlInitParser();
! 148: printf("Parser initialized\n");
! 149: for (repeat = 0;repeat < 500;repeat++) {
! 150: printf("repeat: %d\n",repeat);
! 151: xmlLoadCatalog(catalog);
! 152: printf("loaded catalog: %s\n", catalog);
! 153: for (i = 0; i < num_threads; i++) {
! 154: results[i] = NULL;
! 155: tid[i] = (thread_id) -1;
! 156: }
! 157: printf("cleaned threads\n");
! 158: for (i = 0; i < num_threads; i++) {
! 159: tid[i] = spawn_thread(thread_specific_data, "xmlTestThread", B_NORMAL_PRIORITY, (void *) testfiles[i]);
! 160: if (tid[i] < B_OK) {
! 161: perror("beos_thread_create");
! 162: exit(1);
! 163: }
! 164: printf("beos_thread_create %d -> %d\n", i, tid[i]);
! 165: }
! 166: for (i = 0; i < num_threads; i++) {
! 167: ret = wait_for_thread(tid[i], &results[i]);
! 168: printf("beos_thread_wait %d -> %d\n", i, ret);
! 169: if (ret != B_OK) {
! 170: perror("beos_thread_wait");
! 171: exit(1);
! 172: }
! 173: }
! 174:
! 175: xmlCatalogCleanup();
! 176: ret = B_OK;
! 177: for (i = 0; i < num_threads; i++)
! 178: if (results[i] != (void *) Okay) {
! 179: printf("Thread %d handling %s failed\n", i, testfiles[i]);
! 180: ret = B_ERROR;
! 181: }
! 182: }
! 183: xmlCleanupParser();
! 184: xmlMemoryDump();
! 185:
! 186: if (ret == B_OK)
! 187: printf("testThread : BeOS : SUCCESS!\n");
! 188: else
! 189: printf("testThread : BeOS : FAILED!\n");
! 190:
! 191: return (0);
! 192: }
! 193: #endif /* pthreads or BeOS threads */
! 194:
! 195: #else /* !LIBXML_THREADS_ENABLED */
! 196: int
! 197: main(void)
! 198: {
! 199: fprintf(stderr, "libxml was not compiled with thread or catalog support\n");
! 200: return (0);
! 201: }
! 202: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>