Annotation of parser3/src/main/pa_memory.C, revision 1.7

1.2       paf         1: /** @file
                      2:        Parser: memory reference counting classes.
                      3: 
1.6       paf         4:        Copyright (c) 2001-2005 ArtLebedev Group (http://www.artlebedev.com)
1.2       paf         5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
                      6: */
                      7: 
1.7     ! paf         8: static const char * const IDENT_MEMORY_C="$Date: 2005/08/09 08:14:52 $";
1.2       paf         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. "
1.4       paf        18:                "heap_used=%u, heap_free=%u, bytes_since_gc=%u, total_bytes=%u",
1.2       paf        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: 
1.7     ! paf        42: static void* fill_return_user(void* aptr, size_t /*pure_size*/) {
1.2       paf        43:        char* ptr=(char*)aptr;
                     44:        memcpy(ptr, &BEFORE_MARK, HEADTAIL_SIZE);
1.7     ! paf        45: //     memcpy(ptr+HEADTAIL_SIZE+pure_size, &AFTER_MARK, HEADTAIL_SIZE);
1.2       paf        46: 
                     47:        //if(ptr>=(char*)0x01c357e40 && ptr<=((char*)0x01c357e4+100))
                     48:                //printf("valid:0x%p\n", ptr);
                     49: 
                     50:        return ptr+HEADTAIL_SIZE;
                     51: }
                     52: static void* check_return_debug(void* auser_ptr) {
                     53:        char* user_ptr=(char*)auser_ptr;
                     54:        char* ptr=user_ptr-HEADTAIL_SIZE;
                     55: 
1.7     ! paf        56:        assert(GC_size(ptr));
1.2       paf        57:        assert(memcmp(ptr, &BEFORE_MARK, HEADTAIL_SIZE)==0);
1.7     ! paf        58: // don't know real size. can put it to head someday
        !            59: //     assert(memcmp(ptr+HEADTAIL_SIZE+pure_size, &AFTER_MARK, HEADTAIL_SIZE)==0);
1.2       paf        60: 
                     61:        return ptr;
                     62: }
                     63: 
                     64: 
                     65: void* pa_gc_malloc(size_t size) {
                     66:        size=debug_size(size);
                     67:        return fill_return_user(GC_MALLOC(size), size);
                     68: }
                     69: 
                     70: void* pa_gc_malloc_atomic(size_t size) {
                     71:        size=debug_size(size);
                     72:        return fill_return_user(GC_MALLOC_ATOMIC(size), size);
                     73: }
                     74: 
                     75: void* pa_gc_realloc(void* user_ptr, size_t size) {
                     76:        GC_is_visible(user_ptr);
                     77: 
                     78:        //printf("realloc: 0x%p -> %u\n", ptr, size);
                     79:        size=debug_size(size);
                     80:        return fill_return_user(
                     81:                GC_realloc(
                     82:                        check_return_debug(user_ptr), 
                     83:                        size),
                     84:                size);
                     85: }
1.7     ! paf        86: void pa_gc_free(void* user_ptr) {
        !            87:        GC_is_visible(user_ptr);
        !            88:        check_return_debug(user_ptr);
1.2       paf        89:        // ignore free
                     90: }
                     91: 
                     92: 
                     93: #endif

E-mail: