2007-01-31 18:38:56 +00:00
# include "libxml.h"
2002-01-13 13:35:00 +00:00
# include <stdlib.h>
# include <stdio.h>
# if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED)
# include <libxml/globals.h>
# include <libxml/threads.h>
# include <libxml/parser.h>
# include <libxml/catalog.h>
# include <windows.h>
# include <string.h>
# include <assert.h>
# define MAX_ARGC 20
# define TEST_REPEAT_COUNT 500
static HANDLE tid [ MAX_ARGC ] ;
static const char * catalog = " test/threads/complex.xml " ;
static char * testfiles [ ] = {
" test/threads/abc.xml " ,
" test/threads/acb.xml " ,
" test/threads/bac.xml " ,
" test/threads/bca.xml " ,
" test/threads/cab.xml " ,
" test/threads/cba.xml " ,
" test/threads/invalid.xml " ,
} ;
const char * Okay = " OK " ;
const char * Failed = " Failed " ;
# ifndef xmlDoValidityCheckingDefaultValue
# error xmlDoValidityCheckingDefaultValue is not a macro
# endif
# ifndef xmlGenericErrorContext
# error xmlGenericErrorContext is not a macro
# endif
static DWORD WINAPI
thread_specific_data ( void * private_data )
{
xmlDocPtr myDoc ;
const char * filename = ( const char * ) private_data ;
int okay = 1 ;
if ( ! strcmp ( filename , " test/threads/invalid.xml " ) ) {
xmlDoValidityCheckingDefaultValue = 0 ;
xmlGenericErrorContext = stdout ;
} else {
xmlDoValidityCheckingDefaultValue = 1 ;
xmlGenericErrorContext = stderr ;
}
myDoc = xmlParseFile ( filename ) ;
if ( myDoc ) {
xmlFreeDoc ( myDoc ) ;
} else {
printf ( " parse failed \n " ) ;
okay = 0 ;
}
if ( ! strcmp ( filename , " test/threads/invalid.xml " ) ) {
if ( xmlDoValidityCheckingDefaultValue ! = 0 ) {
printf ( " ValidityCheckingDefaultValue override failed \n " ) ;
okay = 0 ;
}
if ( xmlGenericErrorContext ! = stdout ) {
printf ( " xmlGenericErrorContext override failed \n " ) ;
okay = 0 ;
}
} else {
if ( xmlDoValidityCheckingDefaultValue ! = 1 ) {
printf ( " ValidityCheckingDefaultValue override failed \n " ) ;
okay = 0 ;
}
if ( xmlGenericErrorContext ! = stderr ) {
printf ( " xmlGenericErrorContext override failed \n " ) ;
okay = 0 ;
}
}
if ( okay = = 0 )
return ( ( DWORD ) Failed ) ;
return ( ( DWORD ) Okay ) ;
}
int
main ( )
{
unsigned int i , repeat ;
unsigned int num_threads = sizeof ( testfiles ) / sizeof ( testfiles [ 0 ] ) ;
DWORD results [ MAX_ARGC ] ;
BOOL ret ;
xmlInitParser ( ) ;
for ( repeat = 0 ; repeat < TEST_REPEAT_COUNT ; repeat + + )
{
xmlLoadCatalog ( catalog ) ;
for ( i = 0 ; i < num_threads ; i + + )
{
results [ i ] = 0 ;
tid [ i ] = ( HANDLE ) - 1 ;
}
for ( i = 0 ; i < num_threads ; i + + )
{
DWORD useless ;
2012-09-11 13:26:36 +08:00
tid [ i ] = CreateThread ( NULL , 0 ,
2002-10-31 15:59:24 +00:00
thread_specific_data , testfiles [ i ] , 0 , & useless ) ;
2002-01-13 13:35:00 +00:00
if ( tid [ i ] = = NULL )
{
perror ( " CreateThread " ) ;
exit ( 1 ) ;
}
}
2012-09-11 13:26:36 +08:00
if ( WaitForMultipleObjects ( num_threads , tid , TRUE , INFINITE ) = = WAIT_FAILED )
2002-10-31 15:59:24 +00:00
perror ( " WaitForMultipleObjects failed " ) ;
2002-01-13 13:35:00 +00:00
for ( i = 0 ; i < num_threads ; i + + )
{
ret = GetExitCodeThread ( tid [ i ] , & results [ i ] ) ;
if ( ret = = 0 )
{
perror ( " GetExitCodeThread " ) ;
exit ( 1 ) ;
}
CloseHandle ( tid [ i ] ) ;
}
xmlCatalogCleanup ( ) ;
2002-10-31 15:59:24 +00:00
for ( i = 0 ; i < num_threads ; i + + ) {
2012-09-11 13:26:36 +08:00
if ( results [ i ] ! = ( DWORD ) Okay )
2002-10-31 15:59:24 +00:00
printf ( " Thread %d handling %s failed \n " , i , testfiles [ i ] ) ;
}
2002-01-13 13:35:00 +00:00
}
xmlCleanupParser ( ) ;
xmlMemoryDump ( ) ;
return ( 0 ) ;
}
# else /* !LIBXML_THREADS_ENABLED */
int
main ( )
{
fprintf ( stderr , " libxml was not compiled with thread or catalog support \n " ) ;
return ( 0 ) ;
}
# endif