Annotation of parser3/src/include/pa_memory.h, revision 1.1.2.9.2.13

1.1.2.1   paf         1: /** @file
                      2:        Parser: memory reference counting classes decls.
                      3: 
                      4:        Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
                      5: 
                      6:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
                      7: */
                      8: 
                      9: #ifndef PA_MEMORY_H
                     10: #define PA_MEMORY_H
                     11: 
1.1.2.9.2.13! paf        12: static const char* IDENT_MEMORY_H="$Date: 2003/03/25 09:34:53 $";
1.1.2.9   paf        13: 
                     14: #define PA_DEBUG_REFERENCES
1.1.2.1   paf        15: 
                     16: // include
                     17: 
                     18: #include "pa_config_includes.h"
1.1.2.9.2.1  paf        19: #include "gc.h"
                     20: 
1.1.2.1   paf        21: 
                     22: #ifdef XML
                     23: #      include "gdome.h"
                     24: // for xmlChar
                     25: #      include "libxml/tree.h"
                     26: #endif
                     27: 
                     28: // forwards
                     29: 
1.1.2.9.2.5  paf        30: void *pa_fail_alloc(const char* what, size_t size);
1.1.2.2   paf        31: 
                     32: // inlines
                     33: 
                     34: inline void *pa_malloc(size_t size) {
1.1.2.9.2.1  paf        35:        if(void *result=GC_MALLOC(size))
1.1.2.2   paf        36:                return result;
                     37: 
                     38:        return pa_fail_alloc("allocate", size);
                     39: }
                     40: 
1.1.2.9.2.1  paf        41: inline void *pa_malloc_atomic(size_t size) {
                     42:        if(void *result=GC_MALLOC_ATOMIC(size))
1.1.2.2   paf        43:                return result;
                     44: 
                     45:        return pa_fail_alloc("allocate clean", size);
                     46: }
1.1.2.9.2.4  paf        47: /// @a length may be null, which mean "autocalc it"
1.1.2.9.2.5  paf        48: inline char *pa_strdup(const char* auto_variable_never_null, size_t length=0) {
1.1.2.9.2.4  paf        49:        if(!length)
                     50:                length=strlen(auto_variable_never_null);
1.1.2.9.2.7  paf        51: 
                     52:        size_t size=length+1;
1.1.2.9.2.4  paf        53:        if(char *result=static_cast<char*>(GC_MALLOC_ATOMIC(size))) {
1.1.2.9.2.7  paf        54:                memcpy(result, auto_variable_never_null, length);
                     55:                result[length]=0;
1.1.2.9.2.4  paf        56:                return result;
                     57:        }
                     58: 
                     59:        return static_cast<char*>(pa_fail_alloc("allocate clean", size));
                     60: }
1.1.2.9.2.10  paf        61: 
1.1.2.2   paf        62: inline void pa_free(void *ptr) {
1.1.2.9.2.1  paf        63:        GC_FREE(ptr);
1.1.2.2   paf        64: }
                     65: 
                     66: inline void *pa_realloc(void *ptr, size_t size) {
1.1.2.9.2.1  paf        67:        if(void *result=GC_REALLOC(ptr, size))
1.1.2.2   paf        68:                return result;
                     69: 
                     70:        return pa_fail_alloc("reallocate to", size);
                     71: }
1.1.2.1   paf        72: 
1.1.2.9.2.4  paf        73: //{@ these operators are disabled, one should explicitely specify either new(UseGC) or new(PointerFreeGC)
1.1.2.9.2.6  paf        74: inline void *operator new(size_t size) { abort(); } // disabled
                     75: inline void operator delete (void *ptr) { abort(); } // disabled
                     76: inline void *operator new[] (size_t size) { abort(); } // disabled
1.1.2.9.2.4  paf        77: //}@
1.1.2.9.2.3  paf        78: 
                     79: #define UseGC ((int)1)
                     80: #define PointerFreeGC (true)
                     81: 
                     82: inline void *operator new[] (size_t size, int) { // UseGC
                     83:        return pa_malloc(size);
                     84: }
                     85: inline void *operator new[] (size_t size, bool) { // PointerFreeGC
1.1.2.9.2.1  paf        86:        return pa_malloc_atomic(size);
1.1.2.1   paf        87: }
                     88: inline void operator delete[] (void *ptr) {
                     89:        pa_free(ptr);
                     90: }
                     91: 
1.1.2.9.2.1  paf        92: /// memory allocation/dallocation goes via pa_malloc/pa_free.
1.1.2.1   paf        93: class PA_Allocated {
                     94: public:
                     95:        /// the sole: instances allocated using our functions
                     96:        static void *operator new(size_t size) { 
                     97:                return pa_malloc(size);
                     98:        }
                     99:        static void operator delete(void *ptr) {
                    100:                pa_free(ptr);
                    101:        }
                    102:        static void *malloc(size_t size) {
                    103:                return pa_malloc(size);
                    104:        }
1.1.2.9.2.1  paf       105:        static void *malloc_atomic(size_t size) {
                    106:                return pa_malloc_atomic(size);
1.1.2.9.2.8  paf       107:        }
                    108:        static char *strdup(const char* auto_variable_never_null, size_t length=0) {
                    109:                return pa_strdup(auto_variable_never_null, length);
1.1.2.1   paf       110:        }
                    111:        static void free(void *ptr) {
                    112:                pa_free(ptr);
                    113:        }
                    114:        static void *realloc(void *ptr, size_t size) {
                    115:                return pa_realloc(ptr, size);
                    116:        }
1.1.2.9.2.2  paf       117: 
                    118: private: // disabled from accidental use
                    119: 
1.1.2.9.2.9  paf       120:        /// use malloc/malloc_atomic instead [GC clears result of those]
1.1.2.9.2.2  paf       121:        static void *calloc(size_t size);
1.1.2.9.2.13! paf       122: 
        !           123: };
        !           124: 
        !           125: /// Those who want their destructor called during finalization, must derive from this class [also]
        !           126: class PA_Cleaned {
        !           127: 
        !           128:        static void cleanup( void* obj, void* displ ) {
        !           129:            ((PA_Cleaned*) ((char*) obj + (ptrdiff_t) displ))->~PA_Cleaned();
        !           130:        }
        !           131: 
        !           132: public:
        !           133: 
        !           134:        PA_Cleaned() {
        !           135:                GC_finalization_proc oldProc;
        !           136:                void* oldData;
        !           137:                void* base = GC_base( (void *) this );
        !           138:                if (0 != base)  {
        !           139:                        // Don't call the debug version, since this is a real base address.
        !           140:                        GC_register_finalizer_ignore_self( 
        !           141:                                base, (GC_finalization_proc)cleanup, (void*) ((char*) this - (char*) base), 
        !           142:                                &oldProc, &oldData );
        !           143:                        if (0 != oldProc) {
        !           144:                                GC_register_finalizer_ignore_self( base, oldProc, oldData, 0, 0 );
        !           145:                        }
        !           146:                }
        !           147:        }
        !           148: 
        !           149:        virtual ~PA_Cleaned() {
        !           150:            GC_REGISTER_FINALIZER_IGNORE_SELF( GC_base(this), 0, 0, 0, 0 );
        !           151:        }
1.1.2.1   paf       152: 
                    153: };
                    154: 
1.1.2.9.2.1  paf       155: /// Base for all Parser classes
                    156: typedef PA_Allocated PA_Object;
1.1.2.1   paf       157: 
1.1.2.9.2.6  paf       158: // defines
                    159: 
                    160: #define override
                    161: #define rethrow throw
1.1.2.9.2.10  paf       162: 
1.1.2.1   paf       163: 
                    164: #endif

E-mail: