Annotation of embedaddon/libxml2/testThreadsWin32.c, revision 1.1

1.1     ! misho       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>