Annotation of parser3/src/include/pa_pool.h, revision 1.86.4.1

1.34      paf         1: /** @file
1.36      paf         2:        Parser: pool class decl.
                      3: 
1.86      paf         4:        Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com)
1.36      paf         5: 
1.78      paf         6:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.1       paf         7: */
                      8: 
                      9: #ifndef PA_POOL_H
                     10: #define PA_POOL_H
1.82      paf        11: 
1.86.4.1! paf        12: static const char* IDENT_POOL_H="$Date: 2003/01/21 15:51:10 $";
1.1       paf        13: 
1.52      parser     14: #include "pa_config_includes.h"
1.1       paf        15: 
1.59      parser     16: #ifdef XML
1.75      paf        17: #      include "gdome.h"
1.76      paf        18: // for xmlChar
                     19: #      include "libxml/tree.h"
1.59      parser     20: #endif
1.55      parser     21: 
                     22: // forwards
                     23: 
1.21      paf        24: class Exception;
1.55      parser     25: class String;
1.73      paf        26: class Charset;
1.75      paf        27: class GdomeDOMString_auto_ptr;
1.55      parser     28: 
1.35      paf        29: /** 
1.34      paf        30:        Pool mechanizm allows users not to free up allocated memory,
                     31:        leaving that problem to 'pools'.
                     32: 
1.38      paf        33:        @see Pooled
1.34      paf        34: */
1.47      paf        35: 
1.1       paf        36: class Pool {
                     37: public:
1.18      paf        38: 
1.55      parser     39:        Pool(void *astorage);
1.86.4.1! paf        40:        ~Pool();
        !            41: 
        !            42:        //{@ collector issues
        !            43:        void collect_garbage();
        !            44:        //}@
1.18      paf        45: 
1.79      paf        46:        //{@ statistics
1.70      paf        47:        size_t total_allocated() { return ftotal_allocated; }
                     48:        unsigned int total_times() { return ftotal_times; }
1.79      paf        49:        //}@
1.70      paf        50: 
1.40      paf        51:        void set_context(void *acontext) { fcontext=acontext; }
1.64      parser     52:        void *get_context() { return fcontext; }
1.39      paf        53: 
1.34      paf        54:        /// allocates some bytes on pool
1.86.4.1! paf        55:        void *malloc_atomic(size_t size, int place=0) {
        !            56:                return check(real_malloc_atomic(size, place), size);
        !            57:        }
        !            58: 
        !            59:        /// allocates some bytes on pool
1.68      paf        60:        void *malloc(size_t size, int place=0) {
                     61:                return check(real_malloc(size, place), size);
1.18      paf        62:        }
1.34      paf        63:        /// allocates some bytes clearing them with zeros
1.18      paf        64:        void *calloc(size_t size) {
                     65:                return check(real_calloc(size), size);
                     66:        }
1.39      paf        67: 
1.53      parser     68:        /// registers a routine to clean up non-pooled allocations
1.86.4.1! paf        69:        void register_cleanup(void (*cleanup) (void *, void *), void *data) {
1.54      parser     70:                if(!real_register_cleanup(cleanup, data))
                     71:                        fail_register_cleanup();
                     72:        }
1.53      parser     73: 
1.84      paf        74:        //{@ helpers
                     75:        void *copy(const void *buf, const size_t size);
                     76:        char *copy(const char *cstr);
                     77:        //}@
                     78: 
1.79      paf        79:        //{@ source charset
1.73      paf        80:        void set_source_charset(Charset& acharset);
                     81:        Charset& get_source_charset();
1.79      paf        82:        //}@
1.73      paf        83: 
1.79      paf        84:        //{@ client charset
1.73      paf        85:        void set_client_charset(Charset& charset);
                     86:        Charset& get_client_charset();
1.79      paf        87:        //}@
1.73      paf        88: 
                     89: #ifdef XML
1.74      paf        90: 
1.76      paf        91:        /// @see Charset::transcode_cstr(xmlChar *s);
                     92:        const char *transcode_cstr(xmlChar *s);
                     93:        /// @see Charset::transcode(xmlChar *s);
1.85      paf        94:        String& transcode(xmlChar *s
                     95: #ifndef NO_STRING_ORIGIN
                     96:                , const String *origin
                     97: #endif
                     98:                );
1.76      paf        99:        /// @see Charset::transcode_cstr(GdomeDOMString *s);
1.74      paf       100:        const char *transcode_cstr(GdomeDOMString *s);
1.76      paf       101:        /// @see Charset::transcode(GdomeDOMString *s);
1.85      paf       102:        String& transcode(GdomeDOMString *s
                    103: #ifndef NO_STRING_ORIGIN
                    104:                , const String *origin
                    105: #endif
                    106:                );
1.81      paf       107:        /// @see Charset::transcode_cstr(const char *buf, size_t buf_size=0);
                    108:        xmlChar *transcode_buf2xchar(const char *buf, size_t buf_size=0);
1.73      paf       109:        /// @see Charset::transcode(const String& s)
1.75      paf       110:        GdomeDOMString_auto_ptr transcode(const String& s);
1.74      paf       111: 
1.73      paf       112: #endif
1.60      parser    113: 
1.39      paf       114: private:
                    115: 
                    116:        void *fstorage;
1.40      paf       117:        void *fcontext;
1.73      paf       118:        Charset *source_charset;
                    119:        Charset *client_charset;
1.8       paf       120: 
1.50      parser    121: private: 
                    122:        
                    123:        //{
                    124:        /// @name implementation defined
1.86.4.1! paf       125:        void real_init();
        !           126:        void real_finit();
1.68      paf       127:     void *real_malloc(size_t size, int place);
1.86.4.1! paf       128:     void *real_malloc_atomic(size_t size, int place);
1.20      paf       129:     void *real_calloc(size_t size);
1.86.4.1! paf       130:        bool real_register_cleanup(void (*cleanup) (void *,void *), void *data);
1.50      parser    131:        //}
1.17      paf       132: 
1.23      paf       133: private: 
1.17      paf       134: 
1.34      paf       135:        /// checks whether mem allocated OK. throws exception otherwise
1.23      paf       136:        void *check(void *ptr, size_t size) {
1.70      paf       137:                if(ptr) {
                    138:                        ftotal_allocated+=size;
                    139:                        ftotal_times++;
1.23      paf       140:                        return ptr;
1.70      paf       141:                }
1.23      paf       142: 
1.54      parser    143:                fail_alloc(size);
1.23      paf       144: 
                    145:                // never reached
                    146:                return 0;
                    147:        }
1.54      parser    148:        /// throws allocation exception
                    149:        void fail_alloc(size_t size) const;
                    150: 
                    151:        /// throws register cleanup exception
                    152:        void fail_register_cleanup() const;
1.70      paf       153: 
                    154: private: // statistics
                    155:        
                    156:        size_t ftotal_allocated;
                    157:        unsigned int ftotal_times;
1.59      parser    158: 
1.8       paf       159: private: //disabled
                    160: 
1.64      parser    161:        Pool(const Pool&);
                    162:        Pool& operator= (const Pool&);
1.21      paf       163: };
                    164: 
