Blob Blame Raw
Description: <short summary of the patch>
 TODO: Put a short summary on the line above and replace this paragraph
 with a longer explanation of this change. Complete the meta-information
 with other relevant fields (see below for details). To make it easier, the
 information below has been extracted from the changelog. Adjust it or drop
 it.
 .
 gcl (2.6.12-23) unstable; urgency=medium
 .
   * Version_2_6_13pre28
Author: Camm Maguire <camm@debian.org>

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: https://bugs.debian.org/<bugnumber>
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: <YYYY-MM-DD>

--- gcl-2.6.12.orig/h/linux.h
+++ gcl-2.6.12/h/linux.h
@@ -132,20 +132,18 @@ do { int c = 0; \
 
 #include <limits.h>
 #include <sys/stat.h>
-#define GET_FULL_PATH_SELF(a_) do {\
- char b[20];\
- static char q[PATH_MAX];\
- struct stat ss;\
- if (snprintf(b,sizeof(b),"/proc/%d/exe",getpid())<=0)\
-   error("Cannot write proc exe pathname");\
- if (stat(b,&ss)) \
-   (a_)=argv[0];\
- else {\
-   if (!realpath(b,q)) \
-     error("realpath error");\
-   (a_)=q;\
- }\
-} while(0)
+#define GET_FULL_PATH_SELF(a_) do {		\
+    static char q[PATH_MAX];			\
+    const char *s="/proc/self/exe";		\
+    struct stat ss;				\
+    if (stat(s,&ss))				\
+      (a_)=argv[0];				\
+    else {					\
+      if (!realpath(s,q))			\
+	error("realpath error");		\
+      (a_)=q;					\
+    }						\
+  } while(0)
 
 
 #define UC(a_) ((ucontext_t *)a_)
--- gcl-2.6.12.orig/h/unrandomize.h
+++ gcl-2.6.12/h/unrandomize.h
@@ -23,6 +23,7 @@
 	int i,j,k;
 	char **n,**a;
 	void *v;
+	argv[0]="/proc/self/exe";
 	for (i=j=0;argv[i];i++)
 	  j+=strlen(argv[i])+1;
 	for (k=0;envp[k];k++)
--- gcl-2.6.12.orig/o/alloc.c
+++ gcl-2.6.12/o/alloc.c
@@ -351,7 +351,8 @@ resize_hole(ufixnum hp,enum type tp,bool
 
   if (!in_placep &&
       ((new_start<=start && start<new_start+size) || (new_start<start+size && start+size<=new_start+size))) {
-    emsg("Toggling relblock when resizing hole to %lu\n",hp);
+    if (sSAnotify_gbcA->s.s_dbind != Cnil)
+      emsg("Toggling relblock when resizing hole to %lu\n",hp);
     tm_table[t_relocatable].tm_adjgbccnt--;
     GBC(t_relocatable);
     return resize_hole(hp,tp,in_placep);
@@ -387,7 +388,8 @@ alloc_page(long n) {
       d=d<0 ? 0 : d;
       d=(available_pages/3)<d ? (available_pages/3) : d;
       
-      emsg("Hole overrun\n");
+      if (sSAnotify_gbcA && sSAnotify_gbcA->s.s_dbind != Cnil)
+	emsg("Hole overrun\n");
 
       resize_hole(d+nn,t_relocatable,0);
 
@@ -857,7 +859,8 @@ add_pages(struct typemanager *tm,fixnum
   case t_relocatable:
 
     if (rb_high() && m>((rb_start-heap_end)>>PAGEWIDTH)) {
-      emsg("Moving relblock low before expanding relblock pages\n");
+      if (sSAnotify_gbcA->s.s_dbind != Cnil)
+	emsg("Moving relblock low before expanding relblock pages\n");
       tm_table[t_relocatable].tm_adjgbccnt--;
       GBC(t_relocatable);
     }
@@ -1652,22 +1655,15 @@ DEFUN_NEW("GPROF-QUIT",object,fSgprof_qu
   if (!gprof_on)
     return Cnil;
 
-  if (!getcwd(b,sizeof(b)))
-    FEerror("Cannot get working directory", 0);
-  if (chdir(P_tmpdir))
-    FEerror("Cannot change directory to tmpdir", 0);
+  massert(getcwd(b,sizeof(b)));
+  massert(!chdir(P_tmpdir));
   _mcleanup();
-  if (snprintf(b1,sizeof(b1),"gprof %s",kcl_self)<=0)
-    FEerror("Cannot write gprof command line", 0);
-  if (!(pp=popen(b1,"r")))
-    FEerror("Cannot open gprof pipe", 0);
+  massert(snprintf(b1,sizeof(b1),"gprof %s",kcl_self)>0);
+  massert((pp=popen(b1,"r")));
   while ((n=fread(b1,1,sizeof(b1),pp)))
-    if (!fwrite(b1,1,n,stdout))
-      FEerror("Cannot write gprof output",0);
-  if (pclose(pp)<0)
-    FEerror("Cannot close gprof pipe", 0);
-  if (chdir(b))
-    FEerror("Cannot restore working directory", 0);
+    massert(fwrite(b1,1,n,stdout));
+  massert(pclose(pp)>=0);
+  massert(!chdir(b));
   gprof_on=0;
 
   return Cnil;
@@ -1785,28 +1781,37 @@ static char *baby_malloc(n)
 
 bool writable_malloc=0;
 
-void *
-malloc(size_t size) {
-
-  static bool in_malloc;
-
-  if (in_malloc)
-    return NULL;
-  in_malloc=1;
+static void *
+malloc_internal(size_t size) {
 
-  if (!gcl_alloc_initialized)
-    gcl_init_alloc(&size);
 #ifdef CAN_UNRANDOMIZE_SBRK
-  else if (!gcl_unrandomized)
-    return sbrk(size);
+  if (core_end && core_end!=sbrk(0))/*malloc before main in saved_image*/
+    return sbrk(size);/*will never get to gcl_init_alloc, so brk point irrelevant*/
 #endif
-  
+  if (!gcl_alloc_initialized) {
+    static bool recursive_malloc;
+    if (recursive_malloc)
+      error("Bad malloc");
+    recursive_malloc=1;
+    gcl_init_alloc(&size);
+    recursive_malloc=0;
+  }
+
   CHECK_INTERRUPT;
   
   malloc_list = make_cons(alloc_simple_string(size), malloc_list);
   malloc_list->c.c_car->st.st_self = alloc_contblock(size);
   malloc_list->c.c_car->st.st_adjustable=writable_malloc;
   
+  return(malloc_list->c.c_car->st.st_self);
+
+}
+
+void *
+malloc(size_t size) {
+
+  void *v=malloc_internal(size);;
+
   /* FIXME: this is just to handle clean freeing of the
      monstartup memory allocated automatically on raw image
      startup.  In saved images, monstartup memory is only
@@ -1814,12 +1819,11 @@ malloc(size_t size) {
 #ifdef GCL_GPROF
   if (raw_image && size>(textend-textstart) && !initial_monstartup_pointer) {
     massert(!atexit(gprof_cleanup));
-    initial_monstartup_pointer=malloc_list->c.c_car->st.st_self;
+    initial_monstartup_pointer=v;
   }
 #endif
   
-  in_malloc=0;
-  return(malloc_list->c.c_car->st.st_self);
+  return v;
   
 }
 
--- gcl-2.6.12.orig/o/error.c
+++ gcl-2.6.12/o/error.c
@@ -35,7 +35,7 @@ object sSterminal_interrupt;
 void
 assert_error(const char *a,unsigned l,const char *f,const char *n) {
 
-  if (!raw_image)
+  if (!raw_image && core_end && core_end==sbrk(0))
     FEerror("The assertion ~a on line ~a of ~a in function ~a failed",4,
 	    make_simple_string(a),make_fixnum(l),
 	    make_simple_string(f),make_simple_string(n));
--- gcl-2.6.12.orig/o/gbc.c
+++ gcl-2.6.12/o/gbc.c
@@ -1170,15 +1170,15 @@ GBC(enum type t) {
       gc_time=0;
 
 #ifdef SGC
-    printf("[%s for %ld %s pages..",
-	   (sgc_enabled ? "SGC" : "GC"),
-	   (sgc_enabled ? sgc_count_type(t) : tm_of(t)->tm_npage),
-	   (tm_table[(int)t].tm_name)+1);
+    emsg("[%s for %ld %s pages..",
+	 (sgc_enabled ? "SGC" : "GC"),
+	 (sgc_enabled ? sgc_count_type(t) : tm_of(t)->tm_npage),
+	 (tm_table[(int)t].tm_name)+1);
 #else
-    printf("[%s for %ld %s pages..",
-	   ("GC"),
-	   (tm_of(t)->tm_npage),
-	   (tm_table[(int)t].tm_name)+1);
+    emsg("[%s for %ld %s pages..",
+	 ("GC"),
+	 (tm_of(t)->tm_npage),
+	 (tm_table[(int)t].tm_name)+1);
 #endif
 
 #ifdef SGC
@@ -1349,10 +1349,9 @@ GBC(enum type t) {
   if (sSAnotify_gbcA->s.s_dbind != Cnil) {
     
     if (gc_recursive)
-      fprintf(stdout, "(T=...).GC finished]\n");
+      emsg("(T=...).GC finished]\n");
     else
-      fprintf(stdout, "(T=%d).GC finished]\n",gc_start);
-    fflush(stdout);
+      emsg("(T=%d).GC finished]\n",gc_start);
 
   }
   
--- gcl-2.6.12.orig/o/main.c
+++ gcl-2.6.12/o/main.c
@@ -205,21 +205,21 @@ get_proc_meminfo_value_in_pages(const ch
   return n>>(PAGEWIDTH-10);
 }
 
+#include <sys/sysinfo.h>
+
 static ufixnum
 get_phys_pages_no_malloc(char freep) {
 
-  return freep ? 
-    get_proc_meminfo_value_in_pages("MemFree:")+
-    get_proc_meminfo_value_in_pages("Buffers:")+
-    get_proc_meminfo_value_in_pages("Cached:") :
-    get_proc_meminfo_value_in_pages("MemTotal:");
+  struct sysinfo s;
+  sysinfo(&s);
+  return (freep ? s.freeram : s.totalram)>>PAGEWIDTH;
   
 }
 
 #endif
 
 static ufixnum
-get_phys_pages(char freep) {
+get_phys_pages1(char freep) {
 
   return get_phys_pages_no_malloc(freep);
 
@@ -313,7 +313,7 @@ update_real_maxpage(void) {
       }
   massert(!mbrk(cur));
 
-  phys_pages=ufmin(get_phys_pages(0)+page(beg),real_maxpage)-page(beg);
+  phys_pages=ufmin(get_phys_pages1(0)+page(beg),real_maxpage)-page(beg);
 
   get_gc_environ();
   setup_maxpages(mem_multiple);
@@ -412,10 +412,6 @@ DEFVAR("*CODE-BLOCK-RESERVE*",sSAcode_bl
 
 #define HAVE_GCL_CLEANUP
 
-#ifdef CAN_UNRANDOMIZE_SBRK
-bool gcl_unrandomized=FALSE;
-#endif
-
 void
 gcl_cleanup(int gc) {
 
@@ -442,10 +438,6 @@ gcl_cleanup(int gc) {
     cs_org=0;
     initial_sbrk=core_end;
 
-#ifdef CAN_UNRANDOMIZE_SBRK
-    gcl_unrandomized=FALSE;
-#endif
-
   }
 
   close_pool();
@@ -460,7 +452,6 @@ main(int argc, char **argv, char **envp)
 #include <stdio.h>
 #include <stdlib.h>
 #include "unrandomize.h"
-  gcl_unrandomized=TRUE;
 #endif
 
   gcl_init_alloc(&argv);
--- gcl-2.6.12.orig/o/sfaslelf.c
+++ gcl-2.6.12/o/sfaslelf.c
@@ -181,8 +181,7 @@ relocate(Sym *sym1,void *v,ul a,ul start
 #include RELOC_H
 
   default:
-    emsg("Unknown reloc type %lu\n", tp);
-    massert(tp&~tp);
+    massert(!emsg("Unknown reloc type %lu\n", tp));
 
   }
 
--- gcl-2.6.12.orig/o/sgbc.c
+++ gcl-2.6.12/o/sgbc.c
@@ -789,10 +789,8 @@ sgc_start(void) {
   sgc_enabled=1;
   if (memory_protect(1)) 
     sgc_quit();
-  if (sSAnotify_gbcA->s.s_dbind != Cnil) {
-    printf("[SGC on]"); 
-    fflush(stdout);
-  }
+  if (sSAnotify_gbcA->s.s_dbind != Cnil)
+    emsg("[SGC on]");
 
   sSAoptimize_maximum_pagesA->s.s_dbind=omp;
 
@@ -826,7 +824,7 @@ sgc_quit(void) {
   memory_protect(0);
 
   if(sSAnotify_gbcA->s.s_dbind != Cnil) 
-    printf("[SGC off]"); fflush(stdout);
+    emsg("[SGC off]");
 
   if (sgc_enabled==0) 
     return 0;