--- parser3/src/main/pa_pool.C 2003/03/17 14:48:06 1.59.4.1 +++ parser3/src/main/pa_pool.C 2023/09/26 20:49:10 1.67 @@ -1,114 +1,57 @@ /** @file Parser: pool class. - Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexandr Petrosian (http://paf.design.ru) + Copyright (c) 2000-2023 Art. Lebedev Studio (http://www.artlebedev.com) + Authors: Konstantin Morshnev , Alexandr Petrosian */ -static const char* IDENT_POOL_C="$Date: 2003/03/17 14:48:06 $"; - #include "pa_pool.h" #include "pa_exception.h" #include "pa_common.h" #include "pa_sapi.h" #include "pa_charset.h" -Pool::Pool(void *astorage) : - fstorage(astorage), fcontext(0), - ftotal_allocated(0), ftotal_times(0), - source_charset(0), client_charset(0) - { - real_init(); -} - -Pool::~Pool() { - real_finit(); -} - -void *Pool::copy(const void *buf, const size_t size) { - if(!buf || !size) - return 0; - - void *result=malloc(size); - memcpy(result, buf, size); - return result; -} - -char *Pool::copy(const char *cstr) { - if(cstr) { - size_t size=strlen(cstr)+1; - return (char *)copy(cstr, size); - } - return 0; -} - +volatile const char * IDENT_PA_POOL_C="$Id: pa_pool.C,v 1.67 2023/09/26 20:49:10 moko Exp $" IDENT_PA_POOL_H; -void Pool::fail_alloc(size_t size) const { - SAPI::die("out of pool memory: failed to allocate %u bytes; " - "already allocated on pool: %u bytes in %u times", - size, - ftotal_allocated, ftotal_times); -} +// Pool -void Pool::fail_register_cleanup() const { - SAPI::die("failed to register cleanup"); -} +Pool::Pool(){} -void Pool::set_source_charset(Charset& acharset) { - source_charset=&acharset; +static void cleanup(Pool::Cleanup item, int) { + if(item.cleanup) + item.cleanup(item.data); } -Charset& Pool::get_source_charset() { - if(!source_charset) - throw Exception(0, - 0, - "no source charset defined yet"); - return *source_charset; +Pool::~Pool() { + //__asm__("int3"); + //_asm int 3; + //fprintf(stderr, "cleanups: %d\n", cleanups.size()); + // cleanups first, because they use some object's memory pointers + cleanups.for_each(cleanup, 0); } -void Pool::set_client_charset(Charset& acharset) { - client_charset=&acharset; -} -Charset& Pool::get_client_charset() { - if(!client_charset) - throw Exception(0, - 0, - "no client charset defined yet"); - return *client_charset; +void Pool::register_cleanup(void (*cleanup) (void *), void *data) { + cleanups+=Cleanup(cleanup, data); } -#ifdef XML - -const char *Pool::transcode_cstr(xmlChar *s) { - return get_source_charset().transcode_cstr(s); +static void unregister_cleanup(Pool::Cleanup& item, void* cleanup_data) { + if(item.data==cleanup_data) + item.cleanup=0; } - -String& Pool::transcode(xmlChar *s -#ifndef NO_STRING_ORIGIN - , const String *origin -#endif - ) { - return get_source_charset().transcode(s, origin); +void Pool::unregister_cleanup(void *cleanup_data) { + cleanups.for_each_ref(::unregister_cleanup, cleanup_data); } -const char *Pool::transcode_cstr(GdomeDOMString *s) { - return get_source_charset().transcode_cstr(s); -} +// Pooled -String& Pool::transcode(GdomeDOMString *s -#ifndef NO_STRING_ORIGIN - , const String *origin -#endif - ) { - return get_source_charset().transcode(s, origin); +static void cleanup(void *data) { + static_cast(data)->~Pooled(); } -xmlChar *Pool::transcode_buf2xchar(const char *buf, size_t buf_size) { - return get_source_charset().transcode_buf2xchar(buf, buf_size); +Pooled::Pooled(Pool& apool): fpool(apool) { + fpool.register_cleanup(cleanup, this); } -GdomeDOMString_auto_ptr Pool::transcode(const String& s) { - return get_source_charset().transcode(s); +/// Sole: this got called automatically from Pool::~Pool() +Pooled::~Pooled() { + fpool.unregister_cleanup(this); } - - -#endif