1.35      paf       165: /** 
1.34      paf       166:        Base for all classes that are allocated in 'pools'.
                    167: 
                    168:        Holds Pool object. Contains useful wrappers to it's methods.
1.38      paf       169: 
1.64      parser    170:        @see NEW
1.34      paf       171: */
1.80      paf       172: 
1.86.4.1! paf       173: /**
        !           174:        @todo: try to remember the meaning of this old  comment:
        !           175:        all classes that are members parents of packed class [String] 
        !           176:        sould be packed also to avoid sparc odd st/lduh problem
        !           177:        [packing is unacceptable for garbage collector]
        !           178: */
1.21      paf       179: class Pooled {
1.23      paf       180:        // the pool i'm allocated on
1.49      paf       181:        Pool *fpool;
1.21      paf       182: public:
1.37      paf       183: 
                    184:        /// the Pooled-sole: Pooled instances can be allocated in Pool rather then on heap
1.21      paf       185:        static void *operator new(size_t size, Pool& apool) { 
1.68      paf       186:                return apool.malloc(size, 1);
1.21      paf       187:        }
                    188: 
1.49      paf       189:        Pooled(Pool& apool) : fpool(&apool) {}
1.23      paf       190: 
1.34      paf       191:        /// my pool
1.49      paf       192:        Pool& pool() const { return *fpool; }
                    193: 
                    194:        /** used for moving objects from one pool to another. 
                    195:                in between object can have no pool and can not be used
                    196:                @see SQL_Driver_manager
                    197:        */
                    198:        void set_pool(Pool *apool) { fpool=apool; }
1.21      paf       199: 
1.57      parser    200:        //{
                    201:        /// @name useful wrapper around pool
1.68      paf       202:        void *malloc(size_t size, int place=0) const { return fpool->malloc(size, place); }
1.86.4.1! paf       203:        void *malloc_atomic(size_t size, int place=0) const { return fpool->malloc_atomic(size, place); }
1.49      paf       204:        void *calloc(size_t size) const { return fpool->calloc(size); }
1.86.4.1! paf       205:        void register_cleanup(void (*cleanup) (void *, void *), void *data) { fpool->register_cleanup(cleanup, data); }
1.84      paf       206:        void *copy(const void *buf, const size_t size) { return fpool->copy(buf, size); }
                    207:        char *copy(const char *cstr) { return fpool->copy(cstr); }
1.59      parser    208: #ifdef XML
1.74      paf       209: 
                    210:        const char *transcode_cstr(GdomeDOMString *s) { return fpool->transcode_cstr(s); }
1.85      paf       211:        String& transcode(GdomeDOMString *s
                    212: #ifndef NO_STRING_ORIGIN
                    213:                , const String *origin
                    214: #endif
                    215:                ) { 
                    216:                return fpool->transcode(s
                    217: #ifndef NO_STRING_ORIGIN
                    218:                        , origin
                    219: #endif         
                    220:                        ); 
                    221:        }
1.74      paf       222: 
1.59      parser    223: #endif
1.57      parser    224:        //}
1.23      paf       225: };
1.86.4.1! paf       226: 
1.34      paf       227: /// useful macro for creating objects on current Pooled object Pooled::pool()
1.23      paf       228: #define NEW new(pool())
1.1       paf       229: 
                    230: #endif

E-mail: