Return to mysqlnd_debug.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / mysqlnd |
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.h 321634 2012-01-01 13:15:04Z felipe $ */ ! 22: ! 23: #ifndef MYSQLND_DEBUG_H ! 24: #define MYSQLND_DEBUG_H ! 25: ! 26: #include "zend_stack.h" ! 27: ! 28: struct st_mysqlnd_debug_methods ! 29: { ! 30: enum_func_status (*open)(MYSQLND_DEBUG * self, zend_bool reopen); ! 31: void (*set_mode)(MYSQLND_DEBUG * self, const char * const mode); ! 32: enum_func_status (*log)(MYSQLND_DEBUG * self, unsigned int line, const char * const file, ! 33: unsigned int level, const char * type, const char *message); ! 34: enum_func_status (*log_va)(MYSQLND_DEBUG * self, unsigned int line, const char * const file, ! 35: unsigned int level, const char * type, const char *format, ...); ! 36: zend_bool (*func_enter)(MYSQLND_DEBUG * self, unsigned int line, const char * const file, ! 37: const char * const func_name, unsigned int func_name_len); ! 38: enum_func_status (*func_leave)(MYSQLND_DEBUG * self, unsigned int line, const char * const file, uint64_t call_time); ! 39: enum_func_status (*close)(MYSQLND_DEBUG * self); ! 40: enum_func_status (*free_handle)(MYSQLND_DEBUG * self); ! 41: }; ! 42: ! 43: ! 44: struct st_mysqlnd_debug ! 45: { ! 46: php_stream *stream; ! 47: #ifdef ZTS ! 48: TSRMLS_D; ! 49: #endif ! 50: unsigned int flags; ! 51: unsigned int nest_level_limit; ! 52: int pid; ! 53: char * file_name; ! 54: zend_stack call_stack; ! 55: zend_stack call_time_stack; ! 56: HashTable not_filtered_functions; ! 57: HashTable function_profiles; ! 58: struct st_mysqlnd_debug_methods *m; ! 59: const char ** skip_functions; ! 60: }; ! 61: ! 62: PHPAPI extern const char * mysqlnd_debug_std_no_trace_funcs[]; ! 63: ! 64: PHPAPI MYSQLND_DEBUG * mysqlnd_debug_init(const char * skip_functions[] TSRMLS_DC); ! 65: ! 66: PHPAPI char * mysqlnd_get_backtrace(uint max_levels, size_t * length TSRMLS_DC); ! 67: ! 68: #if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 1400)) ! 69: #ifdef PHP_WIN32 ! 70: #include "win32/time.h" ! 71: #elif defined(NETWARE) ! 72: #include <sys/timeval.h> ! 73: #include <sys/time.h> ! 74: #else ! 75: #include <sys/time.h> ! 76: #endif ! 77: ! 78: #ifndef MYSQLND_PROFILING_DISABLED ! 79: #define DBG_PROFILE_TIMEVAL_TO_DOUBLE(tp) ((tp.tv_sec * 1000000LL)+ tp.tv_usec) ! 80: #define DBG_PROFILE_START_TIME() gettimeofday(&__dbg_prof_tp, NULL); __dbg_prof_start = DBG_PROFILE_TIMEVAL_TO_DOUBLE(__dbg_prof_tp); ! 81: #define DBG_PROFILE_END_TIME(duration) gettimeofday(&__dbg_prof_tp, NULL); (duration) = (DBG_PROFILE_TIMEVAL_TO_DOUBLE(__dbg_prof_tp) - __dbg_prof_start); ! 82: #else ! 83: #define DBG_PROFILE_TIMEVAL_TO_DOUBLE(tp) ! 84: #define DBG_PROFILE_START_TIME() ! 85: #define DBG_PROFILE_END_TIME(duration) ! 86: #endif ! 87: ! 88: #define DBG_INF_EX(dbg_obj, msg) do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log((dbg_obj), __LINE__, __FILE__, -1, "info : ", (msg)); } while (0) ! 89: #define DBG_ERR_EX(dbg_obj, msg) do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log((dbg_obj), __LINE__, __FILE__, -1, "error: ", (msg)); } while (0) ! 90: #define DBG_INF_FMT_EX(dbg_obj, ...) do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log_va((dbg_obj), __LINE__, __FILE__, -1, "info : ", __VA_ARGS__); } while (0) ! 91: #define DBG_ERR_FMT_EX(dbg_obj, ...) do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log_va((dbg_obj), __LINE__, __FILE__, -1, "error: ", __VA_ARGS__); } while (0) ! 92: ! 93: #define DBG_BLOCK_ENTER_EX(dbg_obj, block_name) \ ! 94: { \ ! 95: DBG_ENTER_EX(dbg_obj, (block_name)); ! 96: ! 97: #define DBG_BLOCK_LEAVE_EX(dbg_obj) \ ! 98: DBG_LEAVE_EX((dbg_obj), ;) \ ! 99: } \ ! 100: ! 101: ! 102: #define DBG_ENTER_EX(dbg_obj, func_name) \ ! 103: struct timeval __dbg_prof_tp = {0}; \ ! 104: uint64_t __dbg_prof_start = 0; /* initialization is needed */ \ ! 105: zend_bool dbg_skip_trace = TRUE; \ ! 106: if ((dbg_obj)) { \ ! 107: dbg_skip_trace = !(dbg_obj)->m->func_enter((dbg_obj), __LINE__, __FILE__, func_name, strlen(func_name)); \ ! 108: } \ ! 109: do { \ ! 110: if ((dbg_obj) && (dbg_obj)->flags & MYSQLND_DEBUG_PROFILE_CALLS) { \ ! 111: DBG_PROFILE_START_TIME(); \ ! 112: } \ ! 113: } while (0); ! 114: ! 115: #define DBG_LEAVE_EX(dbg_obj, leave) \ ! 116: do {\ ! 117: if ((dbg_obj)) { \ ! 118: uint64_t this_call_duration = 0; \ ! 119: if ((dbg_obj)->flags & MYSQLND_DEBUG_PROFILE_CALLS) { \ ! 120: DBG_PROFILE_END_TIME(this_call_duration); \ ! 121: } \ ! 122: (dbg_obj)->m->func_leave((dbg_obj), __LINE__, __FILE__, this_call_duration); \ ! 123: } \ ! 124: leave \ ! 125: } while (0); ! 126: ! 127: #define DBG_RETURN_EX(dbg_obj, value) DBG_LEAVE_EX(dbg_obj, return (value);) ! 128: ! 129: #define DBG_VOID_RETURN_EX(dbg_obj) DBG_LEAVE_EX(dbg_obj, return;) ! 130: ! 131: ! 132: ! 133: #else ! 134: static inline void DBG_INF_EX(MYSQLND_DEBUG * dbg_obj, const char * const msg) {} ! 135: static inline void DBG_ERR_EX(MYSQLND_DEBUG * dbg_obj, const char * const msg) {} ! 136: static inline void DBG_INF_FMT_EX(MYSQLND_DEBUG * dbg_obj, ...) {} ! 137: static inline void DBG_ERR_FMT_EX(MYSQLND_DEBUG * dbg_obj, ...) {} ! 138: static inline void DBG_ENTER_EX(MYSQLND_DEBUG * dbg_obj, const char * const func_name) {} ! 139: #define DBG_BLOCK_ENTER(bname) { ! 140: #define DBG_RETURN_EX(dbg_obj, value) return (value) ! 141: #define DBG_VOID_RETURN_EX(dbg_obj) return ! 142: #define DBG_BLOCK_LEAVE_EX(dbg_obj) } ! 143: ! 144: #endif /* defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 1400)) */ ! 145: ! 146: #if MYSQLND_DBG_ENABLED == 1 ! 147: ! 148: #define DBG_INF(msg) DBG_INF_EX(MYSQLND_G(dbg), (msg)) ! 149: #define DBG_ERR(msg) DBG_ERR_EX(MYSQLND_G(dbg), (msg)) ! 150: #define DBG_INF_FMT(...) DBG_INF_FMT_EX(MYSQLND_G(dbg), __VA_ARGS__) ! 151: #define DBG_ERR_FMT(...) DBG_ERR_FMT_EX(MYSQLND_G(dbg), __VA_ARGS__) ! 152: ! 153: #define DBG_ENTER(func_name) DBG_ENTER_EX(MYSQLND_G(dbg), (func_name)) ! 154: #define DBG_BLOCK_ENTER(bname) DBG_BLOCK_ENTER_EX(MYSQLND_G(dbg), (bname)) ! 155: #define DBG_RETURN(value) DBG_RETURN_EX(MYSQLND_G(dbg), (value)) ! 156: #define DBG_VOID_RETURN DBG_VOID_RETURN_EX(MYSQLND_G(dbg)) ! 157: #define DBG_BLOCK_LEAVE DBG_BLOCK_LEAVE_EX(MYSQLND_G(dbg)) ! 158: ! 159: #elif MYSQLND_DBG_ENABLED == 0 ! 160: ! 161: ! 162: ! 163: static inline void DBG_INF(const char * const msg) {} ! 164: static inline void DBG_ERR(const char * const msg) {} ! 165: static inline void DBG_INF_FMT(const char * const format, ...) {} ! 166: static inline void DBG_ERR_FMT(const char * const format, ...) {} ! 167: static inline void DBG_ENTER(const char * const func_name) {} ! 168: #define DBG_BLOCK_ENTER(bname) { ! 169: #define DBG_RETURN(value) return (value) ! 170: #define DBG_VOID_RETURN return ! 171: #define DBG_BLOCK_LEAVE } ! 172: ! 173: #endif ! 174: ! 175: ! 176: #define MYSQLND_MEM_D TSRMLS_DC ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ! 177: #define MYSQLND_MEM_C TSRMLS_CC ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC ! 178: ! 179: struct st_mysqlnd_allocator_methods ! 180: { ! 181: void * (*m_emalloc)(size_t size MYSQLND_MEM_D); ! 182: void * (*m_pemalloc)(size_t size, zend_bool persistent MYSQLND_MEM_D); ! 183: void * (*m_ecalloc)(unsigned int nmemb, size_t size MYSQLND_MEM_D); ! 184: void * (*m_pecalloc)(unsigned int nmemb, size_t size, zend_bool persistent MYSQLND_MEM_D); ! 185: void * (*m_erealloc)(void *ptr, size_t new_size MYSQLND_MEM_D); ! 186: void * (*m_perealloc)(void *ptr, size_t new_size, zend_bool persistent MYSQLND_MEM_D); ! 187: void (*m_efree)(void *ptr MYSQLND_MEM_D); ! 188: void (*m_pefree)(void *ptr, zend_bool persistent MYSQLND_MEM_D); ! 189: void * (*m_malloc)(size_t size MYSQLND_MEM_D); ! 190: void * (*m_calloc)(unsigned int nmemb, size_t size MYSQLND_MEM_D); ! 191: void * (*m_realloc)(void *ptr, size_t new_size MYSQLND_MEM_D); ! 192: void (*m_free)(void *ptr MYSQLND_MEM_D); ! 193: char * (*m_pestrndup)(const char * const ptr, size_t size, zend_bool persistent MYSQLND_MEM_D); ! 194: char * (*m_pestrdup)(const char * const ptr, zend_bool persistent MYSQLND_MEM_D); ! 195: }; ! 196: ! 197: PHPAPI extern struct st_mysqlnd_allocator_methods mysqlnd_allocator; ! 198: ! 199: ! 200: PHPAPI void * _mysqlnd_emalloc(size_t size MYSQLND_MEM_D); ! 201: PHPAPI void * _mysqlnd_pemalloc(size_t size, zend_bool persistent MYSQLND_MEM_D); ! 202: PHPAPI void * _mysqlnd_ecalloc(unsigned int nmemb, size_t size MYSQLND_MEM_D); ! 203: PHPAPI void * _mysqlnd_pecalloc(unsigned int nmemb, size_t size, zend_bool persistent MYSQLND_MEM_D); ! 204: PHPAPI void * _mysqlnd_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D); ! 205: PHPAPI void * _mysqlnd_perealloc(void *ptr, size_t new_size, zend_bool persistent MYSQLND_MEM_D); ! 206: PHPAPI void _mysqlnd_efree(void *ptr MYSQLND_MEM_D); ! 207: PHPAPI void _mysqlnd_pefree(void *ptr, zend_bool persistent MYSQLND_MEM_D); ! 208: PHPAPI void * _mysqlnd_malloc(size_t size MYSQLND_MEM_D); ! 209: PHPAPI void * _mysqlnd_calloc(unsigned int nmemb, size_t size MYSQLND_MEM_D); ! 210: PHPAPI void * _mysqlnd_realloc(void *ptr, size_t new_size MYSQLND_MEM_D); ! 211: PHPAPI void _mysqlnd_free(void *ptr MYSQLND_MEM_D); ! 212: PHPAPI char * _mysqlnd_pestrndup(const char * const ptr, size_t size, zend_bool persistent MYSQLND_MEM_D); ! 213: PHPAPI char * _mysqlnd_pestrdup(const char * const ptr, zend_bool persistent MYSQLND_MEM_D); ! 214: ! 215: ! 216: #define mnd_emalloc(size) mysqlnd_allocator.m_emalloc((size) MYSQLND_MEM_C) ! 217: #define mnd_pemalloc(size, pers) mysqlnd_allocator.m_pemalloc((size), (pers) MYSQLND_MEM_C) ! 218: #define mnd_ecalloc(nmemb, size) mysqlnd_allocator.m_ecalloc((nmemb), (size) MYSQLND_MEM_C) ! 219: #define mnd_pecalloc(nmemb, size, p) mysqlnd_allocator.m_pecalloc((nmemb), (size), (p) MYSQLND_MEM_C) ! 220: #define mnd_erealloc(ptr, new_size) mysqlnd_allocator.m_erealloc((ptr), (new_size) MYSQLND_MEM_C) ! 221: #define mnd_perealloc(ptr, new_size, p) mysqlnd_allocator.m_perealloc((ptr), (new_size), (p) MYSQLND_MEM_C) ! 222: #define mnd_efree(ptr) mysqlnd_allocator.m_efree((ptr) MYSQLND_MEM_C) ! 223: #define mnd_pefree(ptr, pers) mysqlnd_allocator.m_pefree((ptr), (pers) MYSQLND_MEM_C) ! 224: #define mnd_malloc(size) mysqlnd_allocator.m_malloc((size) MYSQLND_MEM_C) ! 225: #define mnd_calloc(nmemb, size) mysqlnd_allocator.m_calloc((nmemb), (size) MYSQLND_MEM_C) ! 226: #define mnd_realloc(ptr, new_size) mysqlnd_allocator.m_realloc((ptr), (new_size) MYSQLND_MEM_C) ! 227: #define mnd_free(ptr) mysqlnd_allocator.m_free((ptr) MYSQLND_MEM_C) ! 228: #define mnd_pestrndup(ptr, size, pers) mysqlnd_allocator.m_pestrndup((ptr), (size), (pers) MYSQLND_MEM_C) ! 229: #define mnd_pestrdup(ptr, pers) mysqlnd_allocator.m_pestrdup((ptr), (pers) MYSQLND_MEM_C) ! 230: ! 231: #endif /* MYSQLND_DEBUG_H */ ! 232: ! 233: /* ! 234: * Local variables: ! 235: * tab-width: 4 ! 236: * c-basic-offset: 4 ! 237: * End: ! 238: * vim600: noet sw=4 ts=4 fdm=marker ! 239: * vim<600: noet sw=4 ts=4 ! 240: */