|
|
| version 1.162, 2003/11/26 12:49:27 | version 1.173, 2004/02/16 11:20:05 |
|---|---|
| Line 1 | Line 1 |
| /** @file | /** @file |
| Parser: globals. | Parser: globals. |
| Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com) | Copyright (c) 2001-2004 ArtLebedev Group (http://www.artlebedev.com) |
| Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) | Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) |
| */ | */ |
| Line 25 extern "C" { | Line 25 extern "C" { |
| #include "pa_sapi.h" | #include "pa_sapi.h" |
| #include "pa_threads.h" | #include "pa_threads.h" |
| #include "pa_xml_io.h" | #include "pa_xml_io.h" |
| #include "pa_common.h" | |
| #include "pa_cache_managers.h" | |
| // defines | // defines |
| Line 77 Request& pa_thread_request() { | Line 80 Request& pa_thread_request() { |
| #ifdef XML | #ifdef XML |
| class XML_Generic_error_info { | class XML_Generic_error_info { |
| public: | public:/*internal, actually*/ |
| char buf[MAX_STRING]; | char buf[MAX_STRING*5]; |
| size_t used; | size_t used; |
| public: | public: |
| XML_Generic_error_info() { | XML_Generic_error_info() { |
| reset(); | |
| } | |
| void reset() { | |
| buf[used=0]=0; | buf[used=0]=0; |
| } | } |
| const char* get_and_reset() { | const char* get() { |
| char* result=new(PointerFreeGC) char[used+1]; | return used? buf: 0; |
| memcpy(result, buf, used+1); | |
| reset(); | |
| return result; | |
| } | } |
| }; | }; |
| Hash<pa_thread_t, XML_Generic_error_info*> xml_generic_error_infos; | static Hash<pa_thread_t, XML_Generic_error_info*> xml_generic_error_infos; |
| static void xmlParserGenericErrorFunc(void * /*ctx*/, const char* msg, ...) { | static void xmlParserGenericErrorFunc(void * /*ctx*/, const char* msg, ...) { |
| //_asm int 3; | //_asm int 3; |
| pa_thread_t thread_id=pa_get_thread_id(); | pa_thread_t thread_id=pa_get_thread_id(); |
| // infinitely looking for free slot to fill it | XML_Generic_error_info* p; |
| while(true) { | { |
| SYNCHRONIZED; // find+fill blocked | SYNCHRONIZED; // find+fill blocked |
| // first try to get existing for this thread_id | // first try to get existing for this thread_id |
| XML_Generic_error_info *p=xml_generic_error_infos.get(thread_id); | p=xml_generic_error_infos.get(thread_id); |
| if(!p) // occupy empty one | if(!p) // occupy empty one |
| xml_generic_error_infos.put(thread_id, (p=new(PointerFreeGC) XML_Generic_error_info)); | xml_generic_error_infos.put(thread_id, (p=new(PointerFreeGC) XML_Generic_error_info)); |
| va_list args; | |
| va_start(args, msg); | |
| p->used+=vsnprintf(p->buf+p->used, sizeof(p->buf)-p->used, msg, args); | |
| va_end(args); | |
| break; | |
| } | } |
| va_list args; | |
| va_start(args, msg); | |
| p->used+=vsnprintf(p->buf+p->used, sizeof(p->buf)-p->used, msg, args); | |
| va_end(args); | |
| } | } |
| bool xmlHaveGenericErrors() { | bool xmlHaveGenericErrors() { |
| Line 132 const char* xmlGenericErrors() { | Line 127 const char* xmlGenericErrors() { |
| SYNCHRONIZED; // find+free blocked | SYNCHRONIZED; // find+free blocked |
| if(XML_Generic_error_info *p=xml_generic_error_infos.get(thread_id)) | if(XML_Generic_error_info *p=xml_generic_error_infos.get(thread_id)) { |
| return p->get_and_reset(); | xml_generic_error_infos.remove(thread_id); |
| return p->get(); | |
| } | |
| return 0; // no errors for our thread_id registered | return 0; // no errors for our thread_id registered |
| } | } |
| Line 160 static char *pa_GC_strdup(const char *s) | Line 157 static char *pa_GC_strdup(const char *s) |
| return 0; | return 0; |
| size_t size=strlen(s)+1; | size_t size=strlen(s)+1; |
| char *result=(char *)GC_malloc_atomic(size); | char *result=(char *)GC_MALLOC_ATOMIC(size); |
| if(!result) | if(!result) |
| SAPI::abort("out of memory (while duplicating XML string [size=%d])", size); | SAPI::abort("out of memory (while duplicating XML string [size=%d])", size); |
| memcpy(result, s, size); | memcpy(result, s, size); |
| #ifdef PA_DEBUG_XML_GC_MEMORY | |
| fprintf(stderr, "pa_GC_strdup(%p=%s, length=%d)=0x%p\n", s, s, size, result); | |
| #endif | |
| return result; | return result; |
| } | } |
| Line 278 static void gc_substitute_memory_managem | Line 278 static void gc_substitute_memory_managem |
| @test hint on one should call this for each thread xmlSubstituteEntitiesDefault(1); | @test hint on one should call this for each thread xmlSubstituteEntitiesDefault(1); |
| */ | */ |
| void pa_globals_init() { | void pa_globals_init() { |
| // global variables | |
| cache_managers=new Cache_managers; | |
| // in various libraries | // in various libraries |
| gc_substitute_memory_management_functions(); | gc_substitute_memory_management_functions(); |
| Line 355 void pa_globals_init() { | Line 359 void pa_globals_init() { |
| # ifdef _DEBUG | # ifdef _DEBUG |
| # ifdef LIBXML_STATIC | # ifdef LIBXML_STATIC |
| # pragma comment(lib, GNOME_LIBS "/gnome-xml/win32/binaries-debug/libxml2_a.lib") | # pragma comment(lib, GNOME_LIBS "/libxml2-x.x.x/win32/debug/lib/libxml2_a.lib") |
| # else | # else |
| # pragma comment(lib, GNOME_LIBS "/gnome-xml/win32/binaries-debug/libxml2.lib") | # pragma comment(lib, GNOME_LIBS "/libxml2-x.x.x/win32/debug/lib/libxml2.lib") |
| # endif | # endif |
| # ifdef LIBXSLT_STATIC | # ifdef LIBXSLT_STATIC |
| # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/dsp/libxslt_DebugStatic/libxslt.lib") | # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/debug/lib/libxslt_a.lib") |
| # else | # else |
| # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/dsp/libxslt_DebugDynamic/libxslt.lib") | # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/debug/lib/libxslt.lib") |
| # endif | # endif |
| # ifdef LIBEXSLT_STATIC | # ifdef LIBEXSLT_STATIC |
| # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/dsp/libexslt_DebugStatic/libexslt.lib") | # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/debug/lib/libexslt_a.lib") |
| # else | # else |
| # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/dsp/libexslt_DebugDynamic/libexslt.lib") | # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/debug/lib/libexslt.lib") |
| # endif | # endif |
| # ifdef LIBGDOME_STATIC | # ifdef LIBGDOME_STATIC |
| # pragma comment(lib, GNOME_LIBS "/gdome2-x.x.x/win32/dsp/libgdome_DebugStatic/libgdome.lib") | # pragma comment(lib, GNOME_LIBS "/gdome2-x.x.x/win32/DebugStatic/libgdome.lib") |
| # else | # else |
| # pragma comment(lib, GNOME_LIBS "/gdome2-x.x.x/win32/dsp/libgdome_DebugDynamic/libgdome.lib") | # pragma comment(lib, GNOME_LIBS "/gdome2-x.x.x/win32/DebugDynamic/libgdome.lib") |
| # endif | # endif |
| #else | #else |
| # ifdef LIBXML_STATIC | # ifdef LIBXML_STATIC |
| # pragma comment(lib, GNOME_LIBS "/gnome-xml/win32/binaries-release/libxml2_a.lib") | # pragma comment(lib, GNOME_LIBS "/libxml2-x.x.x/win32/release/lib/libxml2_a.lib") |
| # else | # else |
| # pragma comment(lib, GNOME_LIBS "/gnome-xml/win32/binaries-release/libxml2.lib") | # pragma comment(lib, GNOME_LIBS "/libxml2-x.x.x/win32/release/lib/libxml2.lib") |
| # endif | # endif |
| # ifdef LIBXSLT_STATIC | # ifdef LIBXSLT_STATIC |
| # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/dsp/libxslt_ReleaseStatic/libxslt.lib") | # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/release/lib/libxslt_a.lib") |
| # else | # else |
| # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/dsp/libxslt_ReleaseDynamic/libxslt.lib") | # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/release/lib/libxslt.lib") |
| # endif | # endif |
| # ifdef LIBEXSLT_STATIC | # ifdef LIBEXSLT_STATIC |
| # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/dsp/libexslt_ReleaseStatic/libexslt.lib") | # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/release/lib/libexslt_a.lib") |
| # else | # else |
| # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/dsp/libexslt_ReleaseDynamic/libexslt.lib") | # pragma comment(lib, GNOME_LIBS "/libxslt-x.x.x/win32/release/lib/libexslt.lib") |
| # endif | # endif |
| # ifdef LIBGDOME_STATIC | # ifdef LIBGDOME_STATIC |
| # pragma comment(lib, GNOME_LIBS "/gdome2-x.x.x/win32/dsp/libgdome_ReleaseStatic/libgdome.lib") | # pragma comment(lib, GNOME_LIBS "/gdome2-x.x.x/win32/ReleaseStatic/libgdome.lib") |
| # else | # else |
| # pragma comment(lib, GNOME_LIBS "/gdome2-x.x.x/win32/dsp/libgdome_ReleaseDynamic/libgdome.lib") | # pragma comment(lib, GNOME_LIBS "/gdome2-x.x.x/win32/ReleaseDynamic/libgdome.lib") |
| # endif | # endif |
| # endif | # endif |