The following patch should fix 4.02's GC bug.  I'll put up fixed
distributions as soon as possible.

diff -c -c -r1.30 GC.c
*** GC.c        1999/02/11 17:40:26     1.30
--- GC.c        1999/02/15 14:21:50
***************
*** 1932,1941 ****
  scavenge_mutable_list(generation *gen)
  {
    StgInfoTable *info;
!   StgMutClosure *p, *next, *new_list;
  
    p = gen->saved_mut_list;
-   new_list = gen->mut_list;
    next = p->mut_link;
  
    evac_gen = 0;
--- 1932,1940 ----
  scavenge_mutable_list(generation *gen)
  {
    StgInfoTable *info;
!   StgMutClosure *p, *next;
  
    p = gen->saved_mut_list;
    next = p->mut_link;
  
    evac_gen = 0;
***************
*** 1966,1981 ****
  
        if (failed_to_evac) {
          failed_to_evac = rtsFalse;
!         p->mut_link = new_list;
!         new_list = p;
        } 
        continue;
        }
  
      case MUT_ARR_PTRS:
        /* follow everything */
!       p->mut_link = new_list;
!       new_list = p;
        {
        StgPtr end, q;
        
--- 1965,1980 ----
  
        if (failed_to_evac) {
          failed_to_evac = rtsFalse;
!         p->mut_link = gen->mut_list;
!         gen->mut_list = p;
        } 
        continue;
        }
  
      case MUT_ARR_PTRS:
        /* follow everything */
!       p->mut_link = gen->mut_list;
!       gen->mut_list = p;
        {
        StgPtr end, q;
        
***************
*** 1993,2000 ****
         */
        ASSERT(p->header.info != &MUT_CONS_info);
        ((StgMutVar *)p)->var = evacuate(((StgMutVar *)p)->var);
!       p->mut_link = new_list;
!       new_list = p;
        continue;
        
      case MVAR:
--- 1992,1999 ----
         */
        ASSERT(p->header.info != &MUT_CONS_info);
        ((StgMutVar *)p)->var = evacuate(((StgMutVar *)p)->var);
!       p->mut_link = gen->mut_list;
!       gen->mut_list = p;
        continue;
        
      case MVAR:
***************
*** 2003,2010 ****
        (StgClosure *)mvar->head = evacuate((StgClosure *)mvar->head);
        (StgClosure *)mvar->tail = evacuate((StgClosure *)mvar->tail);
        (StgClosure *)mvar->value = evacuate((StgClosure *)mvar->value);
!       p->mut_link = new_list;
!       new_list = p;
        continue;
        }
  
--- 2002,2009 ----
        (StgClosure *)mvar->head = evacuate((StgClosure *)mvar->head);
        (StgClosure *)mvar->tail = evacuate((StgClosure *)mvar->tail);
        (StgClosure *)mvar->value = evacuate((StgClosure *)mvar->value);
!       p->mut_link = gen->mut_list;
!       gen->mut_list = p;
        continue;
        }
  
***************
*** 2027,2034 ****
         * point to some younger objects (because we set evac_gen to 0
         * above). 
         */
!       tso->mut_link = new_list;
!       new_list = (StgMutClosure *)tso;
        continue;
        }
        
--- 2026,2033 ----
         * point to some younger objects (because we set evac_gen to 0
         * above). 
         */
!       tso->mut_link = gen->mut_list;
!       gen->mut_list = (StgMutClosure *)tso;
        continue;
        }
        
***************
*** 2037,2044 ****
        StgBlockingQueue *bh = (StgBlockingQueue *)p;
        (StgClosure *)bh->blocking_queue = 
          evacuate((StgClosure *)bh->blocking_queue);
!       p->mut_link = new_list;
!       new_list = p;
        continue;
        }
  
--- 2036,2043 ----
        StgBlockingQueue *bh = (StgBlockingQueue *)p;
        (StgClosure *)bh->blocking_queue = 
          evacuate((StgClosure *)bh->blocking_queue);
!       p->mut_link = gen->mut_list;
!       gen->mut_list = p;
        continue;
        }
  
***************
*** 2047,2054 ****
        barf("scavenge_mut_list: strange object?");
      }
    }
- 
-   gen->mut_list = new_list;
  }
  
  static void
--- 2046,2051 ----

Reply via email to