develooper Front page | perl.perl5.porters | Postings from June 2003

Re: your malloc patches

Thread Previous | Thread Next
From:
Ilya Zakharevich
Date:
June 18, 2003 11:23
Subject:
Re: your malloc patches
Message ID:
20030618182308.GA1657@math.berkeley.edu
On Sun, Jun 15, 2003 at 12:53:47PM +0300, Jarkko Hietaniemi wrote:
> Thanks, looking much better, but I'm afraid a bit more work is needed.
> Too many GCCisms, a strange include file, and an assertion failure.
> 
> (1) The ,) macro was still there: in perl.h:

I do not understand...  I think the (broken) macro MALLOC_CHECK_TAINT2
appears in the expansion of PERL_SYS_INIT(); but PERL_SYS_INIT() is
long as obsoleted by PERL_SYS_INIT3(); how comes that this defect
became visible?

Anyway, it should be fixed by this patch.

> (2) Solaris Workshop cc doesn't like the malloc code:
> 
> "malloc.c", line 1209: a cast does not yield an lvalue

Should be fixed too.

Thanks,
Ilya

--- ./perl.h~	Wed Jun 18 18:54:31 2003
+++ ./perl.h	Wed Jun 18 19:51:49 2003
@@ -535,7 +535,7 @@ extern int Perl_doing_taint(int argc, ch
 #define TOO_LATE_FOR_(ch,s)	Perl_croak(aTHX_ "Too late for \"-%c\" option%s", (char)(ch), s)
 #define TOO_LATE_FOR(ch)	TOO_LATE_FOR_(ch, "")
 #define MALLOC_TOO_LATE_FOR(ch)	TOO_LATE_FOR_(ch, " with $ENV{PERL_MALLOC_OPT}")
-#define MALLOC_CHECK_TAINT2(argc,argv)	MALLOC_CHECK_TAINT(argc,argv,)
+#define MALLOC_CHECK_TAINT2(argc,argv)	MALLOC_CHECK_TAINT(argc,argv,NULL)
 
 #if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
 #define strchr index
--- ./malloc_ctl.h~	Wed Jun 18 18:54:30 2003
+++ ./malloc_ctl.h	Wed Jun 18 19:45:30 2003
@@ -40,12 +40,9 @@ enum {
   MallocCfg_skip_cfg_env,
   MallocCfg_cfg_env_read,
 
-
-  MallocCfg_emergency_buffer,
   MallocCfg_emergency_buffer_size,
   MallocCfg_emergency_buffer_last_req,
 
-  MallocCfg_emergency_buffer_prepared,
   MallocCfg_emergency_buffer_prepared_size,
 
   MallocCfg_last
--- ./malloc.c~	Wed Jun 18 18:54:30 2003
+++ ./malloc.c	Wed Jun 18 19:51:26 2003
@@ -1045,8 +1045,6 @@ static IV MallocCfg[MallocCfg_last] = {
   1,			/* FILL_CHECK */
   0,			/* MallocCfg_skip_cfg_env */
   0,			/* MallocCfg_cfg_env_read */
-  0,			/* MallocCfg_emergency_buffer */
-  0,			/* MallocCfg_emergency_buffer_prepared */
   0,			/* MallocCfg_emergency_buffer_size */
   0,			/* MallocCfg_emergency_buffer_prepared_size */
   0			/* MallocCfg_emergency_buffer_last_req */
@@ -1067,7 +1065,6 @@ IV *MallocCfg_ptr = MallocCfg;
 
 #  define sbrk_goodness		MallocCfg[MallocCfg_sbrk_goodness]
 
-#  define emergency_buffer	((char*)MallocCfg[MallocCfg_emergency_buffer])
 #  define emergency_buffer_size	MallocCfg[MallocCfg_emergency_buffer_size]
 #  define emergency_buffer_last_req	MallocCfg[MallocCfg_emergency_buffer_last_req]
 
@@ -1107,8 +1104,10 @@ static	u_int goodsbrk;
 #    define BIG_SIZE (1<<16)		/* 64K */
 #  endif
 
-#  ifdef NO_MALLOC_DYNAMIC_CFG
 static char *emergency_buffer;
+static char *emergency_buffer_prepared;
+
+#  ifdef NO_MALLOC_DYNAMIC_CFG
 static MEM_SIZE emergency_buffer_size;
 	/* 0 if the last request for more memory succeeded.
 	   Otherwise the size of the failing request. */
@@ -1158,10 +1157,10 @@ perl_get_emergency_buffer(IV *size)
 static char *
 get_emergency_buffer(IV *size)
 {
-    char *pv = (char*)MallocCfg[MallocCfg_emergency_buffer_prepared];
+    char *pv = emergency_buffer_prepared;
 
     *size = MallocCfg[MallocCfg_emergency_buffer_prepared_size];
-    MallocCfg[MallocCfg_emergency_buffer_prepared] = 0;
+    emergency_buffer_prepared = 0;
     MallocCfg[MallocCfg_emergency_buffer_prepared_size] = 0;
     return pv;
 }
@@ -1173,9 +1172,9 @@ set_emergency_buffer(char *b, IV size)
     if (PTR2UV(b) & (NEEDED_ALIGNMENT - 1))
 	return -1;
     if (MallocCfg[MallocCfg_emergency_buffer_prepared_size])
-	add_to_chain((void*)MallocCfg[MallocCfg_emergency_buffer_prepared],
+	add_to_chain((void*)emergency_buffer_prepared,
 		     MallocCfg[MallocCfg_emergency_buffer_prepared_size], 0);
-    MallocCfg[MallocCfg_emergency_buffer_prepared] = PTR2UV(b);
+    emergency_buffer_prepared = b;
     MallocCfg[MallocCfg_emergency_buffer_prepared_size] = size;
     return 0;
 }

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About