--- parser3/src/main/pa_memory.C 2003/02/21 10:58:57 1.1.2.2 +++ parser3/src/main/pa_memory.C 2004/02/11 15:33:16 1.5 @@ -1,117 +1,102 @@ /** @file Parser: memory reference counting classes. - Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2004 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_MEMORY_C="$Date: 2003/02/21 10:58:57 $"; +static const char * const IDENT_MEMORY_C="$Date: 2004/02/11 15:33:16 $"; -#include "pa_pool.h" -#include "pa_exception.h" -#include "pa_common.h" #include "pa_sapi.h" +#include "pa_common.h" -void *pa_fail_alloc(char *what, size_t size) { - SAPI::die("out of memory: failed to %s %u bytes", - what, size); - +void *pa_fail_alloc(const char* what, size_t size) { +#ifdef PA_DEBUG_DISABLE_GC + SAPI::die("out of memory (in pa_fail_alloc)"); +#else + SAPI::die("out of memory: failed to %s %u bytes. " + "heap_used=%u, heap_free=%u, bytes_since_gc=%u, total_bytes=%u", + what, size, + GC_get_heap_size(), + GC_get_free_bytes(), + GC_get_bytes_since_gc(), + GC_get_total_bytes() + ); +#endif // never reached return 0; } -/* -Pool::Pool(void *astorage) : - fstorage(astorage), fcontext(0), - ftotal_allocated(0), ftotal_times(0), - source_charset(0), client_charset(0) - { -} - -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; -} +#ifdef PA_DEBUG_GC_MEMORY -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); -} +const size_t HEADTAIL_SIZE=4; -void Pool::fail_register_cleanup() const { - SAPI::die("failed to register cleanup"); +static size_t debug_size(size_t user_size) { + return user_size+HEADTAIL_SIZE*2; } -void Pool::set_source_charset(Charset& acharset) { - source_charset=&acharset; -} -Charset& Pool::get_source_charset() { - if(!source_charset) - throw Exception(0, - 0, - "no source charset defined yet"); - return *source_charset; -} +const int BEFORE_MARK=0xBEF0BEF0; +const int AFTER_MARK=0xAFEEAFEE; +const char PAD_MARK='\xAD'; -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; -} +static void* fill_return_user(void* aptr, size_t pure_size) { + char* ptr=(char*)aptr; + memcpy(ptr, &BEFORE_MARK, HEADTAIL_SIZE); + memcpy(ptr+pure_size-HEADTAIL_SIZE, &AFTER_MARK, HEADTAIL_SIZE); -#ifdef XML + // pAD + size_t raw_size=GC_size(aptr); + for(size_t i=pure_size; i=(char*)0x01c357e40 && ptr<=((char*)0x01c357e4+100)) + //printf("valid:0x%p\n", ptr); -String& Pool::transcode(xmlChar *s -#ifndef NO_STRING_ORIGIN - , const String *origin -#endif - ) { - return get_source_charset().transcode(s, origin); + return ptr+HEADTAIL_SIZE; } +static void* check_return_debug(void* auser_ptr) { + char* user_ptr=(char*)auser_ptr; + char* ptr=user_ptr-HEADTAIL_SIZE; + + size_t raw_size=GC_size(ptr); + assert(raw_size!=0); -const char* Pool::transcode_cstr(GdomeDOMString *s) { - return get_source_charset().transcode_cstr(s); + size_t pure_size=raw_size; + while(ptr[pure_size-1]==PAD_MARK) + pure_size--; + + assert(memcmp(ptr, &BEFORE_MARK, HEADTAIL_SIZE)==0); + assert(memcmp(ptr+pure_size-HEADTAIL_SIZE, &AFTER_MARK, HEADTAIL_SIZE)==0); + + return ptr; } -String& Pool::transcode(GdomeDOMString *s -#ifndef NO_STRING_ORIGIN - , const String *origin -#endif - ) { - return get_source_charset().transcode(s, origin); + +void* pa_gc_malloc(size_t size) { + size=debug_size(size); + return fill_return_user(GC_MALLOC(size), size); } -xmlChar *Pool::transcode_buf2xchar(const char* buf, size_t buf_size) { - return get_source_charset().transcode_buf2xchar(buf, buf_size); +void* pa_gc_malloc_atomic(size_t size) { + size=debug_size(size); + return fill_return_user(GC_MALLOC_ATOMIC(size), size); } -GdomeDOMString_auto_ptr Pool::transcode(const String& s) { - return get_source_charset().transcode(s); +void* pa_gc_realloc(void* user_ptr, size_t size) { + GC_is_visible(user_ptr); + + //printf("realloc: 0x%p -> %u\n", ptr, size); + size=debug_size(size); + return fill_return_user( + GC_realloc( + check_return_debug(user_ptr), + size), + size); +} +void pa_gc_free(void* ptr) { + // ignore free } + #endif -*/