Annotation of embedaddon/php/ext/mysqlnd/mysqlnd_alloc.c, revision 1.1.1.3
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
1.1.1.3 ! misho 5: | Copyright (c) 2006-2014 The PHP Group |
1.1 misho 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:
1.1.1.2 misho 45: PHPAPI const char * mysqlnd_debug_std_no_trace_funcs[] =
1.1 misho 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:
1.1.1.2 misho 86: #if PHP_DEBUG
87: {
88: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
89: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
90: }
91: #endif
1.1 misho 92:
93: #if PHP_DEBUG
94: /* -1 is also "true" */
95: if (*threshold) {
96: #endif
97: ret = emalloc(REAL_SIZE(size));
98: #if PHP_DEBUG
99: --*threshold;
100: } else if (*threshold == 0) {
101: ret = NULL;
102: }
103: #endif
104:
105: DBG_INF_FMT("size=%lu ptr=%p", size, ret);
106:
107: if (ret && collect_memory_statistics) {
108: *(size_t *) ret = size;
109: MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_EMALLOC_COUNT, 1, STAT_MEM_EMALLOC_AMOUNT, size);
110: }
111: DBG_RETURN(FAKE_PTR(ret));
112: }
113: /* }}} */
114:
115:
116: /* {{{ _mysqlnd_pemalloc */
117: void * _mysqlnd_pemalloc(size_t size, zend_bool persistent MYSQLND_MEM_D)
118: {
119: void *ret;
120: zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
121: #if PHP_DEBUG
122: long * threshold = persistent? &MYSQLND_G(debug_malloc_fail_threshold):&MYSQLND_G(debug_emalloc_fail_threshold);
123: #endif
124: DBG_ENTER(mysqlnd_pemalloc_name);
1.1.1.2 misho 125: #if PHP_DEBUG
126: {
127: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
128: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
129: }
130: #endif
1.1 misho 131:
132: #if PHP_DEBUG
133: /* -1 is also "true" */
134: if (*threshold) {
135: #endif
136: ret = pemalloc(REAL_SIZE(size), persistent);
137: #if PHP_DEBUG
138: --*threshold;
139: } else if (*threshold == 0) {
140: ret = NULL;
141: }
142: #endif
143:
144: DBG_INF_FMT("size=%lu ptr=%p persistent=%u", size, ret, persistent);
145:
146: if (ret && collect_memory_statistics) {
147: enum mysqlnd_collected_stats s1 = persistent? STAT_MEM_MALLOC_COUNT:STAT_MEM_EMALLOC_COUNT;
148: enum mysqlnd_collected_stats s2 = persistent? STAT_MEM_MALLOC_AMOUNT:STAT_MEM_EMALLOC_AMOUNT;
149: *(size_t *) ret = size;
150: MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(s1, 1, s2, size);
151: }
152:
153: DBG_RETURN(FAKE_PTR(ret));
154: }
155: /* }}} */
156:
157:
158: /* {{{ _mysqlnd_ecalloc */
159: void * _mysqlnd_ecalloc(unsigned int nmemb, size_t size MYSQLND_MEM_D)
160: {
161: void *ret;
162: zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
163: #if PHP_DEBUG
164: long * threshold = &MYSQLND_G(debug_ecalloc_fail_threshold);
165: #endif
166: DBG_ENTER(mysqlnd_ecalloc_name);
1.1.1.2 misho 167: #if PHP_DEBUG
168: {
169: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
170: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
171: }
172: #endif
1.1 misho 173: DBG_INF_FMT("before: %lu", zend_memory_usage(FALSE TSRMLS_CC));
174:
175: #if PHP_DEBUG
176: /* -1 is also "true" */
177: if (*threshold) {
178: #endif
179: ret = ecalloc(nmemb, REAL_SIZE(size));
180: #if PHP_DEBUG
181: --*threshold;
182: } else if (*threshold == 0) {
183: ret = NULL;
184: }
185: #endif
186:
187: DBG_INF_FMT("after : %lu", zend_memory_usage(FALSE TSRMLS_CC));
188: DBG_INF_FMT("size=%lu ptr=%p", size, ret);
189: if (ret && collect_memory_statistics) {
190: *(size_t *) ret = size;
191: MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_ECALLOC_COUNT, 1, STAT_MEM_ECALLOC_AMOUNT, size);
192: }
193: DBG_RETURN(FAKE_PTR(ret));
194: }
195: /* }}} */
196:
197:
198: /* {{{ _mysqlnd_pecalloc */
199: void * _mysqlnd_pecalloc(unsigned int nmemb, size_t size, zend_bool persistent MYSQLND_MEM_D)
200: {
201: void *ret;
202: zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
203: #if PHP_DEBUG
204: long * threshold = persistent? &MYSQLND_G(debug_calloc_fail_threshold):&MYSQLND_G(debug_ecalloc_fail_threshold);
205: #endif
206: DBG_ENTER(mysqlnd_pecalloc_name);
1.1.1.2 misho 207: #if PHP_DEBUG
208: {
209: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
210: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
211: }
212: #endif
1.1 misho 213:
214: #if PHP_DEBUG
215: /* -1 is also "true" */
216: if (*threshold) {
217: #endif
218: ret = pecalloc(nmemb, REAL_SIZE(size), persistent);
219: #if PHP_DEBUG
220: --*threshold;
221: } else if (*threshold == 0) {
222: ret = NULL;
223: }
224: #endif
225:
226: DBG_INF_FMT("size=%lu ptr=%p", size, ret);
227:
228: if (ret && collect_memory_statistics) {
229: enum mysqlnd_collected_stats s1 = persistent? STAT_MEM_CALLOC_COUNT:STAT_MEM_ECALLOC_COUNT;
230: enum mysqlnd_collected_stats s2 = persistent? STAT_MEM_CALLOC_AMOUNT:STAT_MEM_ECALLOC_AMOUNT;
231: *(size_t *) ret = size;
232: MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(s1, 1, s2, size);
233: }
234:
235: DBG_RETURN(FAKE_PTR(ret));
236: }
237: /* }}} */
238:
239:
240: /* {{{ _mysqlnd_erealloc */
241: void * _mysqlnd_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D)
242: {
243: void *ret;
244: zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
245: size_t old_size = collect_memory_statistics && ptr? *(size_t *) (((char*)ptr) - sizeof(size_t)) : 0;
246: #if PHP_DEBUG
247: long * threshold = &MYSQLND_G(debug_erealloc_fail_threshold);
248: #endif
249: DBG_ENTER(mysqlnd_erealloc_name);
1.1.1.2 misho 250: #if PHP_DEBUG
251: {
252: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
253: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
254: }
255: #endif
1.1 misho 256: DBG_INF_FMT("ptr=%p old_size=%lu, new_size=%lu", ptr, old_size, new_size);
257:
258: #if PHP_DEBUG
259: /* -1 is also "true" */
260: if (*threshold) {
261: #endif
262: ret = erealloc(REAL_PTR(ptr), REAL_SIZE(new_size));
263: #if PHP_DEBUG
264: --*threshold;
265: } else if (*threshold == 0) {
266: ret = NULL;
267: }
268: #endif
269:
270: DBG_INF_FMT("new_ptr=%p", (char*)ret);
271: if (ret && collect_memory_statistics) {
272: *(size_t *) ret = new_size;
273: MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_EREALLOC_COUNT, 1, STAT_MEM_EREALLOC_AMOUNT, new_size);
274: }
275: DBG_RETURN(FAKE_PTR(ret));
276: }
277: /* }}} */
278:
279:
280: /* {{{ _mysqlnd_perealloc */
281: void * _mysqlnd_perealloc(void *ptr, size_t new_size, zend_bool persistent MYSQLND_MEM_D)
282: {
283: void *ret;
284: zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
285: size_t old_size = collect_memory_statistics && ptr? *(size_t *) (((char*)ptr) - sizeof(size_t)) : 0;
286: #if PHP_DEBUG
287: long * threshold = persistent? &MYSQLND_G(debug_realloc_fail_threshold):&MYSQLND_G(debug_erealloc_fail_threshold);
288: #endif
289: DBG_ENTER(mysqlnd_perealloc_name);
1.1.1.2 misho 290: #if PHP_DEBUG
291: {
292: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
293: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
294: }
295: #endif
1.1 misho 296: DBG_INF_FMT("ptr=%p old_size=%lu new_size=%lu persistent=%u", ptr, old_size, new_size, persistent);
297:
298: #if PHP_DEBUG
299: /* -1 is also "true" */
300: if (*threshold) {
301: #endif
302: ret = perealloc(REAL_PTR(ptr), REAL_SIZE(new_size), persistent);
303: #if PHP_DEBUG
304: --*threshold;
305: } else if (*threshold == 0) {
306: ret = NULL;
307: }
308: #endif
309:
310: DBG_INF_FMT("new_ptr=%p", (char*)ret);
311:
312: if (ret && collect_memory_statistics) {
313: enum mysqlnd_collected_stats s1 = persistent? STAT_MEM_REALLOC_COUNT:STAT_MEM_EREALLOC_COUNT;
314: enum mysqlnd_collected_stats s2 = persistent? STAT_MEM_REALLOC_AMOUNT:STAT_MEM_EREALLOC_AMOUNT;
315: *(size_t *) ret = new_size;
316: MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(s1, 1, s2, new_size);
317: }
318: DBG_RETURN(FAKE_PTR(ret));
319: }
320: /* }}} */
321:
322:
323: /* {{{ _mysqlnd_efree */
324: void _mysqlnd_efree(void *ptr MYSQLND_MEM_D)
325: {
326: size_t free_amount = 0;
327: zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
328: DBG_ENTER(mysqlnd_efree_name);
1.1.1.2 misho 329: #if PHP_DEBUG
330: {
331: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
332: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
333: }
334: #endif
1.1 misho 335: DBG_INF_FMT("ptr=%p", ptr);
336:
337: if (ptr) {
338: if (collect_memory_statistics) {
339: free_amount = *(size_t *)(((char*)ptr) - sizeof(size_t));
340: DBG_INF_FMT("ptr=%p size=%u", ((char*)ptr) - sizeof(size_t), (unsigned int) free_amount);
341: }
342: efree(REAL_PTR(ptr));
343: }
344:
345: if (collect_memory_statistics) {
346: MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_EFREE_COUNT, 1, STAT_MEM_EFREE_AMOUNT, free_amount);
347: }
348: DBG_VOID_RETURN;
349: }
350: /* }}} */
351:
352:
353: /* {{{ _mysqlnd_pefree */
354: void _mysqlnd_pefree(void *ptr, zend_bool persistent MYSQLND_MEM_D)
355: {
356: size_t free_amount = 0;
357: zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
358: DBG_ENTER(mysqlnd_pefree_name);
1.1.1.2 misho 359: #if PHP_DEBUG
360: {
361: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
362: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
363: }
364: #endif
1.1 misho 365: DBG_INF_FMT("ptr=%p persistent=%u", ptr, persistent);
366:
367: if (ptr) {
368: if (collect_memory_statistics) {
369: free_amount = *(size_t *)(((char*)ptr) - sizeof(size_t));
370: DBG_INF_FMT("ptr=%p size=%u", ((char*)ptr) - sizeof(size_t), (unsigned int) free_amount);
371: }
372: pefree(REAL_PTR(ptr), persistent);
373: }
374:
375: if (collect_memory_statistics) {
376: MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(persistent? STAT_MEM_FREE_COUNT:STAT_MEM_EFREE_COUNT, 1,
377: persistent? STAT_MEM_FREE_AMOUNT:STAT_MEM_EFREE_AMOUNT, free_amount);
378: }
379: DBG_VOID_RETURN;
380: }
381:
382:
383: /* {{{ _mysqlnd_malloc */
384: void * _mysqlnd_malloc(size_t size MYSQLND_MEM_D)
385: {
386: void *ret;
387: zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
388: #if PHP_DEBUG
389: long * threshold = &MYSQLND_G(debug_malloc_fail_threshold);
390: #endif
391: DBG_ENTER(mysqlnd_malloc_name);
1.1.1.2 misho 392: #if PHP_DEBUG
393: {
394: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
395: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
396: }
397: #endif
1.1 misho 398:
399: #if PHP_DEBUG
400: /* -1 is also "true" */
401: if (*threshold) {
402: #endif
403: ret = malloc(REAL_SIZE(size));
404: #if PHP_DEBUG
405: --*threshold;
406: } else if (*threshold == 0) {
407: ret = NULL;
408: }
409: #endif
410:
411: DBG_INF_FMT("size=%lu ptr=%p", size, ret);
412: if (ret && collect_memory_statistics) {
413: *(size_t *) ret = size;
414: MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_MALLOC_COUNT, 1, STAT_MEM_MALLOC_AMOUNT, size);
415: }
416: DBG_RETURN(FAKE_PTR(ret));
417: }
418: /* }}} */
419:
420:
421: /* {{{ _mysqlnd_calloc */
422: void * _mysqlnd_calloc(unsigned int nmemb, size_t size MYSQLND_MEM_D)
423: {
424: void *ret;
425: zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
426: #if PHP_DEBUG
427: long * threshold = &MYSQLND_G(debug_calloc_fail_threshold);
428: #endif
429: DBG_ENTER(mysqlnd_calloc_name);
1.1.1.2 misho 430: #if PHP_DEBUG
431: {
432: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
433: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
434: }
435: #endif
1.1 misho 436:
437: #if PHP_DEBUG
438: /* -1 is also "true" */
439: if (*threshold) {
440: #endif
441: ret = calloc(nmemb, REAL_SIZE(size));
442: #if PHP_DEBUG
443: --*threshold;
444: } else if (*threshold == 0) {
445: ret = NULL;
446: }
447: #endif
448:
449: DBG_INF_FMT("size=%lu ptr=%p", size, ret);
450: if (ret && collect_memory_statistics) {
451: *(size_t *) ret = size;
452: MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_CALLOC_COUNT, 1, STAT_MEM_CALLOC_AMOUNT, size);
453: }
454: DBG_RETURN(FAKE_PTR(ret));
455: }
456: /* }}} */
457:
458:
459: /* {{{ _mysqlnd_realloc */
460: void * _mysqlnd_realloc(void *ptr, size_t new_size MYSQLND_MEM_D)
461: {
462: void *ret;
463: zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
464: #if PHP_DEBUG
465: long * threshold = &MYSQLND_G(debug_realloc_fail_threshold);
466: #endif
467: DBG_ENTER(mysqlnd_realloc_name);
1.1.1.2 misho 468: #if PHP_DEBUG
469: {
470: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
471: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
472: }
473: #endif
1.1 misho 474: DBG_INF_FMT("ptr=%p new_size=%lu ", new_size, ptr);
475: DBG_INF_FMT("before: %lu", zend_memory_usage(TRUE TSRMLS_CC));
476:
477: #if PHP_DEBUG
478: /* -1 is also "true" */
479: if (*threshold) {
480: #endif
481: ret = realloc(REAL_PTR(ptr), REAL_SIZE(new_size));
482: #if PHP_DEBUG
483: --*threshold;
484: } else if (*threshold == 0) {
485: ret = NULL;
486: }
487: #endif
488:
489: DBG_INF_FMT("new_ptr=%p", (char*)ret);
490:
491: if (ret && collect_memory_statistics) {
492: *(size_t *) ret = new_size;
493: MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_REALLOC_COUNT, 1, STAT_MEM_REALLOC_AMOUNT, new_size);
494: }
495: DBG_RETURN(FAKE_PTR(ret));
496: }
497: /* }}} */
498:
499:
500: /* {{{ _mysqlnd_free */
501: void _mysqlnd_free(void *ptr MYSQLND_MEM_D)
502: {
503: size_t free_amount = 0;
504: zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
505: DBG_ENTER(mysqlnd_free_name);
1.1.1.2 misho 506: #if PHP_DEBUG
507: {
508: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
509: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
510: }
511: #endif
1.1 misho 512: DBG_INF_FMT("ptr=%p", ptr);
513:
514: if (ptr) {
515: if (collect_memory_statistics) {
516: free_amount = *(size_t *)(((char*)ptr) - sizeof(size_t));
517: DBG_INF_FMT("ptr=%p size=%u", ((char*)ptr) - sizeof(size_t), (unsigned int) free_amount);
518: }
519: free(REAL_PTR(ptr));
520: }
521:
522: if (collect_memory_statistics) {
523: MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_FREE_COUNT, 1, STAT_MEM_FREE_AMOUNT, free_amount);
524: }
525: DBG_VOID_RETURN;
526: }
527: /* }}} */
528:
529: #define SMART_STR_START_SIZE 2048
530: #define SMART_STR_PREALLOC 512
531: #include "ext/standard/php_smart_str.h"
532:
533:
534: /* {{{ _mysqlnd_pestrndup */
535: char * _mysqlnd_pestrndup(const char * const ptr, size_t length, zend_bool persistent MYSQLND_MEM_D)
536: {
537: char * ret;
538: zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
539: DBG_ENTER(mysqlnd_pestrndup_name);
1.1.1.2 misho 540: #if PHP_DEBUG
541: {
542: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
543: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
544: }
545: #endif
1.1 misho 546: DBG_INF_FMT("ptr=%p", ptr);
547:
548: ret = pemalloc(REAL_SIZE(length) + 1, persistent);
549: {
550: size_t l = length;
551: char * p = (char *) ptr;
552: char * dest = (char *) FAKE_PTR(ret);
553: while (*p && l--) {
554: *dest++ = *p++;
555: }
556: *dest = '\0';
557: }
558:
559: if (collect_memory_statistics) {
560: *(size_t *) ret = length;
561: MYSQLND_INC_GLOBAL_STATISTIC(persistent? STAT_MEM_STRNDUP_COUNT : STAT_MEM_ESTRNDUP_COUNT);
562: }
563:
564: DBG_RETURN(FAKE_PTR(ret));
565: }
566: /* }}} */
567:
568:
569: /* {{{ _mysqlnd_pestrdup */
570: char * _mysqlnd_pestrdup(const char * const ptr, zend_bool persistent MYSQLND_MEM_D)
571: {
572: char * ret;
573: smart_str tmp_str = {0, 0, 0};
574: const char * p = ptr;
575: zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
576: DBG_ENTER(mysqlnd_pestrdup_name);
1.1.1.2 misho 577: #if PHP_DEBUG
578: {
579: char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
580: DBG_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
581: }
582: #endif
1.1 misho 583: DBG_INF_FMT("ptr=%p", ptr);
584: do {
585: smart_str_appendc(&tmp_str, *p);
586: } while (*p++);
587:
588: ret = pemalloc(tmp_str.len + sizeof(size_t), persistent);
589: memcpy(FAKE_PTR(ret), tmp_str.c, tmp_str.len);
590:
591: if (ret && collect_memory_statistics) {
592: *(size_t *) ret = tmp_str.len;
593: MYSQLND_INC_GLOBAL_STATISTIC(persistent? STAT_MEM_STRDUP_COUNT : STAT_MEM_ESTRDUP_COUNT);
594: }
595: smart_str_free(&tmp_str);
596:
597: DBG_RETURN(FAKE_PTR(ret));
598: }
599: /* }}} */
600:
601:
602: /* {{{ _mysqlnd_sprintf */
603: PHPAPI int _mysqlnd_sprintf(char ** pbuf, size_t max_len, const char *format, ...)
604: {
605: int len;
606: va_list ap;
607: va_start(ap, format);
608: len = vspprintf(pbuf, max_len, format, ap);
609: va_end(ap);
610: return len;
611: }
612: /* }}} */
613:
614:
615: /* {{{ _mysqlnd_sprintf_free */
616: PHPAPI void _mysqlnd_sprintf_free(char * p)
617: {
618: efree(p);
619: }
620: /* }}} */
621:
622:
623: PHPAPI int _mysqlnd_vsprintf(char ** pbuf, size_t max_len, const char * format, va_list ap)
624: {
625: return vspprintf(pbuf, max_len, format, ap);
626: }
627: /* }}} */
628:
629:
630: #define MYSQLND_DEBUG_MEMORY 1
631:
632: #if MYSQLND_DEBUG_MEMORY == 0
633:
634: /* {{{ mysqlnd_zend_mm_emalloc */
635: static void * mysqlnd_zend_mm_emalloc(size_t size MYSQLND_MEM_D)
636: {
637: return emalloc(size);
638: }
639: /* }}} */
640:
641:
642: /* {{{ mysqlnd_zend_mm_pemalloc */
643: static void * mysqlnd_zend_mm_pemalloc(size_t size, zend_bool persistent MYSQLND_MEM_D)
644: {
645: return pemalloc(size, persistent);
646: }
647: /* }}} */
648:
649:
650: /* {{{ mysqlnd_zend_mm_ecalloc */
651: static void * mysqlnd_zend_mm_ecalloc(unsigned int nmemb, size_t size MYSQLND_MEM_D)
652: {
653: return ecalloc(nmemb, size);
654: }
655: /* }}} */
656:
657:
658: /* {{{ mysqlnd_zend_mm_pecalloc */
659: static void * mysqlnd_zend_mm_pecalloc(unsigned int nmemb, size_t size, zend_bool persistent MYSQLND_MEM_D)
660: {
661: return pecalloc(nmemb, size, persistent);
662: }
663: /* }}} */
664:
665:
666: /* {{{ mysqlnd_zend_mm_erealloc */
667: static void * mysqlnd_zend_mm_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D)
668: {
669: return erealloc(ptr, new_size);
670: }
671: /* }}} */
672:
673:
674: /* {{{ mysqlnd_zend_mm_perealloc */
675: static void * mysqlnd_zend_mm_perealloc(void *ptr, size_t new_size, zend_bool persistent MYSQLND_MEM_D)
676: {
677: return perealloc(ptr, new_size, persistent);
678: }
679: /* }}} */
680:
681:
682: /* {{{ mysqlnd_zend_mm_efree */
683: static void mysqlnd_zend_mm_efree(void * ptr MYSQLND_MEM_D)
684: {
685: efree(ptr);
686: }
687: /* }}} */
688:
689:
690: /* {{{ mysqlnd_zend_mm_pefree */
691: static void mysqlnd_zend_mm_pefree(void * ptr, zend_bool persistent MYSQLND_MEM_D)
692: {
693: pefree(ptr, persistent);
694: }
695: /* }}} */
696:
697:
698: /* {{{ mysqlnd_zend_mm_malloc */
699: static void * mysqlnd_zend_mm_malloc(size_t size MYSQLND_MEM_D)
700: {
701: return malloc(size);
702: }
703: /* }}} */
704:
705:
706: /* {{{ mysqlnd_zend_mm_calloc */
707: static void * mysqlnd_zend_mm_calloc(unsigned int nmemb, size_t size MYSQLND_MEM_D)
708: {
709: return calloc(nmemb, size);
710: }
711: /* }}} */
712:
713:
714: /* {{{ mysqlnd_zend_mm_realloc */
715: static void * mysqlnd_zend_mm_realloc(void * ptr, size_t new_size MYSQLND_MEM_D)
716: {
717: return realloc(ptr, new_size);
718: }
719: /* }}} */
720:
721:
722: /* {{{ mysqlnd_zend_mm_free */
723: static void mysqlnd_zend_mm_free(void * ptr MYSQLND_MEM_D)
724: {
725: free(ptr);
726: }
727: /* }}} */
728:
729:
730: /* {{{ mysqlnd_zend_mm_pestrndup */
731: static char * mysqlnd_zend_mm_pestrndup(const char * const ptr, size_t length, zend_bool persistent MYSQLND_MEM_D)
732: {
733: return pestrndup(ptr, length, persistent);
734: }
735: /* }}} */
736:
737:
738: /* {{{ mysqlnd_zend_mm_pestrdup */
739: static char * mysqlnd_zend_mm_pestrdup(const char * const ptr, zend_bool persistent MYSQLND_MEM_D)
740: {
741: return pestrdup(ptr, persistent);
742: }
743: /* }}} */
744:
745: #endif
746:
747:
748: PHPAPI struct st_mysqlnd_allocator_methods mysqlnd_allocator =
749: {
750: #if MYSQLND_DEBUG_MEMORY
751: _mysqlnd_emalloc,
752: _mysqlnd_pemalloc,
753: _mysqlnd_ecalloc,
754: _mysqlnd_pecalloc,
755: _mysqlnd_erealloc,
756: _mysqlnd_perealloc,
757: _mysqlnd_efree,
758: _mysqlnd_pefree,
759: _mysqlnd_malloc,
760: _mysqlnd_calloc,
761: _mysqlnd_realloc,
762: _mysqlnd_free,
763: _mysqlnd_pestrndup,
764: _mysqlnd_pestrdup,
765: _mysqlnd_sprintf,
766: _mysqlnd_vsprintf,
767: _mysqlnd_sprintf_free
768: #else
769: mysqlnd_zend_mm_emalloc,
770: mysqlnd_zend_mm_pemalloc,
771: mysqlnd_zend_mm_ecalloc,
772: mysqlnd_zend_mm_pecalloc,
773: mysqlnd_zend_mm_erealloc,
774: mysqlnd_zend_mm_perealloc,
775: mysqlnd_zend_mm_efree,
776: mysqlnd_zend_mm_pefree,
777: mysqlnd_zend_mm_malloc,
778: mysqlnd_zend_mm_calloc,
779: mysqlnd_zend_mm_realloc,
780: mysqlnd_zend_mm_free,
781: mysqlnd_zend_mm_pestrndup,
782: mysqlnd_zend_mm_pestrdup
783: sprintf,
784: mysqlnd_zend_mm_efree,
785: #endif
786: };
787:
788:
789: /*
790: * Local variables:
791: * tab-width: 4
792: * c-basic-offset: 4
793: * End:
794: * vim600: noet sw=4 ts=4 fdm=marker
795: * vim<600: noet sw=4 ts=4
796: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>