Annotation of parser3/src/main/pa_memory.C, revision 1.2
1.2 ! paf 1: /** @file
! 2: Parser: memory reference counting classes.
! 3:
! 4: Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
! 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
! 6: */
! 7:
! 8: static const char* IDENT_MEMORY_C="$Date: 2003/07/22 08:19:24 $";
! 9:
! 10: #include "pa_sapi.h"
! 11: #include "pa_common.h"
! 12:
! 13: void *pa_fail_alloc(const char* what, size_t size) {
! 14: #ifdef PA_DEBUG_DISABLE_GC
! 15: SAPI::die("out of memory (in pa_fail_alloc)");
! 16: #else
! 17: SAPI::die("out of memory: failed to %s %u bytes. "
! 18: "heap_used=%lu, heap_free=%lu, bytes_since_gc=%lu, total_bytes=%lu",
! 19: what, size,
! 20: GC_get_heap_size(),
! 21: GC_get_free_bytes(),
! 22: GC_get_bytes_since_gc(),
! 23: GC_get_total_bytes()
! 24: );
! 25: #endif
! 26: // never reached
! 27: return 0;
! 28: }
! 29:
! 30:
! 31: #ifdef PA_DEBUG_GC_MEMORY
! 32:
! 33: const size_t HEADTAIL_SIZE=4;
! 34:
! 35: static size_t debug_size(size_t user_size) {
! 36: return user_size+HEADTAIL_SIZE*2;
! 37: }
! 38:
! 39: const int BEFORE_MARK=0xBEF0BEF0;
! 40: const int AFTER_MARK=0xAFEEAFEE;
! 41: const char PAD_MARK='\xAD';
! 42:
! 43: static void* fill_return_user(void* aptr, size_t pure_size) {
! 44: char* ptr=(char*)aptr;
! 45: memcpy(ptr, &BEFORE_MARK, HEADTAIL_SIZE);
! 46: memcpy(ptr+pure_size-HEADTAIL_SIZE, &AFTER_MARK, HEADTAIL_SIZE);
! 47:
! 48: // pAD
! 49: size_t raw_size=GC_size(aptr);
! 50: for(size_t i=pure_size; i<raw_size; i++)
! 51: ptr[i]=PAD_MARK;
! 52:
! 53: //if(ptr>=(char*)0x01c357e40 && ptr<=((char*)0x01c357e4+100))
! 54: //printf("valid:0x%p\n", ptr);
! 55:
! 56: return ptr+HEADTAIL_SIZE;
! 57: }
! 58: static void* check_return_debug(void* auser_ptr) {
! 59: char* user_ptr=(char*)auser_ptr;
! 60: char* ptr=user_ptr-HEADTAIL_SIZE;
! 61:
! 62: size_t raw_size=GC_size(ptr);
! 63: assert(raw_size!=0);
! 64:
! 65: size_t pure_size=raw_size;
! 66: while(ptr[pure_size-1]==PAD_MARK)
! 67: pure_size--;
! 68:
! 69: assert(memcmp(ptr, &BEFORE_MARK, HEADTAIL_SIZE)==0);
! 70: assert(memcmp(ptr+pure_size-HEADTAIL_SIZE, &AFTER_MARK, HEADTAIL_SIZE)==0);
! 71:
! 72: return ptr;
! 73: }
! 74:
! 75:
! 76: void* pa_gc_malloc(size_t size) {
! 77: size=debug_size(size);
! 78: return fill_return_user(GC_MALLOC(size), size);
! 79: }
! 80:
! 81: void* pa_gc_malloc_atomic(size_t size) {
! 82: size=debug_size(size);
! 83: return fill_return_user(GC_MALLOC_ATOMIC(size), size);
! 84: }
! 85:
! 86: void* pa_gc_realloc(void* user_ptr, size_t size) {
! 87: GC_is_visible(user_ptr);
! 88:
! 89: //printf("realloc: 0x%p -> %u\n", ptr, size);
! 90: size=debug_size(size);
! 91: return fill_return_user(
! 92: GC_realloc(
! 93: check_return_debug(user_ptr),
! 94: size),
! 95: size);
! 96: }
! 97: void pa_gc_free(void* ptr) {
! 98: // ignore free
! 99: }
! 100:
! 101:
! 102: #endif
E-mail: