summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/stdlib')
-rw-r--r--lib/libc/stdlib/Makefile.inc4
-rw-r--r--lib/libc/stdlib/calloc.c52
-rw-r--r--lib/libc/stdlib/malloc.320
-rw-r--r--lib/libc/stdlib/malloc.c52
4 files changed, 88 insertions, 40 deletions
diff --git a/lib/libc/stdlib/Makefile.inc b/lib/libc/stdlib/Makefile.inc
index 980dd57..58842bf 100644
--- a/lib/libc/stdlib/Makefile.inc
+++ b/lib/libc/stdlib/Makefile.inc
@@ -1,10 +1,10 @@
# from @(#)Makefile.inc 8.3 (Berkeley) 2/4/95
-# $Id: Makefile.inc,v 1.8 1997/05/03 03:50:04 jb Exp $
+# $Id: Makefile.inc,v 1.9 1997/06/22 17:54:24 phk Exp $
# machine-independent stdlib sources
.PATH: ${.CURDIR}/../libc/${MACHINE}/stdlib ${.CURDIR}/../libc/stdlib
-SRCS+= abort.c atexit.c atof.c atoi.c atol.c bsearch.c div.c \
+SRCS+= abort.c atexit.c atof.c atoi.c atol.c bsearch.c calloc.c div.c \
exit.c getenv.c getopt.c getsubopt.c strhash.c heapsort.c labs.c \
ldiv.c malloc.c merge.c putenv.c qsort.c radixsort.c rand.c random.c \
realpath.c setenv.c strtod.c strtol.c strtoq.c strtoul.c \
diff --git a/lib/libc/stdlib/calloc.c b/lib/libc/stdlib/calloc.c
new file mode 100644
index 0000000..7a83603
--- /dev/null
+++ b/lib/libc/stdlib/calloc.c
@@ -0,0 +1,52 @@
+/*-
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)calloc.c 8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <stdlib.h>
+#include <string.h>
+
+void *
+calloc(num, size)
+ size_t num;
+ register size_t size;
+{
+ register void *p;
+
+ size *= num;
+ if ( (p = malloc(size)) )
+ bzero(p, size);
+ return(p);
+}
diff --git a/lib/libc/stdlib/malloc.3 b/lib/libc/stdlib/malloc.3
index a0262c1..ef77e80 100644
--- a/lib/libc/stdlib/malloc.3
+++ b/lib/libc/stdlib/malloc.3
@@ -34,7 +34,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)malloc.3 8.1 (Berkeley) 6/4/93
-.\" $Id: malloc.3,v 1.11 1997/06/12 12:45:45 phk Exp $
+.\" $Id: malloc.3,v 1.12 1997/06/22 17:54:27 phk Exp $
.\"
.Dd August 27, 1996
.Dt MALLOC 3
@@ -119,7 +119,7 @@ is NULL, no action occurs.
.Sh TUNING
Once, when the first call is made to one of these memory allocation
routines, various flags will be set or reset, which affect the
-workings of this alloction implementation.
+workings of this allocation implementation.
.Pp
The ``name'' of the file referenced by the symbolic link named
.Pa /etc/malloc.conf ,
@@ -142,9 +142,16 @@ in these cases.
.It J
Each byte of new memory allocated by
.Fn malloc
-and
+or
+.Fn realloc
+as well as all memory returned by
+.Fn free
+or
.Fn realloc
will be initialized to 0xd0.
+This options also sets the
+.Dq R
+option.
This is intended for debugging and will impact performance negatively.
.It H
Pass a hint to the kernel about pages unused by the allocation functions.
@@ -183,8 +190,11 @@ extern char *malloc_options;
malloc_options = "X";
.Ed
.It Z
-Initialize all allocated memory to nul bytes, and overwrite any
-surrounding memory necessary for alignment reasons with 0xd0 bytes.
+This option implicitly sets the
+.Dq J
+and
+.Dq R
+options, and then zeros out the bytes that were requested.
This is intended for debugging and will impact performance negatively.
.It <
Reduce the size of the cache by a factor of two.
diff --git a/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c
index fb770f5..acd7e35 100644
--- a/lib/libc/stdlib/malloc.c
+++ b/lib/libc/stdlib/malloc.c
@@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
- * $Id: malloc.c,v 1.25 1997/06/12 12:45:45 phk Exp $
+ * $Id: malloc.c,v 1.26 1997/06/22 17:54:27 phk Exp $
*
*/
@@ -58,7 +58,7 @@
# endif
#endif /* __FreeBSD__ */
-#if defined(__sparc__) || defined(sun)
+#if defined(__sparc__) && defined(sun)
# define malloc_pageshirt 12U
# define malloc_minsize 16U
# define MAP_ANON (0)
@@ -74,7 +74,7 @@
#if defined(__FOOCPU__) && defined(__BAROS__)
# define malloc_pageshift 12U
# define malloc_minsize 16U
-#endif /* __FOORCPU__ && __BAROS__ */
+#endif /* __FOOCPU__ && __BAROS__ */
/*
@@ -220,10 +220,11 @@ static int malloc_zero;
/* junk fill ? */
static int malloc_junk;
+#ifdef HAS_UTRACE
+
/* utrace ? */
static int malloc_utrace;
-#ifdef HAS_UTRACE
struct ut { void *p; size_t s; void *r; };
void utrace __P((struct ut *, int));
@@ -233,7 +234,7 @@ void utrace __P((struct ut *, int));
{struct ut u; u.p=a; u.s = b; u.r=c; utrace(&u, sizeof u);}
#else /* !HAS_UTRACE */
#define UTRACE(a,b,c)
-#endif
+#endif /* HAS_UTRACE */
/* my last break. */
static void *malloc_brk;
@@ -406,8 +407,10 @@ malloc_init ()
case 'R': malloc_realloc = 1; break;
case 'j': malloc_junk = 0; break;
case 'J': malloc_junk = 1; break;
+#ifdef HAS_UTRACE
case 'u': malloc_utrace = 0; break;
case 'U': malloc_utrace = 1; break;
+#endif
case 'v': malloc_sysv = 0; break;
case 'V': malloc_sysv = 1; break;
case 'x': malloc_xmalloc = 0; break;
@@ -433,6 +436,13 @@ malloc_init ()
if (malloc_zero)
malloc_junk=1;
+ /*
+ * If we run with junk (or implicitly from above: zero), we want to
+ * force realloc() to get new storage, so we can DTRT with it.
+ */
+ if (malloc_junk)
+ malloc_realloc=1;
+
/* Allocate one page for the page directory */
page_dir = (struct pginfo **) MMAP(malloc_pagesize);
@@ -1051,8 +1061,6 @@ malloc(size_t size)
{
register void *r;
- if (malloc_sysv && !size)
- return (0);
malloc_func = " in malloc():";
THREAD_LOCK();
if (malloc_active++) {
@@ -1060,7 +1068,10 @@ malloc(size_t size)
malloc_active--;
return (0);
}
- r = imalloc(size);
+ if (malloc_sysv && !size)
+ r = 0;
+ else
+ r = imalloc(size);
UTRACE(0, size, r);
malloc_active--;
THREAD_UNLOCK();
@@ -1114,28 +1125,3 @@ realloc(void *ptr, size_t size)
return (r);
}
-void *
-calloc(size_t num, size_t size)
-{
- register void *r;
-
- size *= num;
- if (malloc_sysv && !size)
- return (0);
- malloc_func = " in calloc():";
- THREAD_LOCK();
- if (malloc_active++) {
- wrtwarning("recursive call.\n");
- malloc_active--;
- return (0);
- }
- r = imalloc(size);
- UTRACE(0, size, r);
- malloc_active--;
- THREAD_UNLOCK();
- if (malloc_xmalloc && !r)
- wrterror("out of memory.\n");
- if (r)
- memset(r, 0, size);
- return (r);
-}
OpenPOWER on IntegriCloud