Annotation of embedaddon/php/ext/mysqlnd/mysqlnd_alloc.c, revision 1.1

1.1     ! misho       1: /*
        !             2:   +----------------------------------------------------------------------+
        !             3:   | PHP Version 5                                                        |
        !             4:   +----------------------------------------------------------------------+
        !             5:   | Copyright (c) 2006-2012 The PHP Group                                |
        !             6:   +----------------------------------------------------------------------+
        !             7:   | This source file is subject to version 3.01 of the PHP license,      |
        !             8:   | that is bundled with this package in the file LICENSE, and is        |
        !             9:   | available through the world-wide-web at the following url:           |
        !            10:   | http://www.php.net/license/3_01.txt                                  |
        !            11:   | If you did not receive a copy of the PHP license and are unable to   |
        !            12:   | obtain it through the world-wide-web, please send a note to          |
        !            13:   | license@php.net so we can mail you a copy immediately.               |
        !            14:   +----------------------------------------------------------------------+
        !            15:   | Authors: Georg Richter <georg@mysql.com>                             |
        !            16:   |          Andrey Hristov <andrey@mysql.com>                           |
        !            17:   |          Ulf Wendel <uwendel@mysql.com>                              |
        !            18:   +----------------------------------------------------------------------+
        !            19: */
        !            20: 
        !            21: /* $Id: mysqlnd_debug.c 309303 2011-03-16 12:42:59Z andrey $ */
        !            22: #include "php.h"
        !            23: #include "mysqlnd.h"
        !            24: #include "mysqlnd_priv.h"
        !            25: #include "mysqlnd_debug.h"
        !            26: #include "mysqlnd_wireprotocol.h"
        !            27: #include "mysqlnd_statistics.h"
        !            28: 
        !            29: 
        !            30: static const char mysqlnd_emalloc_name[]       = "_mysqlnd_emalloc";
        !            31: static const char mysqlnd_pemalloc_name[]      = "_mysqlnd_pemalloc";
        !            32: static const char mysqlnd_ecalloc_name[]       = "_mysqlnd_ecalloc";
        !            33: static const char mysqlnd_pecalloc_name[]      = "_mysqlnd_pecalloc";
        !            34: static const char mysqlnd_erealloc_name[]      = "_mysqlnd_erealloc";
        !            35: static const char mysqlnd_perealloc_name[]     = "_mysqlnd_perealloc";
        !            36: static const char mysqlnd_efree_name[]         = "_mysqlnd_efree";
        !            37: static const char mysqlnd_pefree_name[]                = "_mysqlnd_pefree";
        !            38: static const char mysqlnd_malloc_name[]                = "_mysqlnd_malloc";
        !            39: static const char mysqlnd_calloc_name[]                = "_mysqlnd_calloc";
        !            40: static const char mysqlnd_realloc_name[]       = "_mysqlnd_realloc";
        !            41: static const char mysqlnd_free_name[]          = "_mysqlnd_free";
        !            42: static const char mysqlnd_pestrndup_name[]     = "_mysqlnd_pestrndup";
        !            43: static const char mysqlnd_pestrdup_name[]      = "_mysqlnd_pestrdup";
        !            44: 
        !            45: const char * mysqlnd_debug_std_no_trace_funcs[] =
        !            46: {
        !            47:        mysqlnd_emalloc_name,
        !            48:        mysqlnd_ecalloc_name,
        !            49:        mysqlnd_efree_name,
        !            50:        mysqlnd_erealloc_name,
        !            51:        mysqlnd_pemalloc_name,
        !            52:        mysqlnd_pecalloc_name,
        !            53:        mysqlnd_pefree_name,
        !            54:        mysqlnd_perealloc_name,
        !            55:        mysqlnd_malloc_name,
        !            56:        mysqlnd_calloc_name,
        !            57:        mysqlnd_realloc_name,
        !            58:        mysqlnd_free_name,
        !            59:        mysqlnd_pestrndup_name,
        !            60:        mysqlnd_read_header_name,
        !            61:        mysqlnd_read_body_name,
        !            62:        NULL /* must be always last */
        !            63: };
        !            64: 
        !            65: 
        !            66: #if ZEND_DEBUG
        !            67: #else
        !            68: #define __zend_filename "/unknown/unknown"
        !            69: #define __zend_lineno   0
        !            70: #endif
        !            71: 
        !            72: #define REAL_SIZE(s) (collect_memory_statistics? (s) + sizeof(size_t) : (s))
        !            73: #define REAL_PTR(p) (collect_memory_statistics && (p)? (((char *)(p)) - sizeof(size_t)) : (p))
        !            74: #define FAKE_PTR(p) (collect_memory_statistics && (p)? (((char *)(p)) + sizeof(size_t)) : (p))
        !            75: 
        !            76: /* {{{ _mysqlnd_emalloc */
        !            77: void * _mysqlnd_emalloc(size_t size MYSQLND_MEM_D)
        !            78: {
        !            79:        void *ret;
        !            80:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !            81: #if PHP_DEBUG
        !            82:        long * threshold = &MYSQLND_G(debug_emalloc_fail_threshold);
        !            83: #endif
        !            84:        DBG_ENTER(mysqlnd_emalloc_name);
        !            85: 
        !            86:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !            87: 
        !            88: #if PHP_DEBUG
        !            89:        /* -1 is also "true" */
        !            90:        if (*threshold) {
        !            91: #endif
        !            92:                ret = emalloc(REAL_SIZE(size));
        !            93: #if PHP_DEBUG
        !            94:                --*threshold;
        !            95:        } else if (*threshold == 0) {
        !            96:                ret = NULL;
        !            97:        }
        !            98: #endif
        !            99: 
        !           100:        DBG_INF_FMT("size=%lu ptr=%p", size, ret);
        !           101: 
        !           102:        if (ret && collect_memory_statistics) {
        !           103:                *(size_t *) ret = size;
        !           104:                MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_EMALLOC_COUNT, 1, STAT_MEM_EMALLOC_AMOUNT, size);
        !           105:        }
        !           106:        DBG_RETURN(FAKE_PTR(ret));
        !           107: }
        !           108: /* }}} */
        !           109: 
        !           110: 
        !           111: /* {{{ _mysqlnd_pemalloc */
        !           112: void * _mysqlnd_pemalloc(size_t size, zend_bool persistent MYSQLND_MEM_D)
        !           113: {
        !           114:        void *ret;
        !           115:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !           116: #if PHP_DEBUG
        !           117:        long * threshold = persistent? &MYSQLND_G(debug_malloc_fail_threshold):&MYSQLND_G(debug_emalloc_fail_threshold);
        !           118: #endif
        !           119:        DBG_ENTER(mysqlnd_pemalloc_name);
        !           120:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !           121: 
        !           122: #if PHP_DEBUG
        !           123:        /* -1 is also "true" */
        !           124:        if (*threshold) {
        !           125: #endif
        !           126:                ret = pemalloc(REAL_SIZE(size), persistent);
        !           127: #if PHP_DEBUG
        !           128:                --*threshold;
        !           129:        } else if (*threshold == 0) {
        !           130:                ret = NULL;
        !           131:        }
        !           132: #endif
        !           133: 
        !           134:        DBG_INF_FMT("size=%lu ptr=%p persistent=%u", size, ret, persistent);
        !           135: 
        !           136:        if (ret && collect_memory_statistics) {
        !           137:                enum mysqlnd_collected_stats s1 = persistent? STAT_MEM_MALLOC_COUNT:STAT_MEM_EMALLOC_COUNT;
        !           138:                enum mysqlnd_collected_stats s2 = persistent? STAT_MEM_MALLOC_AMOUNT:STAT_MEM_EMALLOC_AMOUNT;
        !           139:                *(size_t *) ret = size;
        !           140:                MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(s1, 1, s2, size);
        !           141:        }
        !           142: 
        !           143:        DBG_RETURN(FAKE_PTR(ret));
        !           144: }
        !           145: /* }}} */
        !           146: 
        !           147: 
        !           148: /* {{{ _mysqlnd_ecalloc */
        !           149: void * _mysqlnd_ecalloc(unsigned int nmemb, size_t size MYSQLND_MEM_D)
        !           150: {
        !           151:        void *ret;
        !           152:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !           153: #if PHP_DEBUG
        !           154:        long * threshold = &MYSQLND_G(debug_ecalloc_fail_threshold);
        !           155: #endif
        !           156:        DBG_ENTER(mysqlnd_ecalloc_name);
        !           157:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !           158:        DBG_INF_FMT("before: %lu", zend_memory_usage(FALSE TSRMLS_CC));
        !           159: 
        !           160: #if PHP_DEBUG
        !           161:        /* -1 is also "true" */
        !           162:        if (*threshold) {
        !           163: #endif
        !           164:                ret = ecalloc(nmemb, REAL_SIZE(size));
        !           165: #if PHP_DEBUG
        !           166:                --*threshold;
        !           167:        } else if (*threshold == 0) {
        !           168:                ret = NULL;
        !           169:        }
        !           170: #endif
        !           171: 
        !           172:        DBG_INF_FMT("after : %lu", zend_memory_usage(FALSE TSRMLS_CC));
        !           173:        DBG_INF_FMT("size=%lu ptr=%p", size, ret);
        !           174:        if (ret && collect_memory_statistics) {
        !           175:                *(size_t *) ret = size;
        !           176:                MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_ECALLOC_COUNT, 1, STAT_MEM_ECALLOC_AMOUNT, size);
        !           177:        }
        !           178:        DBG_RETURN(FAKE_PTR(ret));
        !           179: }
        !           180: /* }}} */
        !           181: 
        !           182: 
        !           183: /* {{{ _mysqlnd_pecalloc */
        !           184: void * _mysqlnd_pecalloc(unsigned int nmemb, size_t size, zend_bool persistent MYSQLND_MEM_D)
        !           185: {
        !           186:        void *ret;
        !           187:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !           188: #if PHP_DEBUG
        !           189:        long * threshold = persistent? &MYSQLND_G(debug_calloc_fail_threshold):&MYSQLND_G(debug_ecalloc_fail_threshold);
        !           190: #endif
        !           191:        DBG_ENTER(mysqlnd_pecalloc_name);
        !           192:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !           193: 
        !           194: #if PHP_DEBUG
        !           195:        /* -1 is also "true" */
        !           196:        if (*threshold) {
        !           197: #endif
        !           198:                ret = pecalloc(nmemb, REAL_SIZE(size), persistent);
        !           199: #if PHP_DEBUG
        !           200:                --*threshold;
        !           201:        } else if (*threshold == 0) {
        !           202:                ret = NULL;
        !           203:        }
        !           204: #endif
        !           205: 
        !           206:        DBG_INF_FMT("size=%lu ptr=%p", size, ret);
        !           207: 
        !           208:        if (ret && collect_memory_statistics) {
        !           209:                enum mysqlnd_collected_stats s1 = persistent? STAT_MEM_CALLOC_COUNT:STAT_MEM_ECALLOC_COUNT;
        !           210:                enum mysqlnd_collected_stats s2 = persistent? STAT_MEM_CALLOC_AMOUNT:STAT_MEM_ECALLOC_AMOUNT;
        !           211:                *(size_t *) ret = size;
        !           212:                MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(s1, 1, s2, size);
        !           213:        }
        !           214: 
        !           215:        DBG_RETURN(FAKE_PTR(ret));
        !           216: }
        !           217: /* }}} */
        !           218: 
        !           219: 
        !           220: /* {{{ _mysqlnd_erealloc */
        !           221: void * _mysqlnd_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D)
        !           222: {
        !           223:        void *ret;
        !           224:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !           225:        size_t old_size = collect_memory_statistics && ptr? *(size_t *) (((char*)ptr) - sizeof(size_t)) : 0;
        !           226: #if PHP_DEBUG
        !           227:        long * threshold = &MYSQLND_G(debug_erealloc_fail_threshold);
        !           228: #endif
        !           229:        DBG_ENTER(mysqlnd_erealloc_name);
        !           230:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !           231:        DBG_INF_FMT("ptr=%p old_size=%lu, new_size=%lu", ptr, old_size, new_size); 
        !           232: 
        !           233: #if PHP_DEBUG
        !           234:        /* -1 is also "true" */
        !           235:        if (*threshold) {
        !           236: #endif
        !           237:                ret = erealloc(REAL_PTR(ptr), REAL_SIZE(new_size));
        !           238: #if PHP_DEBUG
        !           239:                --*threshold;
        !           240:        } else if (*threshold == 0) {
        !           241:                ret = NULL;
        !           242:        }
        !           243: #endif
        !           244: 
        !           245:        DBG_INF_FMT("new_ptr=%p", (char*)ret);
        !           246:        if (ret && collect_memory_statistics) {
        !           247:                *(size_t *) ret = new_size;
        !           248:                MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_EREALLOC_COUNT, 1, STAT_MEM_EREALLOC_AMOUNT, new_size);
        !           249:        }
        !           250:        DBG_RETURN(FAKE_PTR(ret));
        !           251: }
        !           252: /* }}} */
        !           253: 
        !           254: 
        !           255: /* {{{ _mysqlnd_perealloc */
        !           256: void * _mysqlnd_perealloc(void *ptr, size_t new_size, zend_bool persistent MYSQLND_MEM_D)
        !           257: {
        !           258:        void *ret;
        !           259:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !           260:        size_t old_size = collect_memory_statistics && ptr? *(size_t *) (((char*)ptr) - sizeof(size_t)) : 0;
        !           261: #if PHP_DEBUG
        !           262:        long * threshold = persistent? &MYSQLND_G(debug_realloc_fail_threshold):&MYSQLND_G(debug_erealloc_fail_threshold);
        !           263: #endif
        !           264:        DBG_ENTER(mysqlnd_perealloc_name);
        !           265:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !           266:        DBG_INF_FMT("ptr=%p old_size=%lu new_size=%lu persistent=%u", ptr, old_size, new_size, persistent); 
        !           267: 
        !           268: #if PHP_DEBUG
        !           269:        /* -1 is also "true" */
        !           270:        if (*threshold) {
        !           271: #endif
        !           272:                ret = perealloc(REAL_PTR(ptr), REAL_SIZE(new_size), persistent);
        !           273: #if PHP_DEBUG
        !           274:                --*threshold;
        !           275:        } else if (*threshold == 0) {
        !           276:                ret = NULL;
        !           277:        }
        !           278: #endif
        !           279: 
        !           280:        DBG_INF_FMT("new_ptr=%p", (char*)ret);
        !           281: 
        !           282:        if (ret && collect_memory_statistics) {
        !           283:                enum mysqlnd_collected_stats s1 = persistent? STAT_MEM_REALLOC_COUNT:STAT_MEM_EREALLOC_COUNT;
        !           284:                enum mysqlnd_collected_stats s2 = persistent? STAT_MEM_REALLOC_AMOUNT:STAT_MEM_EREALLOC_AMOUNT;
        !           285:                *(size_t *) ret = new_size;
        !           286:                MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(s1, 1, s2, new_size);
        !           287:        }
        !           288:        DBG_RETURN(FAKE_PTR(ret));
        !           289: }
        !           290: /* }}} */
        !           291: 
        !           292: 
        !           293: /* {{{ _mysqlnd_efree */
        !           294: void _mysqlnd_efree(void *ptr MYSQLND_MEM_D)
        !           295: {
        !           296:        size_t free_amount = 0;
        !           297:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !           298:        DBG_ENTER(mysqlnd_efree_name);
        !           299:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !           300:        DBG_INF_FMT("ptr=%p", ptr); 
        !           301: 
        !           302:        if (ptr) {
        !           303:                if (collect_memory_statistics) {
        !           304:                        free_amount = *(size_t *)(((char*)ptr) - sizeof(size_t));
        !           305:                        DBG_INF_FMT("ptr=%p size=%u", ((char*)ptr) - sizeof(size_t), (unsigned int) free_amount);
        !           306:                }
        !           307:                efree(REAL_PTR(ptr));
        !           308:        }
        !           309: 
        !           310:        if (collect_memory_statistics) {
        !           311:                MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_EFREE_COUNT, 1, STAT_MEM_EFREE_AMOUNT, free_amount);
        !           312:        }
        !           313:        DBG_VOID_RETURN;
        !           314: }
        !           315: /* }}} */
        !           316: 
        !           317: 
        !           318: /* {{{ _mysqlnd_pefree */
        !           319: void _mysqlnd_pefree(void *ptr, zend_bool persistent MYSQLND_MEM_D)
        !           320: {
        !           321:        size_t free_amount = 0;
        !           322:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !           323:        DBG_ENTER(mysqlnd_pefree_name);
        !           324:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !           325:        DBG_INF_FMT("ptr=%p persistent=%u", ptr, persistent); 
        !           326: 
        !           327:        if (ptr) {
        !           328:                if (collect_memory_statistics) {
        !           329:                        free_amount = *(size_t *)(((char*)ptr) - sizeof(size_t));
        !           330:                        DBG_INF_FMT("ptr=%p size=%u", ((char*)ptr) - sizeof(size_t), (unsigned int) free_amount);
        !           331:                }
        !           332:                pefree(REAL_PTR(ptr), persistent);
        !           333:        }
        !           334: 
        !           335:        if (collect_memory_statistics) {
        !           336:                MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(persistent? STAT_MEM_FREE_COUNT:STAT_MEM_EFREE_COUNT, 1,
        !           337:                                                                                          persistent? STAT_MEM_FREE_AMOUNT:STAT_MEM_EFREE_AMOUNT, free_amount);
        !           338:        }
        !           339:        DBG_VOID_RETURN;
        !           340: }
        !           341: 
        !           342: 
        !           343: /* {{{ _mysqlnd_malloc */
        !           344: void * _mysqlnd_malloc(size_t size MYSQLND_MEM_D)
        !           345: {
        !           346:        void *ret;
        !           347:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !           348: #if PHP_DEBUG
        !           349:        long * threshold = &MYSQLND_G(debug_malloc_fail_threshold);
        !           350: #endif
        !           351:        DBG_ENTER(mysqlnd_malloc_name);
        !           352:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !           353: 
        !           354: #if PHP_DEBUG
        !           355:        /* -1 is also "true" */
        !           356:        if (*threshold) {
        !           357: #endif
        !           358:                ret = malloc(REAL_SIZE(size));
        !           359: #if PHP_DEBUG
        !           360:                --*threshold;
        !           361:        } else if (*threshold == 0) {
        !           362:                ret = NULL;
        !           363:        }
        !           364: #endif
        !           365: 
        !           366:        DBG_INF_FMT("size=%lu ptr=%p", size, ret);
        !           367:        if (ret && collect_memory_statistics) {
        !           368:                *(size_t *) ret = size;
        !           369:                MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_MALLOC_COUNT, 1, STAT_MEM_MALLOC_AMOUNT, size);
        !           370:        }
        !           371:        DBG_RETURN(FAKE_PTR(ret));
        !           372: }
        !           373: /* }}} */
        !           374: 
        !           375: 
        !           376: /* {{{ _mysqlnd_calloc */
        !           377: void * _mysqlnd_calloc(unsigned int nmemb, size_t size MYSQLND_MEM_D)
        !           378: {
        !           379:        void *ret;
        !           380:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !           381: #if PHP_DEBUG
        !           382:        long * threshold = &MYSQLND_G(debug_calloc_fail_threshold);
        !           383: #endif
        !           384:        DBG_ENTER(mysqlnd_calloc_name);
        !           385:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !           386: 
        !           387: #if PHP_DEBUG
        !           388:        /* -1 is also "true" */
        !           389:        if (*threshold) {
        !           390: #endif
        !           391:                ret = calloc(nmemb, REAL_SIZE(size));
        !           392: #if PHP_DEBUG
        !           393:                --*threshold;
        !           394:        } else if (*threshold == 0) {
        !           395:                ret = NULL;
        !           396:        }
        !           397: #endif
        !           398: 
        !           399:        DBG_INF_FMT("size=%lu ptr=%p", size, ret);
        !           400:        if (ret && collect_memory_statistics) {
        !           401:                *(size_t *) ret = size;
        !           402:                MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_CALLOC_COUNT, 1, STAT_MEM_CALLOC_AMOUNT, size);
        !           403:        }
        !           404:        DBG_RETURN(FAKE_PTR(ret));
        !           405: }
        !           406: /* }}} */
        !           407: 
        !           408: 
        !           409: /* {{{ _mysqlnd_realloc */
        !           410: void * _mysqlnd_realloc(void *ptr, size_t new_size MYSQLND_MEM_D)
        !           411: {
        !           412:        void *ret;
        !           413:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !           414: #if PHP_DEBUG
        !           415:        long * threshold = &MYSQLND_G(debug_realloc_fail_threshold);
        !           416: #endif
        !           417:        DBG_ENTER(mysqlnd_realloc_name);
        !           418:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !           419:        DBG_INF_FMT("ptr=%p new_size=%lu ", new_size, ptr); 
        !           420:        DBG_INF_FMT("before: %lu", zend_memory_usage(TRUE TSRMLS_CC));
        !           421: 
        !           422: #if PHP_DEBUG
        !           423:        /* -1 is also "true" */
        !           424:        if (*threshold) {
        !           425: #endif
        !           426:                ret = realloc(REAL_PTR(ptr), REAL_SIZE(new_size));
        !           427: #if PHP_DEBUG
        !           428:                --*threshold;
        !           429:        } else if (*threshold == 0) {
        !           430:                ret = NULL;
        !           431:        }
        !           432: #endif
        !           433: 
        !           434:        DBG_INF_FMT("new_ptr=%p", (char*)ret);
        !           435: 
        !           436:        if (ret && collect_memory_statistics) {
        !           437:                *(size_t *) ret = new_size;
        !           438:                MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_REALLOC_COUNT, 1, STAT_MEM_REALLOC_AMOUNT, new_size);
        !           439:        }
        !           440:        DBG_RETURN(FAKE_PTR(ret));
        !           441: }
        !           442: /* }}} */
        !           443: 
        !           444: 
        !           445: /* {{{ _mysqlnd_free */
        !           446: void _mysqlnd_free(void *ptr MYSQLND_MEM_D)
        !           447: {
        !           448:        size_t free_amount = 0;
        !           449:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !           450:        DBG_ENTER(mysqlnd_free_name);
        !           451:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !           452:        DBG_INF_FMT("ptr=%p", ptr); 
        !           453: 
        !           454:        if (ptr) {
        !           455:                if (collect_memory_statistics) {
        !           456:                        free_amount = *(size_t *)(((char*)ptr) - sizeof(size_t));
        !           457:                        DBG_INF_FMT("ptr=%p size=%u", ((char*)ptr) - sizeof(size_t), (unsigned int) free_amount);
        !           458:                }
        !           459:                free(REAL_PTR(ptr));
        !           460:        }
        !           461: 
        !           462:        if (collect_memory_statistics) {
        !           463:                MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_FREE_COUNT, 1, STAT_MEM_FREE_AMOUNT, free_amount);
        !           464:        }
        !           465:        DBG_VOID_RETURN;
        !           466: }
        !           467: /* }}} */
        !           468: 
        !           469: #define SMART_STR_START_SIZE 2048
        !           470: #define SMART_STR_PREALLOC 512
        !           471: #include "ext/standard/php_smart_str.h"
        !           472: 
        !           473: 
        !           474: /* {{{ _mysqlnd_pestrndup */
        !           475: char * _mysqlnd_pestrndup(const char * const ptr, size_t length, zend_bool persistent MYSQLND_MEM_D)
        !           476: {
        !           477:        char * ret;
        !           478:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !           479:        DBG_ENTER(mysqlnd_pestrndup_name);
        !           480:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !           481:        DBG_INF_FMT("ptr=%p", ptr); 
        !           482: 
        !           483:        ret = pemalloc(REAL_SIZE(length) + 1, persistent);
        !           484:        {
        !           485:                size_t l = length;
        !           486:                char * p = (char *) ptr;
        !           487:                char * dest = (char *) FAKE_PTR(ret);
        !           488:                while (*p && l--) {
        !           489:                        *dest++ = *p++;
        !           490:                }
        !           491:                *dest = '\0';
        !           492:        }
        !           493: 
        !           494:        if (collect_memory_statistics) {
        !           495:                *(size_t *) ret = length;
        !           496:                MYSQLND_INC_GLOBAL_STATISTIC(persistent? STAT_MEM_STRNDUP_COUNT : STAT_MEM_ESTRNDUP_COUNT);
        !           497:        }
        !           498: 
        !           499:        DBG_RETURN(FAKE_PTR(ret));
        !           500: }
        !           501: /* }}} */
        !           502: 
        !           503: 
        !           504: /* {{{ _mysqlnd_pestrdup */
        !           505: char * _mysqlnd_pestrdup(const char * const ptr, zend_bool persistent MYSQLND_MEM_D)
        !           506: {
        !           507:        char * ret;
        !           508:        smart_str tmp_str = {0, 0, 0};
        !           509:        const char * p = ptr;
        !           510:        zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
        !           511:        DBG_ENTER(mysqlnd_pestrdup_name);
        !           512:        DBG_INF_FMT("file=%-15s line=%4d", strrchr(__zend_filename, PHP_DIR_SEPARATOR) + 1, __zend_lineno);
        !           513:        DBG_INF_FMT("ptr=%p", ptr);
        !           514:        do {
        !           515:                smart_str_appendc(&tmp_str, *p);
        !           516:        } while (*p++);
        !           517: 
        !           518:        ret = pemalloc(tmp_str.len + sizeof(size_t), persistent);
        !           519:        memcpy(FAKE_PTR(ret), tmp_str.c, tmp_str.len);
        !           520: 
        !           521:        if (ret && collect_memory_statistics) {
        !           522:                *(size_t *) ret = tmp_str.len;
        !           523:                MYSQLND_INC_GLOBAL_STATISTIC(persistent? STAT_MEM_STRDUP_COUNT : STAT_MEM_ESTRDUP_COUNT);
        !           524:        }
        !           525:        smart_str_free(&tmp_str);
        !           526: 
        !           527:        DBG_RETURN(FAKE_PTR(ret));
        !           528: }
        !           529: /* }}} */
        !           530: 
        !           531: 
        !           532: /* {{{ _mysqlnd_sprintf */
        !           533: PHPAPI int _mysqlnd_sprintf(char ** pbuf, size_t max_len, const char *format, ...)
        !           534: {
        !           535:        int len;
        !           536:        va_list ap;
        !           537:        va_start(ap, format);
        !           538:        len = vspprintf(pbuf, max_len, format, ap);
        !           539:        va_end(ap);
        !           540:        return len;
        !           541: }
        !           542: /* }}} */
        !           543: 
        !           544: 
        !           545: /* {{{ _mysqlnd_sprintf_free */
        !           546: PHPAPI void _mysqlnd_sprintf_free(char * p)
        !           547: {
        !           548:        efree(p);
        !           549: }
        !           550: /* }}} */
        !           551: 
        !           552: 
        !           553: PHPAPI int _mysqlnd_vsprintf(char ** pbuf, size_t max_len, const char * format, va_list ap)
        !           554: {
        !           555:        return vspprintf(pbuf, max_len, format, ap);
        !           556: }
        !           557: /* }}} */
        !           558: 
        !           559: 
        !           560: #define MYSQLND_DEBUG_MEMORY 1
        !           561: 
        !           562: #if MYSQLND_DEBUG_MEMORY == 0
        !           563: 
        !           564: /* {{{ mysqlnd_zend_mm_emalloc */
        !           565: static void * mysqlnd_zend_mm_emalloc(size_t size MYSQLND_MEM_D)
        !           566: {
        !           567:        return emalloc(size);
        !           568: }
        !           569: /* }}} */
        !           570: 
        !           571: 
        !           572: /* {{{ mysqlnd_zend_mm_pemalloc */
        !           573: static void * mysqlnd_zend_mm_pemalloc(size_t size, zend_bool persistent MYSQLND_MEM_D)
        !           574: {
        !           575:        return pemalloc(size, persistent);
        !           576: }
        !           577: /* }}} */
        !           578: 
        !           579: 
        !           580: /* {{{ mysqlnd_zend_mm_ecalloc */
        !           581: static void * mysqlnd_zend_mm_ecalloc(unsigned int nmemb, size_t size MYSQLND_MEM_D)
        !           582: {
        !           583:        return ecalloc(nmemb, size);
        !           584: }
        !           585: /* }}} */
        !           586: 
        !           587: 
        !           588: /* {{{ mysqlnd_zend_mm_pecalloc */
        !           589: static void * mysqlnd_zend_mm_pecalloc(unsigned int nmemb, size_t size, zend_bool persistent MYSQLND_MEM_D)
        !           590: {
        !           591:        return pecalloc(nmemb, size, persistent);
        !           592: }
        !           593: /* }}} */
        !           594: 
        !           595: 
        !           596: /* {{{ mysqlnd_zend_mm_erealloc */
        !           597: static void * mysqlnd_zend_mm_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D)
        !           598: {
        !           599:        return erealloc(ptr, new_size);
        !           600: }
        !           601: /* }}} */
        !           602: 
        !           603: 
        !           604: /* {{{ mysqlnd_zend_mm_perealloc */
        !           605: static void * mysqlnd_zend_mm_perealloc(void *ptr, size_t new_size, zend_bool persistent MYSQLND_MEM_D)
        !           606: {
        !           607:        return perealloc(ptr, new_size, persistent);
        !           608: }
        !           609: /* }}} */
        !           610: 
        !           611: 
        !           612: /* {{{ mysqlnd_zend_mm_efree */
        !           613: static void mysqlnd_zend_mm_efree(void * ptr MYSQLND_MEM_D)
        !           614: {
        !           615:        efree(ptr);
        !           616: }
        !           617: /* }}} */
        !           618: 
        !           619: 
        !           620: /* {{{ mysqlnd_zend_mm_pefree */
        !           621: static void mysqlnd_zend_mm_pefree(void * ptr, zend_bool persistent MYSQLND_MEM_D)
        !           622: {
        !           623:        pefree(ptr, persistent);
        !           624: }
        !           625: /* }}} */
        !           626: 
        !           627: 
        !           628: /* {{{ mysqlnd_zend_mm_malloc */
        !           629: static void * mysqlnd_zend_mm_malloc(size_t size MYSQLND_MEM_D)
        !           630: {
        !           631:        return malloc(size);
        !           632: }
        !           633: /* }}} */
        !           634: 
        !           635: 
        !           636: /* {{{ mysqlnd_zend_mm_calloc */
        !           637: static void * mysqlnd_zend_mm_calloc(unsigned int nmemb, size_t size MYSQLND_MEM_D)
        !           638: {
        !           639:        return calloc(nmemb, size);
        !           640: }
        !           641: /* }}} */
        !           642: 
        !           643: 
        !           644: /* {{{ mysqlnd_zend_mm_realloc */
        !           645: static void * mysqlnd_zend_mm_realloc(void * ptr, size_t new_size MYSQLND_MEM_D)
        !           646: {
        !           647:        return realloc(ptr, new_size);
        !           648: }
        !           649: /* }}} */
        !           650: 
        !           651: 
        !           652: /* {{{ mysqlnd_zend_mm_free */
        !           653: static void mysqlnd_zend_mm_free(void * ptr MYSQLND_MEM_D)
        !           654: {
        !           655:        free(ptr);
        !           656: }
        !           657: /* }}} */
        !           658: 
        !           659: 
        !           660: /* {{{ mysqlnd_zend_mm_pestrndup */
        !           661: static char * mysqlnd_zend_mm_pestrndup(const char * const ptr, size_t length, zend_bool persistent MYSQLND_MEM_D)
        !           662: {
        !           663:        return pestrndup(ptr, length, persistent);
        !           664: }
        !           665: /* }}} */
        !           666: 
        !           667: 
        !           668: /* {{{ mysqlnd_zend_mm_pestrdup */
        !           669: static char * mysqlnd_zend_mm_pestrdup(const char * const ptr, zend_bool persistent MYSQLND_MEM_D)
        !           670: {
        !           671:        return pestrdup(ptr, persistent);
        !           672: }
        !           673: /* }}} */
        !           674: 
        !           675: #endif
        !           676: 
        !           677: 
        !           678: PHPAPI struct st_mysqlnd_allocator_methods mysqlnd_allocator = 
        !           679: {
        !           680: #if MYSQLND_DEBUG_MEMORY
        !           681:        _mysqlnd_emalloc,
        !           682:        _mysqlnd_pemalloc,
        !           683:        _mysqlnd_ecalloc,
        !           684:        _mysqlnd_pecalloc,
        !           685:        _mysqlnd_erealloc,
        !           686:        _mysqlnd_perealloc,
        !           687:        _mysqlnd_efree,
        !           688:        _mysqlnd_pefree,
        !           689:        _mysqlnd_malloc,
        !           690:        _mysqlnd_calloc,
        !           691:        _mysqlnd_realloc,
        !           692:        _mysqlnd_free,
        !           693:        _mysqlnd_pestrndup,
        !           694:        _mysqlnd_pestrdup,
        !           695:        _mysqlnd_sprintf,
        !           696:        _mysqlnd_vsprintf,
        !           697:        _mysqlnd_sprintf_free
        !           698: #else
        !           699:        mysqlnd_zend_mm_emalloc,
        !           700:        mysqlnd_zend_mm_pemalloc,
        !           701:        mysqlnd_zend_mm_ecalloc,
        !           702:        mysqlnd_zend_mm_pecalloc,
        !           703:        mysqlnd_zend_mm_erealloc,
        !           704:        mysqlnd_zend_mm_perealloc,
        !           705:        mysqlnd_zend_mm_efree,
        !           706:        mysqlnd_zend_mm_pefree,
        !           707:        mysqlnd_zend_mm_malloc,
        !           708:        mysqlnd_zend_mm_calloc,
        !           709:        mysqlnd_zend_mm_realloc,
        !           710:        mysqlnd_zend_mm_free,
        !           711:        mysqlnd_zend_mm_pestrndup,
        !           712:        mysqlnd_zend_mm_pestrdup
        !           713:        sprintf,
        !           714:        mysqlnd_zend_mm_efree,
        !           715: #endif
        !           716: };
        !           717: 
        !           718: 
        !           719: /*
        !           720:  * Local variables:
        !           721:  * tab-width: 4
        !           722:  * c-basic-offset: 4
        !           723:  * End:
        !           724:  * vim600: noet sw=4 ts=4 fdm=marker
        !           725:  * vim<600: noet sw=4 ts=4
        !           726:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>