summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorDaniel Dragan <bulk88@hotmail.com>2014-05-20 03:23:01 -0400
committerFather Chrysostomos <sprout@cpan.org>2014-11-15 06:57:53 -0800
commit6edcbed6404ee551719c9a49397baea538aae7cc (patch)
treead31ebdeaa29319bfb89b5dd28ab266feb6cef03 /util.c
parent1f9498d0e14a8f9d5a95c29b732bb33bb3c669d8 (diff)
downloadperl-6edcbed6404ee551719c9a49397baea538aae7cc.tar.gz
make debugging easier in memory allocator code in perl.c and util.c
-show intermediate values to make C debugging easier -Perl_safesysfree overwrote var where with a different value, this caused alot of confusion for me of trying to hunt for a pointer from a stack trace with conditional breakpoints, so don't change var where in an unoptimized build -in Perl_safesysrealloc and Perl_safesysmalloc provide 1 exit path, so the returned value is easily seen and BPed on unoptimized builds
Diffstat (limited to 'util.c')
-rw-r--r--util.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/util.c b/util.c
index f9ca30603f..4ee17c2a44 100644
--- a/util.c
+++ b/util.c
@@ -172,14 +172,17 @@ Perl_safesysmalloc(MEM_SIZE size)
#endif
ptr = (Malloc_t)((char*)ptr+PERL_MEMORY_DEBUG_HEADER_SIZE);
DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) malloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
+ ret:
return ptr;
}
else {
#ifndef ALWAYS_NEED_THX
dTHX;
#endif
- if (PL_nomemok)
- return NULL;
+ if (PL_nomemok){
+ ptr = NULL;
+ goto ret;
+ }
else {
croak_no_mem();
}
@@ -207,11 +210,14 @@ Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)
if (!size) {
safesysfree(where);
- return NULL;
+ ptr = NULL;
+ goto ret;
}
- if (!where)
- return safesysmalloc(size);
+ if (!where) {
+ ptr = safesysmalloc(size);
+ goto ret;
+ }
#ifdef USE_MDH
where = (Malloc_t)((char*)where-PERL_MEMORY_DEBUG_HEADER_SIZE);
size += PERL_MEMORY_DEBUG_HEADER_SIZE;
@@ -293,14 +299,17 @@ Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)
if (ptr != NULL) {
+ ret:
return ptr;
}
else {
#ifndef ALWAYS_NEED_THX
dTHX;
#endif
- if (PL_nomemok)
- return NULL;
+ if (PL_nomemok){
+ ptr = NULL;
+ goto ret;
+ }
else {
croak_no_mem();
}
@@ -319,10 +328,10 @@ Perl_safesysfree(Malloc_t where)
DEBUG_m( PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) free\n",PTR2UV(where),(long)PL_an++));
if (where) {
#ifdef USE_MDH
- where = (Malloc_t)((char*)where-PERL_MEMORY_DEBUG_HEADER_SIZE);
+ Malloc_t where_intrn = (Malloc_t)((char*)where-PERL_MEMORY_DEBUG_HEADER_SIZE);
{
struct perl_memory_debug_header *const header
- = (struct perl_memory_debug_header *)where;
+ = (struct perl_memory_debug_header *)where_intrn;
# ifdef MDH_HAS_SIZE
const MEM_SIZE size = header->size;
@@ -352,21 +361,23 @@ Perl_safesysfree(Malloc_t where)
maybe_protect_ro(header->prev);
maybe_protect_rw(header);
# ifdef PERL_POISON
- PoisonNew(where, size, char);
+ PoisonNew(where_intrn, size, char);
# endif
/* Trigger the duplicate free warning. */
header->next = NULL;
# endif
# ifdef PERL_DEBUG_READONLY_COW
- if (munmap(where, size)) {
+ if (munmap(where_intrn, size)) {
perror("munmap failed");
abort();
}
# endif
}
-#endif
+#else
+ Malloc_t where_intrn = where;
+#endif /* USE_MDH */
#ifndef PERL_DEBUG_READONLY_COW
- PerlMem_free(where);
+ PerlMem_free(where_intrn);
#endif
}
}