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>