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: