From 38ac2dc8b9ef312238d19f03f1ce779224b04154 Mon Sep 17 00:00:00 2001 From: Dominic Dunlop Date: Thu, 2 Jul 1998 22:57:26 +0000 Subject: [PATCH] Make Power MachTen use vfork and perl's malloc Message-Id: p4raw-id: //depot/perl@1298 --- hints/machten.sh | 45 ++++++++++++++++++++++++++++++++++++++++++--- malloc.c | 38 +++++++++++++++++++++++++++++++------- 2 files changed, 73 insertions(+), 10 deletions(-) diff --git a/hints/machten.sh b/hints/machten.sh index 2485460..75cbc0d 100644 --- a/hints/machten.sh +++ b/hints/machten.sh @@ -13,6 +13,8 @@ # Martijn Koster # Richard Yeh # +# Use vfork and perl's malloc by default +# -- Dominic Dunlop 980630 # Raise perl's stack size again; cut down reg_infty; document # -- Dominic Dunlop 980619 # Use of semctl() can crash system: disable -- Dominic Dunlop 980506 @@ -33,8 +35,35 @@ # Power MachTen is a real memory system and its standard malloc # has been optimized for this. Using this malloc instead of Perl's -# malloc may result in significant memory savings. -usemymalloc='false' +# malloc may result in significant memory savings. In particular, +# unlike most UNIX memory allocation subsystems, MachTen's free() +# really does return unneeded process data memory to the system. +# However, MachTen's malloc() is woefully slow -- maybe 100 times +# slower than perl's own, so perl's own is usually the better +# choice. In order to use perl's malloc(), the sbrk() system call +# must be simulated using MachTen's malloc(). See malloc.c for +# precise details of how this is achieved. Recent improvements +# to perl's malloc() currently crash MachTen, and so are disabled +# by -DPLAIN_MALLOC and -DNO_FANCY_MALLOC. +usemymalloc=${usemymalloc:-y} + +# Do not wrap the following long line +malloc_cflags='ccflags="$ccflags -DPLAIN_MALLOC -DNO_FANCY_MALLOC -DUSE_PERL_SBRK"' + +# Note that an empty malloc_cflags appears in config.sh if perl's +# malloc() is not used. his is harmless. +case "$usemymalloc" in +n) unset malloc_cflags;; +*) ccflags="$ccflags -DHIDEMYMALLOC" +esac + +# When MachTen does a fork(), it immediately copies the whole of +# the parent process' data space for the child. This can be +# expensive. Using vfork() where appropriate avoids this cost. +d_vfork=${d_vfork:-define} + +# Specify a high level of optimization (-O3 wouldn't do much more) +optimize=${optimize:--O2 -fomit-frame-pointer} # Make symbol table listings les voluminous nmopts=-gp @@ -89,9 +118,9 @@ then X=`expr $X / 2` stack_size=`expr $stack_size \* 2` done + X=`expr $stack_size \* 1024` fi -X=`expr $stack_size \* 1024` ldflags="$ldflags -Xlstack=$X" ccflags="$ccflags -DREG_INFTY=$reg_infty" @@ -141,11 +170,21 @@ During Configure, you may see the message Select the default answer: semctl() is buggy, and perl should be built without it. +Similarly, when you see + +*** WHOA THERE!!! *** + The recommended value for \$d_vfork on this machine was "define"! + Keep the recommended value? [y] + +select the default answer: vfork() works, and avoids expensive data +copying. + At the end of Configure, you will see a harmless message Hmm...You had some extra variables I don't know about...I'll try to keep 'em. Propagating recommended variable dont_use_nlink Propagating recommended variable nmopts + Propagating recommended variable malloc_cflags... Propagating recommended variable reg_infty Read the File::Find documentation for more information about dont_use_nlink diff --git a/malloc.c b/malloc.c index ea00e5a..a12f768 100644 --- a/malloc.c +++ b/malloc.c @@ -51,10 +51,17 @@ # Use table lookup to decide in which bucket a given allocation will go. SMALL_BUCKET_VIA_TABLE !NO_FANCY_MALLOC - # Use system-malloc() to emulate sbrk(). Normally only used with broken - # sbrk()s. + # Use a perl-defined sbrk() instead of the (presumably broken or + # missing) system-supplied sbrk(). + USE_PERL_SBRK undef + + # Use system malloc() (or calloc() etc.) to emulate sbrk(). Normally + # only used with broken sbrk()s. PERL_SBRK_VIA_MALLOC undef + # Which allocator to use if PERL_SBRK_VIA_MALLOC + SYSTEM_ALLOC(a) malloc(a) + # Disable memory overwrite checking with DEBUGGING. Memory and speed # optimization, error reporting pessimization. NO_RCHECK undef @@ -94,9 +101,6 @@ # This many continuous sbrk()s compensate for one discontinuous one. SBRK_FAILURE_PRICE 50 - # Which allocator to use if PERL_SBRK_VIA_MALLOC - SYSTEM_ALLOC(a) malloc(a) - This implementation assumes that calling PerlIO_printf() does not result in any memory allocation calls (used during a panic). @@ -1546,9 +1550,27 @@ dump_mstats(char *s) # define PERL_SBRK_VIA_MALLOC # endif +# ifdef __MACHTEN_PPC__ +# define PERL_SBRK_VIA_MALLOC +/* + * MachTen's malloc() returns a buffer aligned on a two-byte boundary. + * While this is adequate, it may slow down access to longer data + * types by forcing multiple memory accesses. It also causes + * complaints when RCHECK is in force. So we allocate six bytes + * more than we need to, and return an address rounded up to an + * eight-byte boundary. + * + * 980701 Dominic Dunlop + */ +# define SYSTEM_ALLOC(a) ((void *)(((unsigned)malloc((a)+6)+6)&~7)) +# endif + # ifdef PERL_SBRK_VIA_MALLOC # if defined(HIDEMYMALLOC) || defined(EMBEDMYMALLOC) -# undef malloc +# undef malloc /* Expose names that */ +# undef calloc /* HIDEMYMALLOC hides */ +# undef realloc +# undef free # else # include "Error: -DPERL_SBRK_VIA_MALLOC needs -D(HIDE|EMBED)MYMALLOC" # endif @@ -1558,7 +1580,9 @@ dump_mstats(char *s) /* frequent core dumps within nxzonefreenolock. This sbrk routine put an */ /* end to the cores */ -# define SYSTEM_ALLOC(a) malloc(a) +# ifndef SYSTEM_ALLOC +# define SYSTEM_ALLOC(a) malloc(a) +# endif # endif /* PERL_SBRK_VIA_MALLOC */ -- 2.7.4