Commit 3c01b1d8 authored by Daniel Veillard's avatar Daniel Veillard

- include/libxml/globals.h include/libxml/threads.h threads.c

  testThreads.c: far more testing, cleaning up bugs
- *.c : make sure globals.h is always included.
Daniel
parent 7cc95c0b
Wed Oct 17 11:56:25 EDT 2001 Daniel Veillard <daniel@veillard.com>
* include/libxml/globals.h include/libxml/threads.h threads.c
testThreads.c: far more testing, cleaning up bugs
* *.c : make sure globals.h is always included.
Wed Oct 17 17:41:41 CEST 2001 Daniel Veillard <daniel@veillard.com>
* HTMLparser.c: try to get rid of parser loops for good.
......
......@@ -45,6 +45,7 @@
#include <libxml/valid.h>
#include <libxml/xmlIO.h>
#include <libxml/uri.h>
#include <libxml/globals.h>
/*
* Internal description of an SGML entity
......
......@@ -40,6 +40,7 @@
#include <libxml/encoding.h>
#include <libxml/valid.h>
#include <libxml/xmlIO.h>
#include <libxml/globals.h>
#define HTML_MAX_NAMELEN 1000
#define HTML_PARSER_BIG_BUFFER_SIZE 1000
......
......@@ -24,6 +24,7 @@
#include <libxml/valid.h>
#include <libxml/xmlerror.h>
#include <libxml/parserInternals.h>
#include <libxml/globals.h>
/************************************************************************
* *
......
......@@ -23,6 +23,7 @@
#include <libxml/uri.h>
#include <libxml/valid.h>
#include <libxml/HTMLtree.h>
#include <libxml/globals.h>
/* #define DEBUG_SAX */
/* #define DEBUG_SAX_TREE */
......@@ -1713,7 +1714,7 @@ initxmlDefaultSAXHandler(xmlSAXHandler *hdlr, int warning)
void
xmlDefaultSAXHandlerInit(void)
{
initxmlDefaultSAXHandler(&xmlDefaultSAXHandler, xmlGetWarningsDefaultValue);
initxmlDefaultSAXHandler(&xmlDefaultSAXHandler, xmlGetWarningsDefaultValue);
}
#ifdef LIBXML_HTML_ENABLED
......@@ -1820,7 +1821,7 @@ initdocbDefaultSAXHandler(xmlSAXHandler *hdlr)
void
docbDefaultSAXHandlerInit(void)
{
initdocbDefaultSAXHandler(&docbDefaultSAXHandler);
initdocbDefaultSAXHandler(&docbDefaultSAXHandler);
}
#endif /* LIBXML_DOCB_ENABLED */
......@@ -38,6 +38,7 @@
#include <libxml/catalog.h>
#include <libxml/xmlerror.h>
#include <libxml/threads.h>
#include <libxml/globals.h>
#define MAX_DELEGATE 50
......@@ -1217,7 +1218,7 @@ xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename) {
if (xmlDebugCatalogs)
xmlGenericError(xmlGenericErrorContext,
"Parsing catalog %s\n", filename);
"%d Parsing catalog %s\n", xmlGetThreadId(), filename);
cur = xmlDocGetRootElement(doc);
if ((cur != NULL) && (xmlStrEqual(cur->name, BAD_CAST "catalog")) &&
......
......@@ -26,6 +26,7 @@
#include <libxml/HTMLtree.h>
#include <libxml/HTMLparser.h>
#include <libxml/xmlerror.h>
#include <libxml/globals.h>
/**
* xmlDebugDumpString:
......
......@@ -17,6 +17,7 @@
#include <libxml/entities.h>
#include <libxml/parser.h>
#include <libxml/xmlerror.h>
#include <libxml/globals.h>
/*
* The XML predefined entities.
......
......@@ -12,6 +12,7 @@
#include <libxml/parser.h>
#include <libxml/xmlerror.h>
#include <libxml/xmlmemory.h>
#include <libxml/globals.h>
#define XML_GET_VAR_STR(msg, str) { \
int size; \
......
......@@ -18,19 +18,17 @@
#endif
#include <string.h>
#include <libxml/xmlversion.h>
#include <libxml/globals.h>
#include <libxml/xmlmemory.h>
/* #define DEBUG_GLOBALS */
/*
* Helpful Macro
*/
#ifdef WITH_PTHREAD_H
#if defined(SOLARIS)
#define THR_MAIN(tid) (-1 == thr_main() || tid == thr_main())
#else
#define THR_MAIN(tid) (tid == 0 || tid == 1024)
#endif
#define IS_MAIN_THREAD (THR_MAIN(pthread_self()))
#ifdef LIBXML_THREAD_ENABLED
#define IS_MAIN_THREAD (xmlIsMainThread())
#else
#define IS_MAIN_THREAD 1
#endif
......@@ -41,8 +39,6 @@
* *
************************************************************************/
const char *xmlParserVersion = LIBXML_VERSION_STRING;
/*
* Memory allocation routines
*/
......@@ -93,6 +89,8 @@ xmlStrdupFunc xmlMemStrdup = (xmlStrdupFunc) strdup;
#undef xmlMemStrdup
#undef xmlRealloc
const char *xmlParserVersion = LIBXML_VERSION_STRING;
/*
* Buffers stuff
*/
......@@ -252,11 +250,19 @@ xmlSAXHandler docbDefaultSAXHandler = {
void
xmlInitializeGlobalState(xmlGlobalStatePtr gs)
{
#ifdef DEBUG_GLOBALS
fprintf(stderr, "Initializing globals at %lu for thread %d\n",
(unsigned long) gs, xmlGetThreadId());
#endif
/*
* Perform initialisation as required by libxml
*/
initxmlDefaultSAXHandler(&gs->xmlDefaultSAXHandler, 1);
initdocbDefaultSAXHandler(&gs->docbDefaultSAXHandler);
inithtmlDefaultSAXHandler(&gs->htmlDefaultSAXHandler);
initGenericErrorDefaultFunc(&gs->xmlGenericError);
gs->oldXMLWDcompatibility = 0;
gs->xmlBufferAllocScheme = XML_BUFFER_ALLOC_EXACT;
gs->xmlDefaultBufferSize = BASE_BUFFER_SIZE;
......@@ -277,7 +283,6 @@ xmlInitializeGlobalState(xmlGlobalStatePtr gs)
gs->xmlRealloc = (xmlReallocFunc) realloc;
gs->xmlMemStrdup = (xmlStrdupFunc) strdup;
#endif
initGenericErrorDefaultFunc(&gs->xmlGenericError);
gs->xmlGenericErrorContext = NULL;
gs->xmlGetWarningsDefaultValue = 1;
gs->xmlIndentTreeOutput = 0;
......
......@@ -24,6 +24,7 @@
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
#include <libxml/xmlerror.h>
#include <libxml/globals.h>
#define MAX_HASH_LEN 8
......
......@@ -57,6 +57,11 @@ struct _xmlGlobalState
{
const char *xmlParserVersion;
xmlSAXLocator xmlDefaultSAXLocator;
xmlSAXHandler xmlDefaultSAXHandler;
xmlSAXHandler docbDefaultSAXHandler;
xmlSAXHandler htmlDefaultSAXHandler;
xmlFreeFunc xmlFree;
xmlMallocFunc xmlMalloc;
xmlStrdupFunc xmlMemStrdup;
......@@ -65,11 +70,6 @@ struct _xmlGlobalState
xmlGenericErrorFunc xmlGenericError;
void *xmlGenericErrorContext;
xmlSAXLocator xmlDefaultSAXLocator;
xmlSAXHandler xmlDefaultSAXHandler;
xmlSAXHandler docbDefaultSAXHandler;
xmlSAXHandler htmlDefaultSAXHandler;
int oldXMLWDcompatibility;
xmlBufferAllocationScheme xmlBufferAllocScheme;
......
......@@ -43,6 +43,8 @@ void xmlFreeRMutex (xmlRMutexPtr tok);
void xmlInitThreads (void);
void xmlLockLibrary (void);
void xmlUnlockLibrary(void);
int xmlGetThreadId (void);
int xmlIsMainThread (void);
void xmlCleanupThreads(void);
xmlGlobalStatePtr xmlGetGlobalState(void);
......
......@@ -21,6 +21,7 @@
#include <string.h>
#include <libxml/xmlmemory.h>
#include <libxml/list.h>
#include <libxml/globals.h>
/*
* Type definition are kept internal
......
......@@ -59,6 +59,7 @@
#include <libxml/parser.h>
#include <libxml/xmlerror.h>
#include <libxml/nanoftp.h>
#include <libxml/globals.h>
/* #define DEBUG_FTP 1 */
#ifdef STANDALONE
......
......@@ -68,6 +68,7 @@
#include <libxml/xmlmemory.h>
#include <libxml/parser.h> /* for xmlStr(n)casecmp() */
#include <libxml/nanohttp.h>
#include <libxml/globals.h>
/**
* A couple portability macros
......
......@@ -10186,7 +10186,8 @@ static int xmlParserInitialized = 0;
void
xmlInitParser(void) {
if (xmlParserInitialized) return;
if (xmlParserInitialized != 0)
return;
initGenericErrorDefaultFunc(NULL);
xmlInitThreads();
......
......@@ -50,6 +50,7 @@
#ifdef LIBXML_CATALOG_ENABLED
#include <libxml/catalog.h>
#endif
#include <libxml/globals.h>
void xmlUpgradeOldNs(xmlDocPtr doc);
......@@ -2234,7 +2235,7 @@ xmlInitParserCtxt(xmlParserCtxtPtr ctxt)
ctxt->space = &ctxt->spaceTab[0];
ctxt->sax = sax;
memcpy(sax, &xmlDefaultSAXHandler, sizeof(xmlSAXHandler));
initxmlDefaultSAXHandler(sax, xmlGetWarningsDefaultValue);
ctxt->userData = ctxt;
ctxt->myDoc = NULL;
......
......@@ -35,6 +35,7 @@
#include <libxml/DOCBparser.h>
#include <libxml/tree.h>
#include <libxml/debugXML.h>
#include <libxml/globals.h>
#ifdef LIBXML_DEBUG_ENABLED
static int debug = 0;
......
......@@ -35,6 +35,7 @@
#include <libxml/HTMLtree.h>
#include <libxml/debugXML.h>
#include <libxml/xmlerror.h>
#include <libxml/globals.h>
#ifdef LIBXML_DEBUG_ENABLED
static int debug = 0;
......
#include <stdlib.h>
#include <stdio.h>
#include <features.h>
#include <libxml/xmlversion.h>
......@@ -26,13 +27,24 @@ static const char *testfiles[] = {
"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 void *
thread_specific_data(void *private_data)
{
xmlDocPtr myDoc;
const char *filename = (const char *) private_data;
int okay = 1;
if (!strcmp(filename, "test/thread/invalid.xml") == 0) {
if (!strcmp(filename, "test/threads/invalid.xml")) {
xmlDoValidityCheckingDefaultValue = 0;
xmlGenericErrorContext = stdout;
} else {
......@@ -42,36 +54,72 @@ thread_specific_data(void *private_data)
myDoc = xmlParseFile(filename);
if (myDoc) {
xmlFreeDoc(myDoc);
} else
} else {
printf("parse failed\n");
if (!strcmp(filename, "test/thread/invalid.xml") == 0) {
if (xmlDoValidityCheckingDefaultValue != 0)
printf("ValidityCheckingDefaultValue override failed\n");
if (xmlGenericErrorContext != stdout)
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");
if (xmlGenericErrorContext != stderr)
if (xmlDoValidityCheckingDefaultValue != 1) {
printf("ValidityCheckingDefaultValue override failed\n");
okay = 0;
}
if (xmlGenericErrorContext != stderr) {
printf("xmlGenericErrorContext override failed\n");
okay = 0;
}
}
return (NULL);
if (okay == 0)
return((void *) Failed);
return ((void *) Okay);
}
int
main()
{
unsigned int i;
unsigned int i, repeat;
unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]);
void *results[MAX_ARGC];
int ret;
xmlInitParser();
xmlLoadCatalog(catalog);
for (repeat = 0;repeat < 10000;repeat++) {
xmlLoadCatalog(catalog);
for (i = 0; i < num_threads; i++)
pthread_create(&tid[i], 0, thread_specific_data, (void *) testfiles[i]);
for (i = 0; i < num_threads; i++)
pthread_join(tid[i], NULL);
for (i = 0; i < num_threads; i++) {
results[i] = NULL;
tid[i] = -1;
}
for (i = 0; i < num_threads; i++) {
ret = pthread_create(&tid[i], 0, thread_specific_data,
(void *) testfiles[i]);
if (ret != 0) {
perror("pthread_create");
exit(1);
}
}
for (i = 0; i < num_threads; i++) {
ret = pthread_join(tid[i], &results[i]);
if (ret != 0) {
perror("pthread_join");
exit(1);
}
}
xmlCatalogCleanup();
for (i = 0; i < num_threads; i++)
if (results[i] != (void *) Okay)
printf("Thread %d handling %s failed\n", i, testfiles[i]);
}
xmlCleanupParser();
xmlMemoryDump();
return (0);
......
......@@ -14,6 +14,7 @@
#include <libxml/xmlmemory.h>
#include <libxml/uri.h>
#include <libxml/globals.h>
int main(int argc, char **argv) {
int i, ret, arg = 1;
......
......@@ -36,6 +36,7 @@
#include <libxml/parserInternals.h>
#include <libxml/xpathInternals.h>
#include <libxml/xmlerror.h>
#include <libxml/globals.h>
#if defined(LIBXML_XPTR_ENABLED)
#include <libxml/xpointer.h>
static int xptr = 0;
......
......@@ -331,6 +331,23 @@ xmlGetGlobalState(void)
* *
************************************************************************/
/**
* xmlGetThreadId:
*
* xmlGetThreadId() find the current thread ID number
*
* Returns the current thread ID number
*/
int
xmlGetThreadId(void)
{
#ifdef HAVE_PTHREAD_H
return((int) pthread_self());
#else
return((int) 0);
#endif
}
/**
* xmlIsMainThread:
*
......
......@@ -33,6 +33,7 @@
#include <libxml/valid.h>
#include <libxml/xmlerror.h>
#include <libxml/parserInternals.h>
#include <libxml/globals.h>
xmlNsPtr xmlNewReconciliedNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns);
......
......@@ -22,6 +22,7 @@
#include <libxml/parserInternals.h>
#include <libxml/xmlerror.h>
#include <libxml/list.h>
#include <libxml/globals.h>
/* #define DEBUG_VALID_ALGO */
......
......@@ -24,6 +24,7 @@
#include <libxml/xpointer.h>
#include <libxml/parserInternals.h>
#include <libxml/xmlerror.h>
#include <libxml/globals.h>
#ifdef LIBXML_XINCLUDE_ENABLED
#include <libxml/xinclude.h>
......
......@@ -35,6 +35,7 @@
#include <libxml/parser.h>
#include <libxml/valid.h>
#include <libxml/xlink.h>
#include <libxml/globals.h>
#define XLINK_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xlink/namespace/")
#define XHTML_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xhtml/")
......
......@@ -73,6 +73,7 @@
#ifdef LIBXML_CATALOG_ENABLED
#include <libxml/catalog.h>
#endif
#include <libxml/globals.h>
#ifdef VMS
#define xmlRegisterDefaultInputCallbacks xmlRegisterDefInputCallbacks
......
......@@ -27,6 +27,7 @@
#include <libxml/uri.h>
#include <libxml/catalog.h>
#include <libxml/parser.h>
#include <libxml/globals.h>
static int shell = 0;
static int sgml = 0;
......
......@@ -68,6 +68,7 @@
#ifdef LIBXML_CATALOG_ENABLED
#include <libxml/catalog.h>
#endif
#include <libxml/globals.h>
#ifdef LIBXML_DEBUG_ENABLED
static int debug = 0;
......
......@@ -52,6 +52,7 @@
#endif
#include <libxml/xmlerror.h>
#include <libxml/threads.h>
#include <libxml/globals.h>
/* #define DEBUG */
/* #define DEBUG_STEP */
......
......@@ -27,6 +27,7 @@
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
#include <libxml/xmlerror.h>
#include <libxml/globals.h>
#ifdef LIBXML_XPTR_ENABLED
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment