about summary refs log tree commit diff
path: root/malloc
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-02-25 05:18:05 +0000
committerUlrich Drepper <drepper@redhat.com>1997-02-25 05:18:05 +0000
commit2f6d1f1be920d156768f7fa17957c782c770ed36 (patch)
treefee2ef40d1d316cb4bf63f07788b26d47009c646 /malloc
parent6bac11d99322f3cdf751b43dc3b3456039fab26c (diff)
downloadglibc-2f6d1f1be920d156768f7fa17957c782c770ed36.tar.gz
glibc-2f6d1f1be920d156768f7fa17957c782c770ed36.tar.xz
glibc-2f6d1f1be920d156768f7fa17957c782c770ed36.zip
update from main archive 970225 cvs/libc-970225
1997-02-24 23:05  Wolfram Gloger  <wmglo@dent.med.uni-muenchen.de>

	* malloc/malloc.c (malloc_get_state): New function.
	Saves global malloc state to an opaque data structure which
	is dynamically allocated in the heap.
	* malloc/malloc.c (malloc_set_state): New function.
	Restore previously obtained state.
	* malloc/malloc.h: Add declaration of malloc_get_state()
	and malloc_set_state().

1997-02-24 23:27  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/libm-ieee754/s_cbrtl.c: Shift B1_EXP value to right
	position.

1997-02-24 17:38  Ulrich Drepper  <drepper@cygnus.com>

	* misc/error.c: Make error and error_at_line weak aliases of
	__error and __error_at_line respectively.
	Suggested by David Mosberger-Tang <davidm@AZStarNet.COM>.

	* sysdeps/unix/sysv/linux/i386/socket.S: Update copyright.

1997-02-22 11:30  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* elf/ldd.bash.in: Run the program directly, not as argument
	to the dynamic linker, if it contains an interpreter segment.
	* elf/ldd.sh.in: Likewise.

	* elf/rtld.c (dl_main): In verify mode check whether the dynamic
	object contains an interpreter segment and exit with 2 if not.

1997-02-23 01:23  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makefile (distribute): Remove nsswitch.h, netgroup.h, mcheck.h
	and xlocale.h.  Make-dist adds them automagically.

1997-02-22 12:25  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* locale/C-time.c (_nl_C_LC_TIME): Add missing entry for
	time-era-num-entries.

1997-02-06 13:49  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* rellns-sh: No need to check for existance of first parameter.

1997-02-24 15:20  Jonathan T. Agnew  <jtagnew@amherst.edu>

	* glibcbug.in: Don't mention destination on MAIL_AGENT command line
	to avoid duplicate mail.

1997-02-24 03:51  Ulrich Drepper  <drepper@cygnus.com>

	* Makefile (distribute): Add isomac.c.
	(tests): Run isomac test.

	* features.h (__USE_ISOC9X): New macro.

	* catgets/catgets.c: Don't use global variable `optind'.  Instead
	use result computed by argp_parse.
	* db/makedb: Likewise.
	* locale/programs/locale.c: Likewise.
	* locale/programs/localedef.c: Likewise.

	* libio/stdio.h: Rewrite.  Make it more readable and add comments.

	* libio/clearerr.c: Remove clearerr_locked alias.
	* libio/feof.c: Remove feof_locked alias.
	* libio/ferror.c: Remove feof_locked alias.
	* libio/fileno.c: Remove fileno_locked alias.
	* libio/fputc.c: Remove fputc_locked alias.
	* libio/getc.c: Remove getc_locked alias.
	* libio/getchar.c: Remove getchar_locked alias.
	* libio/iofflush.c: Remove fflush_locked alias.
	* libio/putc.c: Remove putc_locked alias.
	* libio/putc.c: Remove putchar_locked alias.

	* stdio-common/printf_fp.c: When number is inifinity print INF
	or inf depending on case of specifier.  Same for NaN where NAN
	or nan is printed.  Specified in ISO C 9X.

	* misc/sys/cdefs.h (__restrict): Define to empty string for now.
	* stdio/stdio.h: Add __restrict to prototypes where necessary.
	* libio/stdio.h: Likewise.
	* stdlib/stdlib.h: Likewise.
	* string/string.h: Likewise.
	* time/time.h: Likewise.
	* wcsmbs/wchar.h: Likewise.

	* stdlib/strtod.c: Change to recognize INF, INFINITY, NAN, and
	NAN(...).

	* sysdeps/ieee754/huge_val.h: Define HUGE_VALF and HUGE_VALL instead
	of HUGE_VALf and HUGE_VALL.
	* stdlib/strtof.c (FLOAT_HUGE_VAL): Use standard name HUGE_VALF
	instead of HUGE_VALf.
	* wcsmbs/wcstof.c: Likewise.
	* stdlib/strtold.c (FLOAT_HUGE_VAL): Use standard name HUGE_VALL
	instead of HUGE_VALl.
	* wcsmbs/wcstold.c: Likewise.

	* sysdeps/posix/gai_strerror.c: Use size_t for counter variable to
	avoid warning.

	* wcsmbs/Makefile (routines): Add wcscasecmp and wcsncase.
	* wcsmbs/wchar.h: Add prototypes for wcscasecmp and wcsncase.
	* wcsmbs/wcscasecmp.c: New file.
	* wcsmbs/wcsncase.c: New file.

	* stdlib/strtol.c: Define wide character quad word functions as
	wcstoll and wcstoull and normal versions as strtoll and strtoull.
	* wcsmbs/wchar.h: Add prototypes for wcstoll and wcstoull.
	* wcsmbs/wcstoq: Renamed to wcstoll.c.
	* wcsmbs/wcstouq: Renamed to wcstoull.c.
	* wcsmbs/wcstoll.c: Renamed from wcstoq.c.  Make wcstoq a weak
	alias of wcstoll.
	* wcsmbs/wcstoull.c: Renamed from wcstouq.c.  Make wcstouq a weak
	alias of wcstoull.
	* wcsmbs/Makefile (routines): Replace wcstoq and wcstouq by
	wcstoll and wcstoull respectively.
	* stdlib/strtoq.c: Rename to strtoll.c.
	* stdlib/strtouq.c: Rename to strtoull.c.
	* stdlib/strtoll.c: Renamed from strtoq.c.  Make strtoq a weak
	alias of strtoll.
	* stdlib/strtoll.c: Renamed from strtouq.c.  Make strtouq a weak
	alias of strtoull.
	* stdlib/Makefile (routines): Replace strtoq and strtouq by
	strtoll and strtoull respectively.
	* stdio-common/vfscanf.c: Don't use __strtoq_internal and
	__strtouq_internal but instead __strtoll_internal and
	__strtoull_internal respectively.
	* stdlib/stdlib.h (strtoq): Use __internal_strtoll in inline version.
	(strtouq): Similar with __internal_strtoull.
	* wcsmbs/wchar.h (wcstoq): Use __internal_wcstoll in inline version.
	(wcstouq): Similar with __internal_wcstoull.

1997-02-23 04:38  Ulrich Drepper  <drepper@cygnus.com>

	* stdlib/strtol.c (STRTOL): It is not illegal to parse a minus
	sign in the strtouXX functions.  The results gets simply negated.
	* stdio-common/tstscanf.c: Add testcase for above case.
	* stdlib/tst-strtol.c: Correct tests.

	* manual/stdio-fp.c: New file.  Generate output for example program
	in stdio.texi.

	* stdio-common/Makefile (routines): Add printf_fphex.
	* stdio-common/vfprintf.c: Add handling of %a and %A specifier.
	* stdio-common/printf_fphex.c: New file.  Implement %a and %A
	specifier.

1997-02-22 03:01  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/sysv/linux/timebits.h (CLK_TCK): Don't defined if
	__STRICT_ANSI__.

	* math/math.h: Prevent definition of struct exception when using
	C++.

1997-02-22 01:45  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/syscalls.list: Dup takes only one argument.
	Reported by Greg McGary.

1997-02-21 00:22  Miles Bader  <miles@gnu.ai.mit.edu>
1997-02-20 01:28  Miles Bader  <miles@gnu.ai.mit.edu>
1997-02-19 13:56  Miles Bader  <miles@gnu.ai.mit.edu>
1997-02-18 15:39  Miles Bader  <miles@gnu.ai.mit.edu>
1997-02-17 10:58  Miles Bader  <miles@gnu.ai.mit.edu>
1997-02-15 10:23  Miles Bader  <miles@gnu.ai.mit.edu>
	(mutex_lock, mutex_unlock, mutex_trylock): Defined in terms of
	__mutex_*.
	(mutex_t): Type removed & replaced by new macro.
	(tsd_key_t): Typedef to int instead of pthread_key_t.
	(tsd_key_create, tsd_setspecific, tsd_getspecific): New macros.
	(__pthread_initialize): New macro, work around assumption of pthreads.

	* sysdeps/mach/hurd/i386/init-first.c (__libc_argv, __libc_argc):
	__hurd_sigthread_stack_end, __hurd_sigthread_stack_variables,
	__hurd_threadvar_max, __hurd_threadvar_stack_offset,
	__hurd_threadvar_stack_mask): Variables removed.
1997-02-14 14:07  Miles Bader  <miles@gnu.ai.mit.edu>
	* hurd/hurd.h (_hurd_pids_changed_stamp, _hurd_pids_changed_sync):
1997-02-24 17:06  Geoffrey Keating  <geoffk@discus.anu.edu.au>

	* sysdeps/unix/sysv/linux/accept.S (NARGS): Describe number of
	arguments taken, for sysdeps/unix/sysv/linux/powerpc/socket.S.
	* sysdeps/unix/sysv/linux/bind.S: Likewise.
	* sysdeps/unix/sysv/linux/connect.S: Likewise.
	* sysdeps/unix/sysv/linux/getpeername.S: Likewise.
	* sysdeps/unix/sysv/linux/getsockname.S: Likewise.
	* sysdeps/unix/sysv/linux/getsockopt.S: Likewise.
	* sysdeps/unix/sysv/linux/listen.S: Likewise.
	* sysdeps/unix/sysv/linux/recv.S: Likewise.
	* sysdeps/unix/sysv/linux/recvfrom.S: Likewise.
	* sysdeps/unix/sysv/linux/recvmsg.S: Likewise.
	* sysdeps/unix/sysv/linux/send.S: Likewise.
	* sysdeps/unix/sysv/linux/sendmsg.S: Likewise.
	* sysdeps/unix/sysv/linux/sendto.S: Likewise.
	* sysdeps/unix/sysv/linux/setsockopt.S: Likewise.
	* sysdeps/unix/sysv/linux/shutdown.S: Likewise.
	* sysdeps/unix/sysv/linux/socketpair.S: Likewise.

