import gc6.1alpha5
This commit is contained in:
		
							
								
								
									
										48
									
								
								gc/reclaim.c
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								gc/reclaim.c
									
									
									
									
									
								
							@@ -631,47 +631,41 @@ COUNT_DECL
 | 
			
		||||
    ptr_t result = list;
 | 
			
		||||
 | 
			
		||||
    GC_ASSERT(GC_find_header((ptr_t)hbp) == hhdr);
 | 
			
		||||
    GC_remove_protection(hbp, 1, (hhdr)->hb_descr == 0 /* Pointer-free? */);
 | 
			
		||||
    if (init) {
 | 
			
		||||
      switch(sz) {
 | 
			
		||||
#      if !defined(SMALL_CONFIG) && !defined(USE_MARK_BYTES)
 | 
			
		||||
        case 1:
 | 
			
		||||
	    /* We now issue the hint even if GC_nearly_full returned	*/
 | 
			
		||||
	    /* DONT_KNOW.						*/
 | 
			
		||||
	    GC_write_hint(hbp);
 | 
			
		||||
            result = GC_reclaim1(hbp, hhdr, list COUNT_ARG);
 | 
			
		||||
            break;
 | 
			
		||||
        case 2:
 | 
			
		||||
	    GC_write_hint(hbp);
 | 
			
		||||
            result = GC_reclaim_clear2(hbp, hhdr, list COUNT_ARG);
 | 
			
		||||
            break;
 | 
			
		||||
        case 4:
 | 
			
		||||
	    GC_write_hint(hbp);
 | 
			
		||||
            result = GC_reclaim_clear4(hbp, hhdr, list COUNT_ARG);
 | 
			
		||||
            break;
 | 
			
		||||
#      endif /* !SMALL_CONFIG && !USE_MARK_BYTES */
 | 
			
		||||
        default:
 | 
			
		||||
	    GC_write_hint(hbp);
 | 
			
		||||
            result = GC_reclaim_clear(hbp, hhdr, sz, list COUNT_ARG);
 | 
			
		||||
            break;
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      GC_ASSERT((hhdr)->hb_descr == 0 /* Pointer-free block */);
 | 
			
		||||
      switch(sz) {
 | 
			
		||||
#      if !defined(SMALL_CONFIG) && !defined(USE_MARK_BYTES)
 | 
			
		||||
        case 1:
 | 
			
		||||
	    GC_write_hint(hbp);
 | 
			
		||||
            result = GC_reclaim1(hbp, hhdr, list COUNT_ARG);
 | 
			
		||||
            break;
 | 
			
		||||
        case 2:
 | 
			
		||||
	    GC_write_hint(hbp);
 | 
			
		||||
            result = GC_reclaim_uninit2(hbp, hhdr, list COUNT_ARG);
 | 
			
		||||
            break;
 | 
			
		||||
        case 4:
 | 
			
		||||
	    GC_write_hint(hbp);
 | 
			
		||||
            result = GC_reclaim_uninit4(hbp, hhdr, list COUNT_ARG);
 | 
			
		||||
            break;
 | 
			
		||||
#      endif /* !SMALL_CONFIG && !USE_MARK_BYTES */
 | 
			
		||||
        default:
 | 
			
		||||
	    GC_write_hint(hbp);
 | 
			
		||||
            result = GC_reclaim_uninit(hbp, hhdr, sz, list COUNT_ARG);
 | 
			
		||||
            break;
 | 
			
		||||
      }
 | 
			
		||||
@@ -867,6 +861,25 @@ void GC_print_block_list()
 | 
			
		||||
 | 
			
		||||
#endif /* NO_DEBUGGING */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Clear all obj_link pointers in the list of free objects *flp.
 | 
			
		||||
 * Clear *flp.
 | 
			
		||||
 * This must be done before dropping a list of free gcj-style objects,
 | 
			
		||||
 * since may otherwise end up with dangling "descriptor" pointers.
 | 
			
		||||
 * It may help for other pointer-containg objects.
 | 
			
		||||
 */
 | 
			
		||||
void GC_clear_fl_links(flp)
 | 
			
		||||
ptr_t *flp;
 | 
			
		||||
{
 | 
			
		||||
    ptr_t next = *flp;
 | 
			
		||||
 | 
			
		||||
    while (0 != next) {
 | 
			
		||||
       *flp = 0;
 | 
			
		||||
       flp = &(obj_link(next));
 | 
			
		||||
       next = *flp;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Perform GC_reclaim_block on the entire heap, after first clearing
 | 
			
		||||
 * small object free lists (if we are not just looking for leaks).
 | 
			
		||||
@@ -881,17 +894,24 @@ int report_if_found;		/* Abort if a GC_reclaimable object is found */
 | 
			
		||||
#   endif
 | 
			
		||||
    /* Clear reclaim- and free-lists */
 | 
			
		||||
      for (kind = 0; kind < GC_n_kinds; kind++) {
 | 
			
		||||
        register ptr_t *fop;
 | 
			
		||||
        register ptr_t *lim;
 | 
			
		||||
        register struct hblk ** rlp;
 | 
			
		||||
        register struct hblk ** rlim;
 | 
			
		||||
        register struct hblk ** rlist = GC_obj_kinds[kind].ok_reclaim_list;
 | 
			
		||||
        ptr_t *fop;
 | 
			
		||||
        ptr_t *lim;
 | 
			
		||||
        struct hblk ** rlp;
 | 
			
		||||
        struct hblk ** rlim;
 | 
			
		||||
        struct hblk ** rlist = GC_obj_kinds[kind].ok_reclaim_list;
 | 
			
		||||
	GC_bool should_clobber = (GC_obj_kinds[kind].ok_descriptor != 0);
 | 
			
		||||
        
 | 
			
		||||
        if (rlist == 0) continue;	/* This kind not used.	*/
 | 
			
		||||
        if (!report_if_found) {
 | 
			
		||||
            lim = &(GC_obj_kinds[kind].ok_freelist[MAXOBJSZ+1]);
 | 
			
		||||
	    for( fop = GC_obj_kinds[kind].ok_freelist; fop < lim; fop++ ) {
 | 
			
		||||
	      *fop = 0;
 | 
			
		||||
	      if (*fop != 0) {
 | 
			
		||||
		if (should_clobber) {
 | 
			
		||||
		  GC_clear_fl_links(fop);
 | 
			
		||||
		} else {
 | 
			
		||||
	          *fop = 0;
 | 
			
		||||
		}
 | 
			
		||||
	      }
 | 
			
		||||
	    }
 | 
			
		||||
	} /* otherwise free list objects are marked, 	*/
 | 
			
		||||
	  /* and its safe to leave them			*/
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user