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-4) unstable; urgency=medium
 .
   * Version_2_6_13pre3a
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/elf64_ppcle_reloc_special.h
+++ gcl-2.6.12/h/elf64_ppcle_reloc_special.h
@@ -15,8 +15,6 @@ find_special_params(void *v,Shdr *sec1,S
   Shdr *sec;
   Rela *r;
   void *ve;
-  ul j,*u;
-
 
   massert((sec=get_section(".rela.plt",sec1,sece,sn)));
 
--- gcl-2.6.12.orig/h/page.h
+++ gcl-2.6.12/h/page.h
@@ -88,7 +88,8 @@ extern int reserve_pages_for_signal_hand
 /* #define CONT_MARK_PAGE (((page(heap_end)-first_data_page)*(PAGESIZE/(CPTR_SIZE*CHAR_SIZE))+PAGESIZE-1)/PAGESIZE) */
 /* #define	available_pages	((fixnum)(real_maxpage-page(heap_end)-2*nrbpage-CONT_MARK_PAGE-resv_pages)) */
 
-extern struct pageinfo *cell_list_head,*cell_list_tail,*contblock_list_head,*contblock_list_tail;
+extern struct pageinfo *cell_list_head,*cell_list_tail/* ,*contblock_list_head,*contblock_list_tail */;
+extern object contblock_array;
 
 #define PAGE_MAGIC 0x2e
 
@@ -114,7 +115,7 @@ EXTER void *data_start,*initial_sbrk;
 #define CB_BITS     CPTR_SIZE*CHAR_SIZE
 #define ceil(a_,b_) (((a_)+(b_)-1)/(b_))
 #define npage(m_)   ceil(m_,PAGESIZE)
-#define cpage(m_)   ({ufixnum _m=(m_);ceil(sizeof(struct pageinfo)+_m+2*ceil(_m,(CB_BITS-2)),PAGESIZE);})
+#define cpage(m_)   CEI(({ufixnum _m=(m_);ceil(sizeof(struct pageinfo)+_m+2*ceil(_m,(CB_BITS-2)),PAGESIZE);}),256)
 #define mbytes(p_)  ceil((p_)*PAGESIZE-sizeof(struct pageinfo),CB_BITS)
 #define tpage(tm_,m_) (tm_->tm_type==t_relocatable ? npage(m_-(rb_limit-rb_pointer)+1) : (tm_->tm_type==t_contiguous ? cpage(m_) : npage(m_)))
 
--- gcl-2.6.12.orig/h/protoize.h
+++ gcl-2.6.12/h/protoize.h
@@ -1941,3 +1941,12 @@ mbrk(void *);
 
 void
 maybe_set_hole_from_maxpages(void);
+
+void *
+alloc_code_space(size_t);
+
+object 
+fSmake_vector1_2(fixnum,fixnum,object,object);
+
+inline struct pageinfo *
+get_pageinfo(void *);
--- gcl-2.6.12.orig/o/alloc.c
+++ gcl-2.6.12/o/alloc.c
@@ -78,6 +78,72 @@ struct rlimit data_rlimit;
 #endif
 #endif
 
+static inline void *
+bsearchleq(void *i,void *v1,size_t n,size_t s,int (*c)(const void *,const void *)) {
+
+  ufixnum nn=n>>1;
+  void *v=v1+nn*s;
+  int j=c(i,v);
+
+  if (nn)
+    return !j ? v : (j>0 ? bsearchleq(i,v,n-nn,s,c) : bsearchleq(i,v1,nn,s,c));
+  else
+    return j<=0 ? v : v+s;
+
+}
+		     
+
+object contblock_array=Cnil;
+
+static inline void
+expand_contblock_array(void) {
+
+  if (contblock_array==Cnil) {
+    contblock_array=fSmake_vector1_2(16,aet_fix,Cnil,make_fixnum(0));
+    contblock_array->v.v_self[0]=(object)&cb_pointer;
+    enter_mark_origin(&contblock_array);
+  }
+
+  if (contblock_array->v.v_fillp==contblock_array->v.v_dim) {
+
+    void *v=alloc_relblock(2*contblock_array->v.v_dim*sizeof(fixnum));
+
+    memcpy(v,contblock_array->v.v_self,contblock_array->v.v_dim*sizeof(fixnum));
+    contblock_array->v.v_self=v;
+    contblock_array->v.v_dim*=2;
+
+  }
+
+}
+
+static void
+contblock_array_push(void *p) {
+
+  expand_contblock_array();
+  contblock_array->v.v_self[contblock_array->v.v_fillp]=p;
+  contblock_array->v.v_fillp++;
+
+}
+  
+static inline int
+acomp(const void *v1,const void *v2) {
+
+  void *p1=*(void * const *)v1,*p2=*(void * const *)v2;
+
+  return p1<p2 ? -1 : (p1==p2 ? 0 : 1);
+
+}
+
+inline struct pageinfo *
+get_pageinfo(void *x) {
+
+  struct pageinfo **pp=bsearchleq(&x,contblock_array->v.v_self,contblock_array->v.v_fillp,sizeof(*contblock_array->v.v_self),acomp);
+  struct pageinfo *p=(void *)pp>(void *)contblock_array->v.v_self ? pp[-1] : NULL;
+  
+  return p && (void *)p+p->in_use*PAGESIZE>x ? p : NULL;
+
+}
+
 inline void
 add_page_to_contblock_list(void *p,fixnum m) {
  
@@ -89,13 +155,8 @@ add_page_to_contblock_list(void *p,fixnu
   massert(pp->in_use==m);
   pp->magic=PAGE_MAGIC;
   
-  if (contblock_list_head==NULL)
-    contblock_list_tail=contblock_list_head=p;
-  else if (pp > contblock_list_tail) {
-    contblock_list_tail->next=p;
-    contblock_list_tail=p;
-  }
-  
+  contblock_array_push(p);
+
   bzero(pagetochar(page(pp)),CB_DATA_START(pp)-(void *)pagetochar(page(pp)));
 #ifdef SGC
   if (sgc_enabled && tm_table[t_contiguous].tm_sgc) {
@@ -458,7 +519,7 @@ rebalance_maxpages(struct typemanager *m
     for (i=t_start;i<t_other;i++)
       if (tm_table[i].tm_npage) {
 	if (tm_table+i==my_tm) {
-	  massert(set_tm_maxpage(tm_table+i,z));
+	  massert(set_tm_maxpage(tm_table+i,z) || !fprintf(stderr,"%lu %lu %lu %lu %lu\n",i,z,tm_table[i].tm_npage,tm_table[i].tm_maxpage,available_pages));
 	} else {
 	  massert(set_tm_maxpage(tm_table+i,tm_table[i].tm_npage+(1.0-(double)(j+d-phys_pages)/k)*(tm_table[i].tm_maxpage-tm_table[i].tm_npage)));
 	}
@@ -562,7 +623,7 @@ static inline void
 expand_contblock_index_space(void) {
 
   if (cbv==Cnil) {
-    cbv=(VFUN_NARGS=4,fSmake_vector1(make_fixnum(16),make_fixnum(aet_fix),Cnil,make_fixnum(0)));
+    cbv=fSmake_vector1_2(16,aet_fix,Cnil,make_fixnum(0));
     cbv->v.v_self[0]=(object)&cb_pointer;
     enter_mark_origin(&cbv);
   }
@@ -612,21 +673,6 @@ cbcomp(const void *v1,const void *v2) {
 
 }
 
-static inline void *
-bsearchleq(void *i,void *v1,size_t n,size_t s,int (*c)(const void *,const void *)) {
-
-  ufixnum nn=n>>1;
-  void *v=v1+nn*s;
-  int j=c(i,v);
-
-  if (nn)
-    return !j ? v : (j>0 ? bsearchleq(i,v,n-nn,s,c) : bsearchleq(i,v1,nn,s,c));
-  else
-    return j<=0 ? v : v+s;
-
-}
-		     
-
 static inline struct contblock ***
 find_cbppp(struct contblock *cbp) {
 
@@ -777,7 +823,7 @@ grow_linear1(struct typemanager *tm) {
 static inline int
 too_full_p(struct typemanager *tm) {
 
-  fixnum j,k,pf=tm->tm_percent_free ? tm->tm_percent_free : 30;
+  fixnum i,j,k,pf=tm->tm_percent_free ? tm->tm_percent_free : 30;
   struct contblock *cbp;
   struct pageinfo *pi;
 
@@ -787,11 +833,13 @@ too_full_p(struct typemanager *tm) {
     break;
   case t_contiguous:
     for (cbp=cb_pointer,k=0;cbp;cbp=cbp->cb_link) k+=cbp->cb_size;
-    for (pi=contblock_list_head,j=0;pi;pi=pi->next)
+    for (i=j=0;i<contblock_array->v.v_fillp;i++) {
+      pi=(void *)contblock_array->v.v_self[i];
 #ifdef SGC
       if (!sgc_enabled || pi->sgc_flags&SGC_PAGE_FLAG)
 #endif
 	j+=pi->in_use;
+    }
     return 100*k<pf*j*PAGESIZE;
     break;
   default:
@@ -833,8 +881,6 @@ alloc_after_gc(struct typemanager *tm,fi
 
 }
 
-struct pageinfo *contblock_list_head=NULL,*contblock_list_tail=NULL;
-
 inline void
 add_pages(struct typemanager *tm,fixnum m) {
 
@@ -890,7 +936,6 @@ alloc_after_adding_pages(struct typemana
 
   }
 
-  /* m=tm->tm_maxpage-tm->tm_npage; */
   add_pages(tm,m);
 
   return alloc_from_freelist(tm,n);
@@ -997,6 +1042,34 @@ alloc_contblock_no_gc(size_t n) {
 
 }
 
+#ifndef MAX_CODE_ADDRESS
+#define MAX_CODE_ADDRESS -1UL
+#endif
+
+void *
+alloc_code_space(size_t sz) {
+
+  void *v;
+
+  sz=CEI(sz,CPTR_SIZE);
+
+  if (sSAcode_block_reserveA &&
+      sSAcode_block_reserveA->s.s_dbind!=Cnil && sSAcode_block_reserveA->s.s_dbind->st.st_dim>=sz) {
+    
+    v=sSAcode_block_reserveA->s.s_dbind->st.st_self;
+    sSAcode_block_reserveA->s.s_dbind->st.st_self+=sz;
+    sSAcode_block_reserveA->s.s_dbind->st.st_dim-=sz;
+    sSAcode_block_reserveA->s.s_dbind->st.st_fillp=sSAcode_block_reserveA->s.s_dbind->st.st_dim;
+    
+  } else
+    v=alloc_contblock(sz);
+
+  massert(v && (unsigned long)(v+sz)<MAX_CODE_ADDRESS);
+
+  return v;
+
+}
+
 inline void *
 alloc_relblock(size_t n) {
 
@@ -1316,6 +1389,7 @@ gcl_init_alloc(void *cs_start) {
   
   
   ncbpage = 0;
+  tm_table[t_contiguous].tm_min_grow=256;
   set_tm_maxpage(tm_table+t_contiguous,1);
 #ifdef GCL_GPROF
   if (maxcbpage<textpage)
--- gcl-2.6.12.orig/o/array.c
+++ gcl-2.6.12/o/array.c
@@ -445,6 +445,11 @@ fSmake_vector1_1(fixnum n,fixnum elt_typ
   VFUN_NARGS=3;
   return FFN(fSmake_vector1)(make_fixnum(n),make_fixnum(elt_type),staticp);
 }
+object 
+fSmake_vector1_2(fixnum n,fixnum elt_type,object staticp,object fillp) {
+  VFUN_NARGS=4;
+  return FFN(fSmake_vector1)(make_fixnum(n),make_fixnum(elt_type),staticp,fillp);
+}
 
 
 static object DFLT_aet_object = Cnil;	
--- gcl-2.6.12.orig/o/gbc.c
+++ gcl-2.6.12/o/gbc.c
@@ -36,9 +36,6 @@
 
 #ifdef SGC
 static void
-sgc_contblock_sweep_phase(void);
-
-static void
 sgc_sweep_phase(void);
 
 static void
@@ -142,8 +139,6 @@ off_check(void *v,void *ve,fixnum i,stru
 }
 #endif
 
-void **contblock_stack_list=NULL;
-
 static inline bool
 pageinfo_p(void *v) {
 
@@ -163,28 +158,6 @@ in_contblock_stack_list(void *p,void ***
   return a && a[0]==p;
 }
 
-inline struct pageinfo *
-get_pageinfo(void *x) {
-
-  void *p=pageinfo(x),**a=contblock_stack_list;
-  struct pageinfo *v;
-
-  for (;!pageinfo_p(p) || in_contblock_stack_list(p,&a);p-=PAGESIZE);
-
-  v=p;
-  massert(v->type==t_contiguous && p+v->in_use*PAGESIZE>x);
-
-  return p;
-
-}
-  
-/* inline struct pageinfo * */
-/* get_pageinfo(void *x) { */
-/*   struct pageinfo *v=contblock_list_head;void *vv; */
-/*   for (;(vv=v) && (vv>=x || vv+v->in_use*PAGESIZE<=x);v=v->next); */
-/*   return v; */
-/* } */
-
 inline char
 get_bit(char *v,struct pageinfo *pi,void *x) {
   void *ve=CB_DATA_START(pi);
@@ -811,7 +784,7 @@ mark_stack_carefully(void *topv, void *b
   
   for (j=top ; j >= bottom ; j--) {
     
-    void *v=(void *)(*j),**a;
+    void *v=(void *)(*j);
     struct pageinfo *pi;
     
     if (!VALID_DATA_ADDRESS_P(v)) continue;
@@ -822,7 +795,7 @@ mark_stack_carefully(void *topv, void *b
     pi=pagetoinfo(p);
     if (!pageinfo_p(pi)) continue;
     
-    if ((a=contblock_stack_list) && in_contblock_stack_list(pi,&a)) continue;
+    if (get_pageinfo(pi)) continue;
 
     tm=tm_of(pi->type);
     if (tm->tm_type>=t_end) continue;
@@ -1067,14 +1040,24 @@ sweep_phase(void) {
 static void
 contblock_sweep_phase(void) {
 
+  struct pageinfo *v;
   STATIC char *s, *e, *p, *q;
-  STATIC struct pageinfo *v;
+  object o;
+  ufixnum i;
     
   reset_contblock_freelist();
-  
-  for (v=contblock_list_head;v;v=v->next) {
+
+  o=sSAleaf_collection_thresholdA->s.s_dbind;
+  sSAleaf_collection_thresholdA->s.s_dbind=make_fixnum(-1);
+
+  for (i=0;i<contblock_array->v.v_fillp && (v=(void *)contblock_array->v.v_self[i]);i++) {
+
     bool z;
 
+#ifdef SGC
+    if (sgc_enabled && !(v->sgc_flags&SGC_PAGE_FLAG)) continue;
+#endif
+    
     s=CB_DATA_START(v);
     e=(void *)v+v->in_use*PAGESIZE;
 
@@ -1090,14 +1073,9 @@ contblock_sweep_phase(void) {
     bzero(CB_MARK_START(v),CB_SGCF_START(v)-CB_MARK_START(v));
 
   }
-#ifdef DEBUG
-  if (debug) {
-    for (cbp = cb_pointer; cbp != NULL; cbp = cbp->cb_link)
-      printf("%lud-byte contblock\n", cbp->cb_size);
-    fflush(stdout);
-  }
-#endif
-  
+
+  sSAleaf_collection_thresholdA->s.s_dbind=o;
+
   sweep_link_array();
 
 }
@@ -1143,24 +1121,6 @@ GBC(enum type t) {
 
   ngc_thresh=fix(sSAleaf_collection_thresholdA->s.s_dbind);
 
-  { /*FIXME try to get this below the setjmp in mark_c_stack*/
-    struct pageinfo *v,*tv;
-    ufixnum i;
-    void *a;
-    
-    for (v=contblock_list_head,contblock_stack_list=NULL;v;v=v->next)
-      for (i=1;i<v->in_use;i++) {
-	tv=pagetoinfo(page(v)+i);
-	if (pageinfo_p(tv)) {
-	  a=contblock_stack_list;
-	  /* fprintf(stderr,"pushing %p\n",tv); */
-	  contblock_stack_list=alloca(2*sizeof(a));
-	  contblock_stack_list[0]=tv;
-	  contblock_stack_list[1]=a;
-	}
-      }
-  }
-  
   if (in_signal_handler && t == t_relocatable)
     error("cant gc relocatable in signal handler");
   
@@ -1312,12 +1272,7 @@ GBC(enum type t) {
     }
 #endif
     
-#ifdef SGC
-    if (sgc_enabled)
-      sgc_contblock_sweep_phase();
-    else
-#endif
-      contblock_sweep_phase();
+    contblock_sweep_phase();
 #ifdef DEBUG
     if (debug)
       printf("contblock sweep ended (%d)\n",
@@ -1574,7 +1529,7 @@ mark_contblock(void *p, int s) {
      sizeof(struct contblock).  CM 20030827 */
   x = (char *)PFLR(p,CPTR_SIZE);
   y = (char *)PCEI(q,CPTR_SIZE);
-  v=get_pageinfo(x);
+  massert(v=get_pageinfo(x));
 #ifdef SGC
   if (!sgc_enabled || (v->sgc_flags&SGC_PAGE_FLAG))
 #endif
@@ -1595,7 +1550,7 @@ DEFUN_NEW("CONTIGUOUS-REPORT",object,fSc
   }
   fprintf(stderr,"\nTotal free %lu in %lu pieces\n\n",i,j);
   
-  for (i=j=0,v=contblock_list_head;v;i+=v->in_use,j++,v=v->next) 
+  for (i=j=k=0;k<contblock_array->v.v_fillp && (v=(void *)contblock_array->v.v_self[k]);k++,i+=v->in_use,j++) 
     fprintf(stderr,"%lu pages at %p\n",(unsigned long)v->in_use,v);
   fprintf(stderr,"\nTotal pages %lu in %lu pieces\n\n",i,j);
   
--- gcl-2.6.12.orig/o/sfaslelf.c
+++ gcl-2.6.12/o/sfaslelf.c
@@ -242,32 +242,6 @@ relocate_symbols(Sym *sym,Sym *syme,Shdr
   
 }
 
-#ifndef MAX_CODE_ADDRESS
-#define MAX_CODE_ADDRESS -1UL
-#endif
-
-static void *
-alloc_memory(ul sz) {
-
-  void *v;
-
-  if (sSAcode_block_reserveA &&
-      sSAcode_block_reserveA->s.s_dbind!=Cnil && sSAcode_block_reserveA->s.s_dbind->st.st_dim>=sz) {
-    
-    v=sSAcode_block_reserveA->s.s_dbind->st.st_self;
-    sSAcode_block_reserveA->s.s_dbind->st.st_self+=sz;
-    sSAcode_block_reserveA->s.s_dbind->st.st_dim-=sz;
-    sSAcode_block_reserveA->s.s_dbind->st.st_fillp=sSAcode_block_reserveA->s.s_dbind->st.st_dim;
-    
-  } else
-    v=alloc_contblock(sz);
-
-  massert(v && (ul)(v+sz)<MAX_CODE_ADDRESS);
-
-  return v;
-
-}
-
 static object
 load_memory(Shdr *sec1,Shdr *sece,void *v1,ul **got,ul **gote) {
 
@@ -301,7 +275,7 @@ load_memory(Shdr *sec1,Shdr *sece,void *
   memory->cfd.cfd_size=sz;
   memory->cfd.cfd_self=0;
   memory->cfd.cfd_start=0;
-  memory->cfd.cfd_start=alloc_memory(sz);
+  memory->cfd.cfd_start=alloc_code_space(sz);
 
   a=(ul)memory->cfd.cfd_start;
   a=(a+ma)&~ma;
--- gcl-2.6.12.orig/o/sgbc.c
+++ gcl-2.6.12/o/sgbc.c
@@ -99,7 +99,7 @@ sgc_mark_phase(void) {
   
   /* mark all non recent data on writable contiguous pages */
   if (what_to_collect == t_contiguous)
-    for (v=contblock_list_head;v;v=v->next)
+    for (i=0;i<contblock_array->v.v_fillp && (v=(void *)contblock_array->v.v_self[i]);i++)
       if (v->sgc_flags&SGC_PAGE_FLAG) {
 	void *s=CB_DATA_START(v),*e=CB_DATA_END(v),*p,*q;
 	bool z=get_sgc_bit(v,s);
@@ -213,40 +213,6 @@ sgc_sweep_phase(void) {
   }
 }
 
-
-static void
-sgc_contblock_sweep_phase(void) {
-
-  STATIC char *s, *e, *p, *q;
-  STATIC struct pageinfo *v;
-    
-  reset_contblock_freelist();
-  
-  for (v=contblock_list_head;v;v=v->next) {
-    bool z;
-
-    if (!(v->sgc_flags&SGC_PAGE_FLAG)) continue;
-
-    s=CB_DATA_START(v);
-    e=CB_DATA_END(v);
-
-    z=get_mark_bit(v,s);
-    for (p=s;p<e;) {
-      q=get_mark_bits(v,p);
-      if (!z)
-	insert_contblock(p,q-p);
-      z=1-z;
-      p=q;
-    }
-
-    bzero(CB_MARK_START(v),CB_SGCF_START(v)-CB_MARK_START(v));
-
-  }
-
-  sweep_link_array();
-
-}
-
 #undef tm
 
 #ifdef SDEBUG
@@ -664,7 +630,7 @@ sgc_start(void) {
     
     tm=tm_of(t_contiguous);
 
-    for (pi=contblock_list_head;pi && count<WSGC(tm);pi=pi->next) {
+    for (i=0;i<contblock_array->v.v_fillp && (pi=(void *)contblock_array->v.v_self[i]) && count<WSGC(tm);i++) {
 
       p=CB_DATA_START(pi);
       pe=CB_DATA_END(pi);
@@ -685,7 +651,7 @@ sgc_start(void) {
       /* SGC cont pages: allocate more if necessary, dumping possible
 	 GBC freed pages onto the old contblock list.  CM 20030827*/
       unsigned long z=(i-count)+1;
-      void *old_contblock_list_tail=contblock_list_tail;
+      ufixnum fp=contblock_array->v.v_fillp;
 
       if (maxcbpage<ncbpage+z)
 	if (!set_tm_maxpage(tm_table+t_contiguous,ncbpage+z))
@@ -693,9 +659,9 @@ sgc_start(void) {
 
       add_pages(tm_table+t_contiguous,z);
 
-      massert(old_contblock_list_tail!=contblock_list_tail);
+      massert(fp!=contblock_array->v.v_fillp);
 
-      contblock_list_tail->sgc_flags=SGC_PAGE_FLAG;
+      ((struct pageinfo *)contblock_array->v.v_self[fp])->sgc_flags=SGC_PAGE_FLAG;
 
     }
 
@@ -743,17 +709,19 @@ sgc_start(void) {
   {
 
     struct pageinfo *pi;
-
+    ufixnum j;
+    
     {
 
       struct contblock **cbpp;
       void *p=NULL,*pe;
       struct pageinfo *pi;
+      ufixnum i;
       
       old_cb_pointer=cb_pointer;
       reset_contblock_freelist();
 
-      for (pi=contblock_list_head;pi;pi=pi->next) {
+      for (i=0;i<contblock_array->v.v_fillp && (pi=(void *)contblock_array->v.v_self[i]);i++) {
 	
 	if (pi->sgc_flags!=SGC_PAGE_FLAG) continue;
 	
@@ -786,7 +754,7 @@ sgc_start(void) {
       else
 	tm_of(pi->type)->tm_alt_npage++;
     }
-    for (pi=contblock_list_head;pi;pi=pi->next)/*FIXME*/
+    for (j=0;j<contblock_array->v.v_fillp && (pi=(void *)contblock_array->v.v_self[j]);j++)
       if (pi->sgc_flags&SGC_WRITABLE)
 	for (i=0;i<pi->in_use;i++)
 	  SET_WRITABLE(page(pi)+i);
@@ -932,7 +900,7 @@ sgc_quit(void) {
   	((object) p)->d.s=SGC_NORMAL;
 #endif
   
-  for (v=contblock_list_head;v;v=v->next) 
+  for (i=0;i<contblock_array->v.v_fillp &&(v=(void *)contblock_array->v.v_self[i]);i++)
     if (v->sgc_flags&SGC_PAGE_FLAG) 
       bzero(CB_SGCF_START(v),CB_DATA_START(v)-CB_SGCF_START(v));
   
@@ -940,7 +908,7 @@ sgc_quit(void) {
     struct pageinfo *pi;
     for (pi=cell_list_head;pi;pi=pi->next)
       pi->sgc_flags&=SGC_PERM_WRITABLE;
-    for (pi=contblock_list_head;pi;pi=pi->next)
+    for (i=0;i<contblock_array->v.v_fillp &&(pi=(void *)contblock_array->v.v_self[i]);i++)
       pi->sgc_flags&=SGC_PERM_WRITABLE;
   }