1997-02-15 04:51  Ulrich Drepper  <drepper@cygnus.com>
Diffstat (limited to 'malloc')
-rw-r--r--malloc/malloc.c162
-rw-r--r--malloc/malloc.h7
-rw-r--r--malloc/thread-m.h36
3 files changed, 193 insertions, 12 deletions
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 0380527f64..6b4fc72b20 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -19,7 +19,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-/* V2.6.4-pt2 Sat Dec 14 1996
+/* V2.6.4-pt3 Thu Feb 20 1997
 
   This work is mainly derived from malloc-2.6.4 by Doug Lea
   <dl@cs.oswego.edu>, which is available from:
@@ -874,6 +874,8 @@ extern Void_t*     sbrk();
 #define mALLOC_STATs    __malloc_stats
 #define mALLOC_USABLE_SIZe __malloc_usable_size
 #define mALLOC_TRIm     __malloc_trim
+#define mALLOC_GET_STATe __malloc_get_state
+#define mALLOC_SET_STATe __malloc_set_state
 
 #else
 
@@ -889,6 +891,8 @@ extern Void_t*     sbrk();
 #define mALLOC_STATs    malloc_stats
 #define mALLOC_USABLE_SIZe malloc_usable_size
 #define mALLOC_TRIm     malloc_trim
+#define mALLOC_GET_STATe malloc_get_state
+#define mALLOC_SET_STATe malloc_set_state
 
 #endif
 
@@ -912,7 +916,11 @@ size_t  mALLOC_USABLE_SIZe(Void_t*);
 void    mALLOC_STATs(void);
 int     mALLOPt(int, int);
 struct mallinfo mALLINFo(void);
-#else
+Void_t* mALLOC_GET_STATe(void);
+int     mALLOC_SET_STATe(Void_t*);
+
+#else /* !__STD_C */
+
 #ifndef _LIBC
 void    ptmalloc_init();
 #endif
@@ -929,7 +937,10 @@ size_t  mALLOC_USABLE_SIZe();
 void    mALLOC_STATs();
 int     mALLOPt();
 struct mallinfo mALLINFo();
-#endif
+Void_t* mALLOC_GET_STATe();
+int     mALLOC_SET_STATe();
+
+#endif /* __STD_C */
 
 
 #ifdef __cplusplus
@@ -3775,6 +3786,144 @@ int mALLOPt(param_number, value) int param_number; int value;
 
 
 
+/* Get/set state: malloc_get_state() records the current state of all
+   malloc variables (_except_ for the actual heap contents and `hook'
+   function pointers) in a system dependent, opaque data structure.
+   This data structure is dynamically allocated and can be free()d
+   after use.  malloc_set_state() restores the state of all malloc
+   variables to the previously obtained state.  This is especially
+   useful when using this malloc as part of a shared library, and when
+   the heap contents are saved/restored via some other method.  The
+   primary example for this is GNU Emacs with its `dumping' procedure.
+   `Hook' function pointers are never saved or restored by these
+   functions. */
+
+#define MALLOC_STATE_MAGIC   0x444c4541l
+#define MALLOC_STATE_VERSION (0*0x100l + 0l) /* major*0x100 + minor */
+
+struct malloc_state {
+  long          magic;
+  long          version;
+  mbinptr       av[NAV * 2 + 2];
+  char*         sbrk_base;
+  int           sbrked_mem_bytes;
+  unsigned long trim_threshold;
+  unsigned long top_pad;
+  unsigned int  n_mmaps_max;
+  unsigned long mmap_threshold;
+  int           check_action;
+  unsigned long max_sbrked_mem;
+  unsigned long max_total_mem;
+  unsigned int  n_mmaps;
+  unsigned int  max_n_mmaps;
+  unsigned long mmapped_mem;
+  unsigned long max_mmapped_mem;
+};
+
+Void_t*
+mALLOC_GET_STATe()
+{
+  mchunkptr victim;
+  struct malloc_state* ms;
+  int i;
+  mbinptr b;
+
+  ptmalloc_init();
+  (void)mutex_lock(&main_arena.mutex);
+  victim = chunk_alloc(&main_arena, request2size(sizeof(*ms)));
+  if(!victim) {
+    (void)mutex_unlock(&main_arena.mutex);
+    return 0;
+  }
+  ms = (struct malloc_state*)chunk2mem(victim);
+  ms->magic = MALLOC_STATE_MAGIC;
+  ms->version = MALLOC_STATE_VERSION;
+  ms->av[0] = main_arena.av[0];
+  ms->av[1] = main_arena.av[1];
+  for(i=0; i<NAV; i++) {
+    b = bin_at(&main_arena, i);
+    if(first(b) == b)
+      ms->av[2*i+2] = ms->av[2*i+3] = 0; /* empty bin (or initial top) */
+    else {
+      ms->av[2*i+2] = first(b);
+      ms->av[2*i+3] = last(b);
+    }
+  }
+  ms->sbrk_base = sbrk_base;
+  ms->sbrked_mem_bytes = sbrked_mem;
+  ms->trim_threshold = trim_threshold;
+  ms->top_pad = top_pad;
+  ms->n_mmaps_max = n_mmaps_max;
+  ms->mmap_threshold = mmap_threshold;
+  ms->check_action = check_action;
+  ms->max_sbrked_mem = max_sbrked_mem;
+#ifdef NO_THREADS
+  ms->max_total_mem = max_total_mem;
+#else
+  ms->max_total_mem = 0;
+#endif
+  ms->n_mmaps = n_mmaps;
+  ms->max_n_mmaps = max_n_mmaps;
+  ms->mmapped_mem = mmapped_mem;
+  ms->max_mmapped_mem = max_mmapped_mem;
+  (void)mutex_unlock(&main_arena.mutex);
+  return (Void_t*)ms;
+}
+
+int
+#if __STD_C
+mALLOC_SET_STATe(Void_t* msptr)
+#else
+mALLOC_SET_STATe(msptr) Void_t* msptr;
+#endif
+{
+  struct malloc_state* ms = (struct malloc_state*)msptr;
+  int i;
+  mbinptr b;
+
+  ptmalloc_init();
+  if(ms->magic != MALLOC_STATE_MAGIC) return -1;
+  /* Must fail if the major version is too high. */
+  if((ms->version & ~0xffl) > (MALLOC_STATE_VERSION & ~0xffl)) return -2;
+  (void)mutex_lock(&main_arena.mutex);
+  main_arena.av[0] = ms->av[0];
+  main_arena.av[1] = ms->av[1];
+  for(i=0; i<NAV; i++) {
+    b = bin_at(&main_arena, i);
+    if(ms->av[2*i+2] == 0)
+      first(b) = last(b) = b;
+    else {
+      first(b) = ms->av[2*i+2];
+      last(b) = ms->av[2*i+3];
+      if(i > 0) {
+        /* Make sure the links to the `av'-bins in the heap are correct. */
+        first(b)->bk = b;
+        last(b)->fd = b;
+      }
+    }
+  }
+  sbrk_base = ms->sbrk_base;
+  sbrked_mem = ms->sbrked_mem_bytes;
+  trim_threshold = ms->trim_threshold;
+  top_pad = ms->top_pad;
+  n_mmaps_max = ms->n_mmaps_max;
+  mmap_threshold = ms->mmap_threshold;
+  check_action = ms->check_action;
+  max_sbrked_mem = ms->max_sbrked_mem;
+#ifdef NO_THREADS
+  max_total_mem = ms->max_total_mem;
+#endif
+  n_mmaps = ms->n_mmaps;
+  max_n_mmaps = ms->max_n_mmaps;
+  mmapped_mem = ms->mmapped_mem;
+  max_mmapped_mem = ms->max_mmapped_mem;
+  /* add version-dependent code here */
+  (void)mutex_unlock(&main_arena.mutex);
+  return 0;
+}
+
+
+
 #if defined(_LIBC) || defined(MALLOC_HOOKS)
 
 /* A simple, standard set of debugging hooks.  Overhead is `only' one
@@ -4048,12 +4197,19 @@ weak_alias (__libc_mallopt, __mallopt) weak_alias (__libc_mallopt, mallopt)
 weak_alias (__malloc_stats, malloc_stats)
 weak_alias (__malloc_usable_size, malloc_usable_size)
 weak_alias (__malloc_trim, malloc_trim)
+weak_alias (__malloc_get_state, malloc_get_state)
+weak_alias (__malloc_set_state, malloc_set_state)
 #endif
 
 /*
 
 History:
 
+    V2.6.4-pt3 Thu Feb 20 1997 Wolfram Gloger (wmglo@dent.med.uni-muenchen.de)
+      * Added malloc_get/set_state() (mainly for use in GNU emacs),
+        using interface from Marcus Daniels
+      * All parameters are now adjustable via environment variables
+
     V2.6.4-pt2 Sat Dec 14 1996 Wolfram Gloger (wmglo@dent.med.uni-muenchen.de)
       * Added debugging hooks
       * Fixed possible deadlock in realloc() when out of memory
diff --git a/malloc/malloc.h b/malloc/malloc.h
index b27d06252c..53b9d1b206 100644
--- a/malloc/malloc.h
+++ b/malloc/malloc.h
@@ -171,6 +171,13 @@ extern size_t malloc_usable_size __MALLOC_P ((__malloc_ptr_t __ptr));
 /* Prints brief summary statistics on stderr. */
 extern void malloc_stats __MALLOC_P ((void));
 
+/* Record the state of all malloc variables in an opaque data structure. */
+extern __malloc_ptr_t malloc_get_state __MALLOC_P ((void));
+
+/* Restore the state of all malloc variables from data obtained with
+   malloc_get_state(). */
+extern int malloc_set_state __MALLOC_P ((__malloc_ptr_t __ptr));
+
 #if defined(__GLIBC__) || defined(MALLOC_HOOKS)
 
 /* Hooks for debugging versions. */
diff --git a/malloc/thread-m.h b/malloc/thread-m.h
index 10da26ba32..8307f256ff 100644
--- a/malloc/thread-m.h
+++ b/malloc/thread-m.h
@@ -1,6 +1,6 @@
 /* Basic platform-independent macro definitions for mutexes and
    thread-specific data.
-   Copyright (C) 1996 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Wolfram Gloger <wmglo@dent.med.uni-muenchen.de>, 1996.
 
@@ -66,19 +66,37 @@ static Void_t *malloc_key_data;
    (__pthread_mutex_unlock != NULL ? __pthread_mutex_unlock (m) : 0)
 
 #elif defined(MUTEX_INITIALIZER)
+/* Assume hurd, with cthreads */
 
-typedef thread_t thread_id;
+/* Cthreads `mutex_t' is a pointer to a mutex, and malloc wants just the
+   mutex itself.  */
+#undef mutex_t
+#define mutex_t struct mutex
 
-/* mutex */
-typedef mutex_t	mutex_t;
+#undef mutex_lock
+#define mutex_lock(m) (__mutex_lock(m), 0)
+
+#undef mutex_unlock
+#define mutex_unlock(m) (__mutex_unlock(m), 0)
+
+#define mutex_trylock(m) (!__mutex_trylock(m))
+
+#include <hurd/threadvar.h>
 
 /* thread specific data */
-typedef pthread_key_t tsd_key_t;
+typedef int tsd_key_t;
+
+static int tsd_keys_alloced = 0;
+
+#define tsd_key_create(key, destr) \
+  (assert (tsd_keys_alloced == 0), tsd_keys_alloced++)
+#define tsd_setspecific(key, data) \
+  (*__hurd_threadvar_location (_HURD_THREADVAR_MALLOC) = (unsigned long)(data))
+#define tsd_getspecific(key, vptr) \
+  ((vptr) = (void *)*__hurd_threadvar_location (_HURD_THREADVAR_MALLOC))
 
-#define mutex_init(m)		__mutex_init (m)
-#define mutex_lock(m)		__mutex_lock (m)
-#define mutex_trylock(m)	__mutex_trylock (m)
-#define mutex_unlock(m)		__mutex_unlock (m)
+/* No we're *not* using pthreads.  */
+#define __pthread_initialize ((void (*)(void))0)
 
 #else