diff options
author | Jakub Jelinek <jakub@redhat.com> | 2009-02-18 15:49:44 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2009-02-18 15:49:44 +0000 |
commit | cf22c5c9b3a4a6cc81a269d49d2324b5df084d74 (patch) | |
tree | ca7e374c348baf4e6510329f3f271eca4eb5419f /malloc | |
parent | 73c5dd45bc405428148ee740cac61a1279fe57d4 (diff) |
Updated to fedora-glibc-20090218T1534
Diffstat (limited to 'malloc')
-rw-r--r-- | malloc/arena.c | 2 | ||||
-rw-r--r-- | malloc/hooks.c | 20 | ||||
-rw-r--r-- | malloc/malloc.c | 120 | ||||
-rw-r--r-- | malloc/memusage.c | 10 | ||||
-rwxr-xr-x | malloc/memusage.sh | 6 | ||||
-rw-r--r-- | malloc/memusagestat.c | 22 | ||||
-rw-r--r-- | malloc/obstack.h | 4 |
7 files changed, 100 insertions, 84 deletions
diff --git a/malloc/arena.c b/malloc/arena.c index 9932ee049b..cc03dc4a5b 100644 --- a/malloc/arena.c +++ b/malloc/arena.c @@ -223,7 +223,7 @@ free_atfork(Void_t* mem, const Void_t *caller) tsd_getspecific(arena_key, vptr); if(vptr != ATFORK_ARENA_PTR) (void)mutex_lock(&ar_ptr->mutex); - _int_free(ar_ptr, mem); + _int_free(ar_ptr, p); if(vptr != ATFORK_ARENA_PTR) (void)mutex_unlock(&ar_ptr->mutex); } diff --git a/malloc/hooks.c b/malloc/hooks.c index c88937665c..9659ec5fbe 100644 --- a/malloc/hooks.c +++ b/malloc/hooks.c @@ -1,5 +1,5 @@ /* Malloc implementation for multiple threads without lock contention. - Copyright (C) 2001-2006, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2001-2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Wolfram Gloger <wg@malloc.de>, 2001. @@ -293,7 +293,7 @@ free_check(mem, caller) Void_t* mem; const Void_t *caller; #if 0 /* Erase freed memory. */ memset(mem, 0, chunksize(p) - (SIZE_SZ+1)); #endif - _int_free(&main_arena, mem); + _int_free(&main_arena, p); (void)mutex_unlock(&main_arena.mutex); } @@ -305,8 +305,7 @@ realloc_check(oldmem, bytes, caller) Void_t* oldmem; size_t bytes; const Void_t *caller; #endif { - mchunkptr oldp; - INTERNAL_SIZE_T nb, oldsize; + INTERNAL_SIZE_T nb; Void_t* newmem = 0; unsigned char *magic_p; @@ -320,13 +319,13 @@ realloc_check(oldmem, bytes, caller) return NULL; } (void)mutex_lock(&main_arena.mutex); - oldp = mem2chunk_check(oldmem, &magic_p); + const mchunkptr oldp = mem2chunk_check(oldmem, &magic_p); (void)mutex_unlock(&main_arena.mutex); if(!oldp) { malloc_printerr(check_action, "realloc(): invalid pointer", oldmem); return malloc_check(bytes, NULL); } - oldsize = chunksize(oldp); + const INTERNAL_SIZE_T oldsize = chunksize(oldp); checked_request2size(bytes+1, nb); (void)mutex_lock(&main_arena.mutex); @@ -355,8 +354,11 @@ realloc_check(oldmem, bytes, caller) } } else { #endif /* HAVE_MMAP */ - if (top_check() >= 0) - newmem = _int_realloc(&main_arena, oldmem, bytes+1); + if (top_check() >= 0) { + INTERNAL_SIZE_T nb; + checked_request2size(bytes + 1, nb); + newmem = _int_realloc(&main_arena, oldp, nb); + } #if 0 /* Erase freed memory. */ if(newmem) newp = mem2chunk(newmem); @@ -470,7 +472,7 @@ free_starter(mem, caller) Void_t* mem; const Void_t *caller; return; } #endif - _int_free(&main_arena, mem); + _int_free(&main_arena, p); } # endif /* !defiend NO_STARTER */ diff --git a/malloc/malloc.c b/malloc/malloc.c index a918934740..12e23b0f9b 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -1581,11 +1581,11 @@ typedef struct malloc_chunk* mchunkptr; #if __STD_C -Void_t* _int_malloc(mstate, size_t); -void _int_free(mstate, Void_t*); -Void_t* _int_realloc(mstate, Void_t*, size_t); -Void_t* _int_memalign(mstate, size_t, size_t); -Void_t* _int_valloc(mstate, size_t); +static Void_t* _int_malloc(mstate, size_t); +static void _int_free(mstate, mchunkptr); +static Void_t* _int_realloc(mstate, mchunkptr, INTERNAL_SIZE_T); +static Void_t* _int_memalign(mstate, size_t, size_t); +static Void_t* _int_valloc(mstate, size_t); static Void_t* _int_pvalloc(mstate, size_t); /*static Void_t* cALLOc(size_t, size_t);*/ #ifndef _LIBC @@ -1632,12 +1632,12 @@ static void free_atfork(Void_t* mem, const Void_t *caller); #else -Void_t* _int_malloc(); -void _int_free(); -Void_t* _int_realloc(); -Void_t* _int_memalign(); -Void_t* _int_valloc(); -Void_t* _int_pvalloc(); +static Void_t* _int_malloc(); +static void _int_free(); +static Void_t* _int_realloc(); +static Void_t* _int_memalign(); +static Void_t* _int_valloc(); +static Void_t* _int_pvalloc(); /*static Void_t* cALLOc();*/ static Void_t** _int_icalloc(); static Void_t** _int_icomalloc(); @@ -3084,7 +3084,7 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av; set_head(chunk_at_offset(old_top, old_size), (2*SIZE_SZ)|PREV_INUSE); set_foot(chunk_at_offset(old_top, old_size), (2*SIZE_SZ)); set_head(old_top, old_size|PREV_INUSE|NON_MAIN_ARENA); - _int_free(av, chunk2mem(old_top)); + _int_free(av, old_top); } else { set_head(old_top, (old_size + 2*SIZE_SZ)|PREV_INUSE); set_foot(old_top, (old_size + 2*SIZE_SZ)); @@ -3131,7 +3131,7 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av; if (brk != (char*)(MORECORE_FAILURE)) { /* Call the `morecore' hook if necessary. */ - if (__after_morecore_hook) + if (__builtin_expect (__after_morecore_hook != NULL, 0)) (*__after_morecore_hook) (); } else { /* @@ -3270,7 +3270,7 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av; snd_brk = (char*)(MORECORE(0)); } else /* Call the `morecore' hook if necessary. */ - if (__after_morecore_hook) + if (__builtin_expect (__after_morecore_hook != NULL, 0)) (*__after_morecore_hook) (); } @@ -3323,7 +3323,7 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av; /* If possible, release the rest. */ if (old_size >= MINSIZE) { - _int_free(av, chunk2mem(old_top)); + _int_free(av, old_top); } } @@ -3415,7 +3415,7 @@ static int sYSTRIm(pad, av) size_t pad; mstate av; MORECORE(-extra); /* Call the `morecore' hook if necessary. */ - if (__after_morecore_hook) + if (__builtin_expect (__after_morecore_hook != NULL, 0)) (*__after_morecore_hook) (); new_brk = (char*)(MORECORE(0)); @@ -3542,7 +3542,7 @@ public_mALLOc(size_t bytes) Void_t *victim; __malloc_ptr_t (*hook) (size_t, __const __malloc_ptr_t) = __malloc_hook; - if (hook != NULL) + if (__builtin_expect (hook != NULL, 0)) return (*hook)(bytes, RETURN_ADDRESS (0)); arena_get(ar_ptr, bytes); @@ -3585,7 +3585,7 @@ public_fREe(Void_t* mem) mchunkptr p; /* chunk corresponding to mem */ void (*hook) (__malloc_ptr_t, __const __malloc_ptr_t) = __free_hook; - if (hook != NULL) { + if (__builtin_expect (hook != NULL, 0)) { (*hook)(mem, RETURN_ADDRESS (0)); return; } @@ -3622,7 +3622,7 @@ public_fREe(Void_t* mem) #else (void)mutex_lock(&ar_ptr->mutex); #endif - _int_free(ar_ptr, mem); + _int_free(ar_ptr, p); (void)mutex_unlock(&ar_ptr->mutex); } #ifdef libc_hidden_def @@ -3635,14 +3635,11 @@ public_rEALLOc(Void_t* oldmem, size_t bytes) mstate ar_ptr; INTERNAL_SIZE_T nb; /* padded request size */ - mchunkptr oldp; /* chunk corresponding to oldmem */ - INTERNAL_SIZE_T oldsize; /* its size */ - Void_t* newp; /* chunk to return */ __malloc_ptr_t (*hook) (__malloc_ptr_t, size_t, __const __malloc_ptr_t) = __realloc_hook; - if (hook != NULL) + if (__builtin_expect (hook != NULL, 0)) return (*hook)(oldmem, bytes, RETURN_ADDRESS (0)); #if REALLOC_ZERO_BYTES_FREES @@ -3652,8 +3649,10 @@ public_rEALLOc(Void_t* oldmem, size_t bytes) /* realloc of null is supposed to be same as malloc */ if (oldmem == 0) return public_mALLOc(bytes); - oldp = mem2chunk(oldmem); - oldsize = chunksize(oldp); + /* chunk corresponding to oldmem */ + const mchunkptr oldp = mem2chunk(oldmem); + /* its size */ + const INTERNAL_SIZE_T oldsize = chunksize(oldp); /* Little security check which won't hurt performance: the allocator never wrapps around at the end of the address space. @@ -3705,7 +3704,7 @@ public_rEALLOc(Void_t* oldmem, size_t bytes) tsd_setspecific(arena_key, (Void_t *)ar_ptr); #endif - newp = _int_realloc(ar_ptr, oldmem, bytes); + newp = _int_realloc(ar_ptr, oldp, nb); (void)mutex_unlock(&ar_ptr->mutex); assert(!newp || chunk_is_mmapped(mem2chunk(newp)) || @@ -3728,7 +3727,7 @@ public_rEALLOc(Void_t* oldmem, size_t bytes) #else (void)mutex_lock(&ar_ptr->mutex); #endif - _int_free(ar_ptr, oldmem); + _int_free(ar_ptr, oldp); (void)mutex_unlock(&ar_ptr->mutex); } } @@ -3748,7 +3747,7 @@ public_mEMALIGn(size_t alignment, size_t bytes) __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t, __const __malloc_ptr_t)) = __memalign_hook; - if (hook != NULL) + if (__builtin_expect (hook != NULL, 0)) return (*hook)(alignment, bytes, RETURN_ADDRESS (0)); /* If need less alignment than we give anyway, just relay to malloc */ @@ -3805,7 +3804,7 @@ public_vALLOc(size_t bytes) __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t, __const __malloc_ptr_t)) = __memalign_hook; - if (hook != NULL) + if (__builtin_expect (hook != NULL, 0)) return (*hook)(pagesz, bytes, RETURN_ADDRESS (0)); arena_get(ar_ptr, bytes + pagesz + MINSIZE); @@ -3852,7 +3851,7 @@ public_pVALLOc(size_t bytes) __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t, __const __malloc_ptr_t)) = __memalign_hook; - if (hook != NULL) + if (__builtin_expect (hook != NULL, 0)) return (*hook)(pagesz, rounded_bytes, RETURN_ADDRESS (0)); arena_get(ar_ptr, bytes + 2*pagesz + MINSIZE); @@ -3906,7 +3905,7 @@ public_cALLOc(size_t n, size_t elem_size) } } - if (hook != NULL) { + if (__builtin_expect (hook != NULL, 0)) { sz = bytes; mem = (*hook)(sz, RETURN_ADDRESS (0)); if(mem == 0) @@ -4125,7 +4124,7 @@ public_mALLOPt(int p, int v) ------------------------------ malloc ------------------------------ */ -Void_t* +static Void_t* _int_malloc(mstate av, size_t bytes) { INTERNAL_SIZE_T nb; /* normalized request size */ @@ -4589,10 +4588,9 @@ _int_malloc(mstate av, size_t bytes) ------------------------------ free ------------------------------ */ -void -_int_free(mstate av, Void_t* mem) +static void +_int_free(mstate av, mchunkptr p) { - mchunkptr p; /* chunk corresponding to mem */ INTERNAL_SIZE_T size; /* its size */ mfastbinptr* fb; /* associated fastbin */ mchunkptr nextchunk; /* next contiguous chunk */ @@ -4604,7 +4602,6 @@ _int_free(mstate av, Void_t* mem) const char *errstr = NULL; - p = mem2chunk(mem); size = chunksize(p); /* Little security check which won't hurt performance: the @@ -4616,7 +4613,7 @@ _int_free(mstate av, Void_t* mem) { errstr = "free(): invalid pointer"; errout: - malloc_printerr (check_action, errstr, mem); + malloc_printerr (check_action, errstr, chunk2mem(p)); return; } /* We know that each chunk is at least MINSIZE bytes in size. */ @@ -4663,7 +4660,7 @@ _int_free(mstate av, Void_t* mem) } if (__builtin_expect (perturb_byte, 0)) - free_perturb (mem, size - SIZE_SZ); + free_perturb (chunk2mem(p), size - SIZE_SZ); p->fd = *fb; *fb = p; @@ -4707,7 +4704,7 @@ _int_free(mstate av, Void_t* mem) } if (__builtin_expect (perturb_byte, 0)) - free_perturb (mem, size - SIZE_SZ); + free_perturb (chunk2mem(p), size - SIZE_SZ); /* consolidate backward */ if (!prev_inuse(p)) { @@ -4943,13 +4940,8 @@ static void malloc_consolidate(av) mstate av; */ Void_t* -_int_realloc(mstate av, Void_t* oldmem, size_t bytes) +_int_realloc(mstate av, mchunkptr oldp, INTERNAL_SIZE_T nb) { - INTERNAL_SIZE_T nb; /* padded request size */ - - mchunkptr oldp; /* chunk corresponding to oldmem */ - INTERNAL_SIZE_T oldsize; /* its size */ - mchunkptr newp; /* chunk to return */ INTERNAL_SIZE_T newsize; /* its size */ Void_t* newmem; /* corresponding user mem */ @@ -4969,20 +4961,18 @@ _int_realloc(mstate av, Void_t* oldmem, size_t bytes) const char *errstr = NULL; - - checked_request2size(bytes, nb); - - oldp = mem2chunk(oldmem); - oldsize = chunksize(oldp); - /* Simple tests for old block integrity. */ if (__builtin_expect (misaligned_chunk (oldp), 0)) { errstr = "realloc(): invalid pointer"; errout: - malloc_printerr (check_action, errstr, oldmem); + malloc_printerr (check_action, errstr, chunk2mem(oldp)); return NULL; } + + /* oldmem size */ + const INTERNAL_SIZE_T oldsize = chunksize(oldp); + if (__builtin_expect (oldp->size <= 2 * SIZE_SZ, 0) || __builtin_expect (oldsize >= av->system_mem, 0)) { @@ -5054,7 +5044,7 @@ _int_realloc(mstate av, Void_t* oldmem, size_t bytes) */ copysize = oldsize - SIZE_SZ; - s = (INTERNAL_SIZE_T*)(oldmem); + s = (INTERNAL_SIZE_T*)(chunk2mem(oldp)); d = (INTERNAL_SIZE_T*)(newmem); ncopies = copysize / sizeof(INTERNAL_SIZE_T); assert(ncopies >= 3); @@ -5080,7 +5070,7 @@ _int_realloc(mstate av, Void_t* oldmem, size_t bytes) } } - _int_free(av, oldmem); + _int_free(av, oldp); check_inuse_chunk(av, newp); return chunk2mem(newp); } @@ -5104,7 +5094,7 @@ _int_realloc(mstate av, Void_t* oldmem, size_t bytes) (av != &main_arena ? NON_MAIN_ARENA : 0)); /* Mark remainder as inuse so free() won't complain */ set_inuse_bit_at_offset(remainder, remainder_size); - _int_free(av, chunk2mem(remainder)); + _int_free(av, remainder); } check_inuse_chunk(av, newp); @@ -5129,7 +5119,7 @@ _int_realloc(mstate av, Void_t* oldmem, size_t bytes) /* don't need to remap if still within same page */ if (oldsize == newsize - offset) - return oldmem; + return chunk2mem(oldp); cp = (char*)mremap((char*)oldp - offset, oldsize + offset, newsize, 1); @@ -5157,13 +5147,13 @@ _int_realloc(mstate av, Void_t* oldmem, size_t bytes) /* Note the extra SIZE_SZ overhead. */ if ((unsigned long)(oldsize) >= (unsigned long)(nb + SIZE_SZ)) - newmem = oldmem; /* do nothing */ + newmem = chunk2mem(oldp); /* do nothing */ else { /* Must alloc, copy, free. */ newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK); if (newmem != 0) { - MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ); - _int_free(av, oldmem); + MALLOC_COPY(newmem, chunk2mem(oldp), oldsize - 2*SIZE_SZ); + _int_free(av, oldp); } } return newmem; @@ -5181,7 +5171,7 @@ _int_realloc(mstate av, Void_t* oldmem, size_t bytes) ------------------------------ memalign ------------------------------ */ -Void_t* +static Void_t* _int_memalign(mstate av, size_t alignment, size_t bytes) { INTERNAL_SIZE_T nb; /* padded request size */ @@ -5257,7 +5247,7 @@ _int_memalign(mstate av, size_t alignment, size_t bytes) (av != &main_arena ? NON_MAIN_ARENA : 0)); set_inuse_bit_at_offset(newp, newsize); set_head_size(p, leadsize | (av != &main_arena ? NON_MAIN_ARENA : 0)); - _int_free(av, chunk2mem(p)); + _int_free(av, p); p = newp; assert (newsize >= nb && @@ -5273,7 +5263,7 @@ _int_memalign(mstate av, size_t alignment, size_t bytes) set_head(remainder, remainder_size | PREV_INUSE | (av != &main_arena ? NON_MAIN_ARENA : 0)); set_head_size(p, nb); - _int_free(av, chunk2mem(remainder)); + _int_free(av, remainder); } } @@ -5514,7 +5504,7 @@ mstate av; size_t n_elements; size_t* sizes; int opts; Void_t* chunks[]; ------------------------------ valloc ------------------------------ */ -Void_t* +static Void_t* #if __STD_C _int_valloc(mstate av, size_t bytes) #else @@ -5531,7 +5521,7 @@ _int_valloc(av, bytes) mstate av; size_t bytes; */ -Void_t* +static Void_t* #if __STD_C _int_pvalloc(mstate av, size_t bytes) #else @@ -6020,7 +6010,7 @@ __posix_memalign (void **memptr, size_t alignment, size_t size) /* Call the hook here, so that caller is posix_memalign's caller and not posix_memalign itself. */ - if (hook != NULL) + if (__builtin_expect (hook != NULL, 0)) mem = (*hook)(alignment, size, RETURN_ADDRESS (0)); else mem = public_mEMALIGn (alignment, size); diff --git a/malloc/memusage.c b/malloc/memusage.c index d11e9e6ed5..fcd58dc684 100644 --- a/malloc/memusage.c +++ b/malloc/memusage.c @@ -1,5 +1,5 @@ /* Profile heap and stack memory usage of running program. - Copyright (C) 1998-2002, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1998-2002, 2004-2006, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -18,6 +18,7 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include <assert.h> #include <atomic.h> #include <dlfcn.h> #include <errno.h> @@ -92,7 +93,7 @@ static __thread uintptr_t start_sp; #define peak_stack peak_use[1] #define peak_total peak_use[2] -#define DEFAULT_BUFFER_SIZE 1024 +#define DEFAULT_BUFFER_SIZE 32768 static size_t buffer_size; static int fd = -1; @@ -168,10 +169,11 @@ update_data (struct header *result, size_t len, size_t old_len) this fails because of another thread increasing the counter it does not matter since that thread will take care of the correction. */ - unsigned int reset = idx - 2 * buffer_size; - catomic_compare_and_exchange_val_acq (&buffer_size, reset, idx); + uatomic32_t reset = idx % (2 * buffer_size); + catomic_compare_and_exchange_val_acq (&buffer_cnt, reset, idx); idx = reset; } + assert (idx < 2 * DEFAULT_BUFFER_SIZE); buffer[idx].heap = current_heap; buffer[idx].stack = current_stack; diff --git a/malloc/memusage.sh b/malloc/memusage.sh index 1c906a1be5..8b372e4b8e 100755 --- a/malloc/memusage.sh +++ b/malloc/memusage.sh @@ -61,8 +61,10 @@ Profile memory usage of PROGRAM. Mandatory arguments to long options are also mandatory for any corresponding short options. -For bug reporting instructions, please see: -<http://www.gnu.org/software/libc/bugs.html>." +" + print $"For bug reporting instructions, please see: +<http://www.gnu.org/software/libc/bugs.html>. +" exit 0 } diff --git a/malloc/memusagestat.c b/malloc/memusagestat.c index 779d5c0a59..bf33175415 100644 --- a/malloc/memusagestat.c +++ b/malloc/memusagestat.c @@ -1,5 +1,6 @@ /* Generate graphic from memory profiling data. - Copyright (C) 1998, 1999, 2000, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2005, 2006, + 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -38,6 +39,8 @@ #include <gdfontl.h> #include <gdfonts.h> +#include "../version.h" +#define PACKAGE _libc_intl_domainname /* Default size of the generated image. */ #define XSIZE 800 @@ -73,6 +76,10 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state); /* Function to print some extra text in the help message. */ static char *more_help (int key, const char *text, void *input); +/* Name and version of program. */ +static void print_version (FILE *stream, struct argp_state *state); +void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version; + /* Data structure to communicate with argp functions. */ static struct argp argp = { @@ -535,3 +542,16 @@ For bug reporting instructions, please see:\n\ } return (char *) text; } + +/* Print the version information. */ +static void +print_version (FILE *stream, struct argp_state *state) +{ + fprintf (stream, "memusagestat (GNU %s) %s\n", PACKAGE, VERSION); + fprintf (stream, gettext ("\ +Copyright (C) %s Free Software Foundation, Inc.\n\ +This is free software; see the source for copying conditions. There is NO\n\ +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ +"), "2009"); + fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper"); +} diff --git a/malloc/obstack.h b/malloc/obstack.h index 206fe55050..449070e7f1 100644 --- a/malloc/obstack.h +++ b/malloc/obstack.h @@ -1,5 +1,5 @@ /* obstack.h - object stack macros - Copyright (C) 1988-1994,1996-1999,2003,2004,2005 + Copyright (C) 1988-1994,1996-1999,2003,2004,2005,2009 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -187,7 +187,7 @@ extern int _obstack_begin_1 (struct obstack *, int, int, void (*) (void *, void *), void *); extern int _obstack_memory_used (struct obstack *); -void obstack_free (struct obstack *obstack, void *block); +void obstack_free (struct obstack *__obstack, void *__block); /* Error handler called when `obstack_chunk_alloc' failed to allocate |