/* Wrappers around malloc and memory debugging support.
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation,
+ Inc.
This file is part of GNU Wget.
GNU Wget is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+the Free Software Foundation; either version 3 of the License, or
+(at your option) any later version.
GNU Wget is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with Wget; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+along with Wget. If not, see <http://www.gnu.org/licenses/>.
In addition, as a special exception, the Free Software Foundation
gives permission to link the code of its release of Wget with the
file, but you are not obligated to do so. If you do not wish to do
so, delete this exception statement from your version. */
-#include <config.h>
+#include "wget.h"
#include <stdio.h>
#include <stdlib.h>
-#ifdef HAVE_STRING_H
-# include <string.h>
-#else /* not HAVE_STRING_H */
-# include <strings.h>
-#endif /* not HAVE_STRING_H */
-#include <sys/types.h>
+#include <string.h>
#include <errno.h>
#include <assert.h>
-#include "wget.h"
#include "xmalloc.h"
-#include "hash.h" /* for hash_pointer */
-
-#ifndef errno
-extern int errno;
-#endif
+#include "hash.h" /* for hash_pointer */
/* This file implements several wrappers around the basic allocation
routines. This is done for two reasons: first, so that the callers
{
/* Make sure we don't try to store part of the log line, and thus
call malloc. */
- log_set_save_context (0);
+ log_set_save_context (false);
logprintf (LOG_ALWAYS,
- _("%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"),
- exec_name, context, attempted_size);
+ _("%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"),
+ exec_name, context, attempted_size);
exit (1);
}
/* Home-grown hash table of mallocs: */
-#define SZ 100003 /* Prime just over 100,000. Increase
- it to debug larger Wget runs. */
+#define SZ 100003 /* Prime just over 100,000. Increase
+ it to debug larger Wget runs. */
static struct {
const void *ptr;
malloc_table[i].line = line;
}
-/* Unregister PTR from malloc_table. Return 0 if PTR is not present
- in malloc_table. */
+/* Unregister PTR from malloc_table. Return false if PTR is not
+ present in malloc_table. */
-static int
+static bool
unregister_ptr (void *ptr)
{
int i = ptr_position (ptr);
if (malloc_table[i].ptr == NULL)
- return 0;
+ return false;
malloc_table[i].ptr = NULL;
/* Relocate malloc_table entries immediately following PTR. */
/* Find the new location for the key. */
int j = hash_pointer (ptr2) % SZ;
for (; malloc_table[j].ptr != NULL; j = (j + 1) % SZ)
- if (ptr2 == malloc_table[j].ptr)
- /* No need to relocate entry at [i]; it's already at or near
- its hash position. */
- goto cont_outer;
+ if (ptr2 == malloc_table[j].ptr)
+ /* No need to relocate entry at [i]; it's already at or near
+ its hash position. */
+ goto cont_outer;
malloc_table[j] = malloc_table[i];
malloc_table[i].ptr = NULL;
cont_outer:
;
}
- return 1;
+ return true;
}
/* Print the malloc debug stats gathered from the above information.
{
int i;
printf ("\nMalloc: %d\nFree: %d\nBalance: %d\n\n",
- malloc_count, free_count, malloc_count - free_count);
+ malloc_count, free_count, malloc_count - free_count);
for (i = 0; i < SZ; i++)
if (malloc_table[i].ptr != NULL)
- printf ("0x%0*lx: %s:%d\n", 2 * sizeof (void *),
- (long) malloc_table[i].ptr,
- malloc_table[i].file, malloc_table[i].line);
+ printf ("0x%0*lx: %s:%d\n", PTR_FORMAT (malloc_table[i].ptr),
+ malloc_table[i].file, malloc_table[i].line);
}
void *
if (ptr == NULL)
{
fprintf (stderr, "%s: xfree(NULL) at %s:%d\n",
- exec_name, source_file, source_line);
+ exec_name, source_file, source_line);
abort ();
}
if (!unregister_ptr (ptr))
{
- fprintf (stderr, "%s: bad xfree(%0*lx) at %s:%d\n",
- exec_name, 2 * sizeof (void *), (long) ptr,
- source_file, source_line);
+ fprintf (stderr, "%s: bad xfree(0x%0*lx) at %s:%d\n",
+ exec_name, PTR_FORMAT (ptr), source_file, source_line);
abort ();
}
++free_count;