This is the mail archive of the guile@cygnus.com mailing list for the guile project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Another new gc



The following small patch to guardians.c will help if applied together
with Greg's patch, as Greg's patch breaks guardians.

My fault, actually - there weren't any convenient SCM_SETGCMARK calls
to grep for in there, I just OR'ed with 1.

BTW, folks, you probably want to watch out for SCM_SETOR_CDR calls -
guess what they are handy for ;).

thanks,
mike.

*** libguile/guardians.c.old	Mon Jan  4 21:44:51 1999
--- libguile/guardians.c	Mon Jan  4 21:42:37 1999
***************
*** 223,230 ****
  	      if (SCM_FALSEP (prev_pair))
  		GUARDIAN_LIVE (g).head = next_pair;
  	      else
!                 /* mark previous pair */
! 		SCM_SETCDR (prev_pair, next_pair | 1);
  
  	      /* to the zombie list! */
  	      TCONC_IN (GUARDIAN_ZOMBIES (g), SCM_CAR (pair), pair);
--- 223,229 ----
  	      if (SCM_FALSEP (prev_pair))
  		GUARDIAN_LIVE (g).head = next_pair;
  	      else
! 		SCM_SETCDR (prev_pair, next_pair);
  
  	      /* to the zombie list! */
  	      TCONC_IN (GUARDIAN_ZOMBIES (g), SCM_CAR (pair), pair);
***************
*** 232,249 ****
  	  else
  	    {
  	      if (SCM_NFALSEP (prev_pair))
!                 /* mark previous pair */
! 		SCM_SETCDR (prev_pair, pair | 1);
  	      prev_pair = pair;
  	    }
  
  	  pair = next_pair;
  	}
        if (SCM_NFALSEP (prev_pair))
! 	/* mark previous pair */
! 	SCM_SETCDR (prev_pair, pair | 1);
        /* mark live list tail */
!       SCM_SETOR_CDR (tconc_tail, 1);
        
        scm_gc_mark (GUARDIAN_ZOMBIES (g).head);
      }
--- 231,249 ----
  	  else
  	    {
  	      if (SCM_NFALSEP (prev_pair))
!                 SCM_SETCDR (prev_pair, pair);
! 
!               SCM_SETGCMARK (pair);
  	      prev_pair = pair;
  	    }
  
  	  pair = next_pair;
  	}
        if (SCM_NFALSEP (prev_pair))
! 	SCM_SETCDR (prev_pair, pair);
! 
        /* mark live list tail */
!       SCM_SETGCMARK (tconc_tail);
  
        scm_gc_mark (GUARDIAN_ZOMBIES (g).head);
      }