#define ZMSG_FAILED_REQUIRE_FOPEN 3L
#define ZMSG_FAILED_HIGHLIGHT_FOPEN 4L
#define ZMSG_MEMORY_LEAK_DETECTED 5L
+#define ZMSG_MEMORY_LEAK_REPEATED 6L
#endif /* _ZEND_H */
ZEND_API void shutdown_memory_manager(int silent, int clean_cache)
{
mem_header *p, *t;
+#if ZEND_DEBUG
+ char *last_filename = NULL;
+ uint last_lineno = 0;
+ uint leak_count=0, total_bytes=0;
+#endif
ALS_FETCH();
p=AG(head);
if (!t->cached || clean_cache) {
#if ZEND_DEBUG
if (!t->cached) {
- /* does not use zend_error() *intentionally* */
- if (!silent) {
- zend_message_dispatcher(ZMSG_MEMORY_LEAK_DETECTED, t);
+ if (last_filename != t->filename || last_lineno!=t->lineno) {
+ /* flush old leak */
+ if (leak_count>0) {
+ if (!silent && leak_count>1) {
+ zend_message_dispatcher(ZMSG_MEMORY_LEAK_REPEATED, (void *) leak_count-1);
+ }
+ leak_count=0;
+ total_bytes=0;
+ }
+ last_filename = t->filename;
+ last_lineno = t->lineno;
+ if (!silent) {
+ zend_message_dispatcher(ZMSG_MEMORY_LEAK_DETECTED, t);
+ }
}
+ leak_count++;
+ total_bytes += t->size;
}
#endif
p = t->pNext;
t = t->pNext;
}
}
+#if ZEND_DEBUG
+ if (!silent && leak_count>1) {
+ zend_message_dispatcher(ZMSG_MEMORY_LEAK_REPEATED, (void *) leak_count-1);
+ }
+#endif
}
static void zend_handle_sigsegv(int dummy)
{
fflush(stdout);
+ fflush(stderr);
signal(SIGSEGV, original_sigsegv_handler);
-/*
- printf("SIGSEGV caught on opcode %d on opline %d of %s() at %s:%d\n\n",
+ fprintf(stderr, "SIGSEGV caught on opcode %d on opline %d of %s() at %s:%d\n\n",
active_opline->opcode,
active_opline-EG(active_op_array)->opcodes,
get_active_function_name(),
zend_get_executed_filename(),
zend_get_executed_lineno());
original_sigsegv_handler(dummy);
-*/
}