Updates from 0.2.1 into 0.2.1-inu-1.5
This commit is contained in:
		
							
								
								
									
										128
									
								
								gc/new_hblk.c
									
									
									
									
									
								
							
							
						
						
									
										128
									
								
								gc/new_hblk.c
									
									
									
									
									
								
							| @@ -1,6 +1,7 @@ | ||||
| /* | ||||
|  * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers | ||||
|  * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved. | ||||
|  * Copyright (c) 2000 by Hewlett-Packard Company.  All rights reserved. | ||||
|  * | ||||
|  * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED | ||||
|  * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK. | ||||
| @@ -19,7 +20,7 @@ | ||||
|  | ||||
|  | ||||
| # include <stdio.h> | ||||
| # include "gc_priv.h" | ||||
| # include "private/gc_priv.h" | ||||
|  | ||||
| #ifndef SMALL_CONFIG | ||||
| /* | ||||
| @@ -30,7 +31,7 @@ ptr_t GC_build_fl1(h, ofl) | ||||
| struct hblk *h; | ||||
| ptr_t ofl; | ||||
| { | ||||
|     register word * p = (word *)h; | ||||
|     register word * p = h -> hb_body; | ||||
|     register word * lim = (word *)(h + 1); | ||||
|      | ||||
|     p[0] = (word)ofl; | ||||
| @@ -52,7 +53,7 @@ ptr_t GC_build_fl_clear2(h, ofl) | ||||
| struct hblk *h; | ||||
| ptr_t ofl; | ||||
| { | ||||
|     register word * p = (word *)h; | ||||
|     register word * p = h -> hb_body; | ||||
|     register word * lim = (word *)(h + 1); | ||||
|      | ||||
|     p[0] = (word)ofl; | ||||
| @@ -74,7 +75,7 @@ ptr_t GC_build_fl_clear3(h, ofl) | ||||
| struct hblk *h; | ||||
| ptr_t ofl; | ||||
| { | ||||
|     register word * p = (word *)h; | ||||
|     register word * p = h -> hb_body; | ||||
|     register word * lim = (word *)(h + 1) - 2; | ||||
|      | ||||
|     p[0] = (word)ofl; | ||||
| @@ -94,7 +95,7 @@ ptr_t GC_build_fl_clear4(h, ofl) | ||||
| struct hblk *h; | ||||
| ptr_t ofl; | ||||
| { | ||||
|     register word * p = (word *)h; | ||||
|     register word * p = h -> hb_body; | ||||
|     register word * lim = (word *)(h + 1); | ||||
|      | ||||
|     p[0] = (word)ofl; | ||||
| @@ -103,10 +104,10 @@ ptr_t ofl; | ||||
|     p[3] = 0; | ||||
|     p += 4; | ||||
|     for (; p < lim; p += 4) { | ||||
| 	PREFETCH_FOR_WRITE(p+64); | ||||
|         p[0] = (word)(p-4); | ||||
|         p[1] = 0; | ||||
|         p[2] = 0; | ||||
|         p[3] = 0; | ||||
| 	CLEAR_DOUBLE(p+2); | ||||
|     }; | ||||
|     return((ptr_t)(p-4)); | ||||
| } | ||||
| @@ -116,7 +117,7 @@ ptr_t GC_build_fl2(h, ofl) | ||||
| struct hblk *h; | ||||
| ptr_t ofl; | ||||
| { | ||||
|     register word * p = (word *)h; | ||||
|     register word * p = h -> hb_body; | ||||
|     register word * lim = (word *)(h + 1); | ||||
|      | ||||
|     p[0] = (word)ofl; | ||||
| @@ -134,13 +135,14 @@ ptr_t GC_build_fl4(h, ofl) | ||||
| struct hblk *h; | ||||
| ptr_t ofl; | ||||
| { | ||||
|     register word * p = (word *)h; | ||||
|     register word * p = h -> hb_body; | ||||
|     register word * lim = (word *)(h + 1); | ||||
|      | ||||
|     p[0] = (word)ofl; | ||||
|     p[4] = (word)p; | ||||
|     p += 8; | ||||
|     for (; p < lim; p += 8) { | ||||
| 	PREFETCH_FOR_WRITE(p+64); | ||||
|         p[0] = (word)(p-4); | ||||
|         p[4] = (word)p; | ||||
|     }; | ||||
| @@ -149,67 +151,51 @@ ptr_t ofl; | ||||
|  | ||||
| #endif /* !SMALL_CONFIG */ | ||||
|  | ||||
| /* | ||||
|  * Allocate a new heapblock for small objects of size n. | ||||
|  * Add all of the heapblock's objects to the free list for objects | ||||
|  * of that size. | ||||
|  * Set all mark bits if objects are uncollectable. | ||||
|  * Will fail to do anything if we are out of memory. | ||||
|  */ | ||||
| void GC_new_hblk(sz, kind) | ||||
| register word sz; | ||||
| int kind; | ||||
|  | ||||
| /* Build a free list for objects of size sz inside heap block h.	*/ | ||||
| /* Clear objects inside h if clear is set.  Add list to the end of	*/ | ||||
| /* the free list we build.  Return the new free list.			*/ | ||||
| /* This could be called without the main GC lock, if we ensure that	*/ | ||||
| /* there is no concurrent collection which might reclaim objects that	*/ | ||||
| /* we have not yet allocated.						*/ | ||||
| ptr_t GC_build_fl(h, sz, clear, list) | ||||
| struct hblk *h; | ||||
| word sz; | ||||
| GC_bool clear; | ||||
| ptr_t list; | ||||
| { | ||||
|     register word *p, | ||||
| 		  *prev; | ||||
|     word *last_object;		/* points to last object in new hblk	*/ | ||||
|     register struct hblk *h;	/* the new heap block			*/ | ||||
|     register GC_bool clear = GC_obj_kinds[kind].ok_init; | ||||
|  | ||||
| #   ifdef PRINTSTATS | ||||
| 	if ((sizeof (struct hblk)) > HBLKSIZE) { | ||||
| 	    ABORT("HBLK SZ inconsistency"); | ||||
|         } | ||||
| #   endif | ||||
|  | ||||
|   /* Allocate a new heap block */ | ||||
|     h = GC_allochblk(sz, kind, 0); | ||||
|     if (h == 0) return; | ||||
|  | ||||
|   /* Mark all objects if appropriate. */ | ||||
|       if (IS_UNCOLLECTABLE(kind)) GC_set_hdr_marks(HDR(h)); | ||||
|   word *p, *prev; | ||||
|   word *last_object;		/* points to last object in new hblk	*/ | ||||
|  | ||||
|   /* Do a few prefetches here, just because its cheap.  	*/ | ||||
|   /* If we were more serious about it, these should go inside	*/ | ||||
|   /* the loops.  But write prefetches usually don't seem to	*/ | ||||
|   /* matter much.						*/ | ||||
|     PREFETCH_FOR_WRITE((char *)h); | ||||
|     PREFETCH_FOR_WRITE((char *)h + 128); | ||||
|     PREFETCH_FOR_WRITE((char *)h + 256); | ||||
|     PREFETCH_FOR_WRITE((char *)h + 378); | ||||
|   /* Handle small objects sizes more efficiently.  For larger objects 	*/ | ||||
|   /* the difference is less significant.				*/ | ||||
| #  ifndef SMALL_CONFIG | ||||
|     switch (sz) { | ||||
|         case 1: GC_obj_kinds[kind].ok_freelist[1] = | ||||
|         	  GC_build_fl1(h, GC_obj_kinds[kind].ok_freelist[1]); | ||||
|         	return; | ||||
|         case 1: return GC_build_fl1(h, list); | ||||
|         case 2: if (clear) { | ||||
|          	    GC_obj_kinds[kind].ok_freelist[2] = | ||||
|         	      GC_build_fl_clear2(h, GC_obj_kinds[kind].ok_freelist[2]); | ||||
|         	    return GC_build_fl_clear2(h, list); | ||||
|         	} else { | ||||
|         	    GC_obj_kinds[kind].ok_freelist[2] = | ||||
|         	      GC_build_fl2(h, GC_obj_kinds[kind].ok_freelist[2]); | ||||
|         	    return GC_build_fl2(h, list); | ||||
|         	} | ||||
|         	return; | ||||
|         case 3: if (clear) { | ||||
|          	    GC_obj_kinds[kind].ok_freelist[3] = | ||||
|         	      GC_build_fl_clear3(h, GC_obj_kinds[kind].ok_freelist[3]); | ||||
|         	    return; | ||||
|          	    return GC_build_fl_clear3(h, list); | ||||
|         	} else { | ||||
|         	    /* It's messy to do better than the default here. */ | ||||
|         	    break; | ||||
|         	} | ||||
|         case 4: if (clear) { | ||||
|         	    GC_obj_kinds[kind].ok_freelist[4] = | ||||
|         	      GC_build_fl_clear4(h, GC_obj_kinds[kind].ok_freelist[4]); | ||||
|         	    return GC_build_fl_clear4(h, list); | ||||
|         	} else { | ||||
|         	    GC_obj_kinds[kind].ok_freelist[4] = | ||||
|         	      GC_build_fl4(h, GC_obj_kinds[kind].ok_freelist[4]); | ||||
|         	    return GC_build_fl4(h, list); | ||||
|         	} | ||||
|         	return; | ||||
|         default: | ||||
|         	break; | ||||
|     } | ||||
| @@ -238,7 +224,39 @@ int kind; | ||||
|    * put p (which is now head of list of objects in *h) as first | ||||
|    * pointer in the appropriate free list for this size. | ||||
|    */ | ||||
|       obj_link(h -> hb_body) = GC_obj_kinds[kind].ok_freelist[sz]; | ||||
|       GC_obj_kinds[kind].ok_freelist[sz] = ((ptr_t)p); | ||||
|       obj_link(h -> hb_body) = list; | ||||
|       return ((ptr_t)p); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Allocate a new heapblock for small objects of size n. | ||||
|  * Add all of the heapblock's objects to the free list for objects | ||||
|  * of that size. | ||||
|  * Set all mark bits if objects are uncollectable. | ||||
|  * Will fail to do anything if we are out of memory. | ||||
|  */ | ||||
| void GC_new_hblk(sz, kind) | ||||
| register word sz; | ||||
| int kind; | ||||
| { | ||||
|     register struct hblk *h;	/* the new heap block			*/ | ||||
|     register GC_bool clear = GC_obj_kinds[kind].ok_init; | ||||
|  | ||||
| #   ifdef PRINTSTATS | ||||
| 	if ((sizeof (struct hblk)) > HBLKSIZE) { | ||||
| 	    ABORT("HBLK SZ inconsistency"); | ||||
|         } | ||||
| #   endif | ||||
|  | ||||
|   /* Allocate a new heap block */ | ||||
|     h = GC_allochblk(sz, kind, 0); | ||||
|     if (h == 0) return; | ||||
|  | ||||
|   /* Mark all objects if appropriate. */ | ||||
|       if (IS_UNCOLLECTABLE(kind)) GC_set_hdr_marks(HDR(h)); | ||||
|  | ||||
|   /* Build the free list */ | ||||
|       GC_obj_kinds[kind].ok_freelist[sz] = | ||||
| 	GC_build_fl(h, sz, clear, GC_obj_kinds[kind].ok_freelist[sz]); | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user