Updates from 0.2.1 into 0.2.1-inu-1.5
This commit is contained in:
		
							
								
								
									
										108
									
								
								gc/typd_mlc.c
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								gc/typd_mlc.c
									
									
									
									
									
								
							| @@ -1,5 +1,6 @@ | ||||
| /* | ||||
|  * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved. | ||||
|  * opyright (c) 1999-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. | ||||
| @@ -11,7 +12,6 @@ | ||||
|  * modified is included with the above copyright notice. | ||||
|  * | ||||
|  */ | ||||
| /* Boehm, July 31, 1995 5:02 pm PDT */ | ||||
|  | ||||
|  | ||||
| /* | ||||
| @@ -36,15 +36,10 @@ | ||||
|  * since they are not accessible through the current interface. | ||||
|  */ | ||||
|  | ||||
| #include "gc_priv.h" | ||||
| #include "gc_mark.h" | ||||
| #include "private/gc_pmark.h" | ||||
| #include "gc_typed.h" | ||||
|  | ||||
| # ifdef ADD_BYTE_AT_END | ||||
| #   define EXTRA_BYTES (sizeof(word) - 1) | ||||
| # else | ||||
| #   define EXTRA_BYTES (sizeof(word)) | ||||
| # endif | ||||
| # define TYPD_EXTRA_BYTES (sizeof(word) - EXTRA_BYTES) | ||||
|  | ||||
| GC_bool GC_explicit_typing_initialized = FALSE; | ||||
|  | ||||
| @@ -170,15 +165,15 @@ GC_descr GC_bm_table[WORDSZ/2]; | ||||
| /* each of which is described by descriptor.				*/ | ||||
| /* The result is known to be short enough to fit into a bitmap		*/ | ||||
| /* descriptor.								*/ | ||||
| /* Descriptor is a DS_LENGTH or DS_BITMAP descriptor.			*/ | ||||
| /* Descriptor is a GC_DS_LENGTH or GC_DS_BITMAP descriptor.		*/ | ||||
| GC_descr GC_double_descr(descriptor, nwords) | ||||
| register GC_descr descriptor; | ||||
| register word nwords; | ||||
| { | ||||
|     if (descriptor && DS_TAGS == DS_LENGTH) { | ||||
|     if ((descriptor & GC_DS_TAGS) == GC_DS_LENGTH) { | ||||
|         descriptor = GC_bm_table[BYTES_TO_WORDS((word)descriptor)]; | ||||
|     }; | ||||
|     descriptor |= (descriptor & ~DS_TAGS) >> nwords; | ||||
|     descriptor |= (descriptor & ~GC_DS_TAGS) >> nwords; | ||||
|     return(descriptor); | ||||
| } | ||||
|  | ||||
| @@ -196,7 +191,7 @@ complex_descriptor * GC_make_sequence_descriptor(); | ||||
| /* is returned in *simple_d.					*/ | ||||
| /* If the result is NO_MEM, then				*/ | ||||
| /* we failed to allocate the descriptor.			*/ | ||||
| /* The implementation knows that DS_LENGTH is 0.		*/ | ||||
| /* The implementation knows that GC_DS_LENGTH is 0.		*/ | ||||
| /* *leaf, *complex_d, and *simple_d may be used as temporaries	*/ | ||||
| /* during the construction.					*/ | ||||
| # define COMPLEX 2 | ||||
| @@ -216,7 +211,7 @@ struct LeafDescriptor * leaf; | ||||
| 	/* For larger arrays, we try to combine descriptors of adjacent	*/ | ||||
| 	/* descriptors to speed up marking, and to reduce the amount	*/ | ||||
| 	/* of space needed on the mark stack.				*/ | ||||
|     if ((descriptor & DS_TAGS) == DS_LENGTH) { | ||||
|     if ((descriptor & GC_DS_TAGS) == GC_DS_LENGTH) { | ||||
|       if ((word)descriptor == size) { | ||||
|     	*simple_d = nelements * descriptor; | ||||
|     	return(SIMPLE); | ||||
| @@ -236,7 +231,7 @@ struct LeafDescriptor * leaf; | ||||
|         } | ||||
|       } | ||||
|     } else if (size <= BITMAP_BITS/2 | ||||
|     	       && (descriptor & DS_TAGS) != DS_PROC | ||||
|     	       && (descriptor & GC_DS_TAGS) != GC_DS_PROC | ||||
|     	       && (size & (sizeof(word)-1)) == 0) { | ||||
|       int result =       | ||||
|           GC_make_array_descriptor(nelements/2, 2*size, | ||||
| @@ -343,9 +338,15 @@ ptr_t * GC_eobjfreelist; | ||||
|  | ||||
| ptr_t * GC_arobjfreelist; | ||||
|  | ||||
| mse * GC_typed_mark_proc(); | ||||
| mse * GC_typed_mark_proc GC_PROTO((register word * addr, | ||||
| 				   register mse * mark_stack_ptr, | ||||
| 				   mse * mark_stack_limit, | ||||
| 				   word env)); | ||||
|  | ||||
| mse * GC_array_mark_proc(); | ||||
| mse * GC_array_mark_proc GC_PROTO((register word * addr, | ||||
| 				   register mse * mark_stack_ptr, | ||||
| 				   mse * mark_stack_limit, | ||||
| 				   word env)); | ||||
|  | ||||
| GC_descr GC_generic_array_descr; | ||||
|  | ||||
| @@ -370,14 +371,14 @@ void GC_init_explicit_typing() | ||||
|     GC_explicit_typing_initialized = TRUE; | ||||
|     /* Set up object kind with simple indirect descriptor. */ | ||||
|       GC_eobjfreelist = (ptr_t *) | ||||
|           GC_generic_malloc_inner((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE); | ||||
|           GC_INTERNAL_MALLOC((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE); | ||||
|       if (GC_eobjfreelist == 0) ABORT("Couldn't allocate GC_eobjfreelist"); | ||||
|       BZERO(GC_eobjfreelist, (MAXOBJSZ+1)*sizeof(ptr_t)); | ||||
|       GC_explicit_kind = GC_n_kinds++; | ||||
|       GC_obj_kinds[GC_explicit_kind].ok_freelist = GC_eobjfreelist; | ||||
|       GC_obj_kinds[GC_explicit_kind].ok_reclaim_list = 0; | ||||
|       GC_obj_kinds[GC_explicit_kind].ok_descriptor = | ||||
|     		(((word)WORDS_TO_BYTES(-1)) | DS_PER_OBJECT); | ||||
|     		(((word)WORDS_TO_BYTES(-1)) | GC_DS_PER_OBJECT); | ||||
|       GC_obj_kinds[GC_explicit_kind].ok_relocate_descr = TRUE; | ||||
|       GC_obj_kinds[GC_explicit_kind].ok_init = TRUE; | ||||
|     		/* Descriptors are in the last word of the object. */ | ||||
| @@ -387,7 +388,7 @@ void GC_init_explicit_typing() | ||||
|         /* Moving this up breaks DEC AXP compiler.      */ | ||||
|     /* Set up object kind with array descriptor. */ | ||||
|       GC_arobjfreelist = (ptr_t *) | ||||
|           GC_generic_malloc_inner((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE); | ||||
|           GC_INTERNAL_MALLOC((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE); | ||||
|       if (GC_arobjfreelist == 0) ABORT("Couldn't allocate GC_arobjfreelist"); | ||||
|       BZERO(GC_arobjfreelist, (MAXOBJSZ+1)*sizeof(ptr_t)); | ||||
|       if (GC_n_mark_procs >= MAX_MARK_PROCS) | ||||
| @@ -399,26 +400,33 @@ void GC_init_explicit_typing() | ||||
|       GC_obj_kinds[GC_array_kind].ok_freelist = GC_arobjfreelist; | ||||
|       GC_obj_kinds[GC_array_kind].ok_reclaim_list = 0; | ||||
|       GC_obj_kinds[GC_array_kind].ok_descriptor = | ||||
|     		MAKE_PROC(GC_array_mark_proc_index, 0);; | ||||
|     		GC_MAKE_PROC(GC_array_mark_proc_index, 0);; | ||||
|       GC_obj_kinds[GC_array_kind].ok_relocate_descr = FALSE; | ||||
|       GC_obj_kinds[GC_array_kind].ok_init = TRUE; | ||||
|     		/* Descriptors are in the last word of the object. */ | ||||
|             GC_mark_procs[GC_array_mark_proc_index] = GC_array_mark_proc; | ||||
|       for (i = 0; i < WORDSZ/2; i++) { | ||||
|           GC_descr d = (((word)(-1)) >> (WORDSZ - i)) << (WORDSZ - i); | ||||
|           d |= DS_BITMAP; | ||||
|           d |= GC_DS_BITMAP; | ||||
|           GC_bm_table[i] = d; | ||||
|       } | ||||
|       GC_generic_array_descr = MAKE_PROC(GC_array_mark_proc_index, 0);  | ||||
|       GC_generic_array_descr = GC_MAKE_PROC(GC_array_mark_proc_index, 0);  | ||||
|     UNLOCK(); | ||||
|     ENABLE_SIGNALS(); | ||||
| } | ||||
|  | ||||
| mse * GC_typed_mark_proc(addr, mark_stack_ptr, mark_stack_limit, env) | ||||
| register word * addr; | ||||
| register mse * mark_stack_ptr; | ||||
| mse * mark_stack_limit; | ||||
| word env; | ||||
| # if defined(__STDC__) || defined(__cplusplus) | ||||
|     mse * GC_typed_mark_proc(register word * addr, | ||||
| 			     register mse * mark_stack_ptr, | ||||
| 			     mse * mark_stack_limit, | ||||
| 			     word env) | ||||
| # else | ||||
|     mse * GC_typed_mark_proc(addr, mark_stack_ptr, mark_stack_limit, env) | ||||
|     register word * addr; | ||||
|     register mse * mark_stack_ptr; | ||||
|     mse * mark_stack_limit; | ||||
|     word env; | ||||
| # endif | ||||
| { | ||||
|     register word bm = GC_ext_descriptors[env].ed_bitmap; | ||||
|     register word * current_p = addr; | ||||
| @@ -430,7 +438,7 @@ word env; | ||||
|     	if (bm & 1) { | ||||
|     	    current = *current_p; | ||||
|     	    if ((ptr_t)current >= least_ha && (ptr_t)current <= greatest_ha) { | ||||
|     	        PUSH_CONTENTS(current, mark_stack_ptr, | ||||
|     	        PUSH_CONTENTS((ptr_t)current, mark_stack_ptr, | ||||
| 			      mark_stack_limit, current_p, exit1); | ||||
|     	    } | ||||
|     	} | ||||
| @@ -446,7 +454,7 @@ word env; | ||||
|         } | ||||
|         mark_stack_ptr -> mse_start = addr + WORDSZ; | ||||
|         mark_stack_ptr -> mse_descr = | ||||
|         	MAKE_PROC(GC_typed_mark_proc_index, env+1); | ||||
|         	GC_MAKE_PROC(GC_typed_mark_proc_index, env+1); | ||||
|     } | ||||
|     return(mark_stack_ptr); | ||||
| } | ||||
| @@ -533,11 +541,18 @@ mse * msl; | ||||
| } | ||||
|  | ||||
| /*ARGSUSED*/ | ||||
| mse * GC_array_mark_proc(addr, mark_stack_ptr, mark_stack_limit, env) | ||||
| register word * addr; | ||||
| register mse * mark_stack_ptr; | ||||
| mse * mark_stack_limit; | ||||
| word env; | ||||
| # if defined(__STDC__) || defined(__cplusplus) | ||||
|     mse * GC_array_mark_proc(register word * addr, | ||||
| 			     register mse * mark_stack_ptr, | ||||
| 			     mse * mark_stack_limit, | ||||
| 			     word env) | ||||
| # else | ||||
|     mse * GC_array_mark_proc(addr, mark_stack_ptr, mark_stack_limit, env) | ||||
|     register word * addr; | ||||
|     register mse * mark_stack_ptr; | ||||
|     mse * mark_stack_limit; | ||||
|     word env; | ||||
| # endif | ||||
| { | ||||
|     register hdr * hhdr = HDR(addr); | ||||
|     register word sz = hhdr -> hb_sz; | ||||
| @@ -563,12 +578,12 @@ word env; | ||||
|     	GC_mark_stack_too_small = TRUE; | ||||
|     	new_mark_stack_ptr = orig_mark_stack_ptr + 1; | ||||
|     	new_mark_stack_ptr -> mse_start = addr; | ||||
|     	new_mark_stack_ptr -> mse_descr = WORDS_TO_BYTES(sz) | DS_LENGTH; | ||||
|     	new_mark_stack_ptr -> mse_descr = WORDS_TO_BYTES(sz) | GC_DS_LENGTH; | ||||
|     } else { | ||||
|         /* Push descriptor itself */ | ||||
|         new_mark_stack_ptr++; | ||||
|         new_mark_stack_ptr -> mse_start = addr + sz - 1; | ||||
|         new_mark_stack_ptr -> mse_descr = sizeof(word) | DS_LENGTH; | ||||
|         new_mark_stack_ptr -> mse_descr = sizeof(word) | GC_DS_LENGTH; | ||||
|     } | ||||
|     return(new_mark_stack_ptr); | ||||
| } | ||||
| @@ -600,7 +615,7 @@ word env; | ||||
|       } | ||||
|       if (all_bits_set) { | ||||
|     	/* An initial section contains all pointers.  Use length descriptor. */ | ||||
|         return(WORDS_TO_BYTES(last_set_bit+1) | DS_LENGTH); | ||||
|         return(WORDS_TO_BYTES(last_set_bit+1) | GC_DS_LENGTH); | ||||
|       } | ||||
|     } | ||||
| #   endif | ||||
| @@ -612,16 +627,16 @@ word env; | ||||
|     	    result >>= 1; | ||||
|     	    if (GC_get_bit(bm, i)) result |= HIGH_BIT; | ||||
|     	} | ||||
|     	result |= DS_BITMAP; | ||||
|     	result |= GC_DS_BITMAP; | ||||
|     	return(result); | ||||
|     } else { | ||||
|     	signed_word index; | ||||
|     	 | ||||
|     	index = GC_add_ext_descriptor(bm, (word)last_set_bit+1); | ||||
|     	if (index == -1) return(WORDS_TO_BYTES(last_set_bit+1) | DS_LENGTH); | ||||
|     	if (index == -1) return(WORDS_TO_BYTES(last_set_bit+1) | GC_DS_LENGTH); | ||||
|     				/* Out of memory: use conservative	*/ | ||||
|     				/* approximation.			*/ | ||||
|     	result = MAKE_PROC(GC_typed_mark_proc_index, (word)index); | ||||
|     	result = GC_MAKE_PROC(GC_typed_mark_proc_index, (word)index); | ||||
|     	return(result); | ||||
|     } | ||||
| } | ||||
| @@ -647,7 +662,7 @@ register ptr_t * opp; | ||||
| register word lw; | ||||
| DCL_LOCK_STATE; | ||||
|  | ||||
|     lb += EXTRA_BYTES; | ||||
|     lb += TYPD_EXTRA_BYTES; | ||||
|     if( SMALL_OBJ(lb) ) { | ||||
| #       ifdef MERGE_SIZES | ||||
| 	  lw = GC_size_map[lb]; | ||||
| @@ -665,6 +680,7 @@ DCL_LOCK_STATE; | ||||
| #	    endif | ||||
|         } else { | ||||
|             *opp = obj_link(op); | ||||
| 	    obj_link(op) = 0; | ||||
|             GC_words_allocd += lw; | ||||
|             FASTUNLOCK(); | ||||
|         } | ||||
| @@ -691,7 +707,7 @@ register ptr_t * opp; | ||||
| register word lw; | ||||
| DCL_LOCK_STATE; | ||||
|  | ||||
|     lb += EXTRA_BYTES; | ||||
|     lb += TYPD_EXTRA_BYTES; | ||||
|     if( SMALL_OBJ(lb) ) { | ||||
| #       ifdef MERGE_SIZES | ||||
| 	  lw = GC_size_map[lb]; | ||||
| @@ -708,6 +724,7 @@ DCL_LOCK_STATE; | ||||
| #	    endif | ||||
|         } else { | ||||
|             *opp = obj_link(op); | ||||
| 	    obj_link(op) = 0; | ||||
|             GC_words_allocd += lw; | ||||
|             FASTUNLOCK(); | ||||
|         } | ||||
| @@ -717,7 +734,7 @@ DCL_LOCK_STATE; | ||||
|        lw = BYTES_TO_WORDS(GC_size(op)); | ||||
|    } | ||||
|    if (op != NULL) | ||||
|    ((word *)op)[lw - 1] = d; | ||||
|        ((word *)op)[lw - 1] = d; | ||||
|    return((GC_PTR) op); | ||||
| } | ||||
|  | ||||
| @@ -748,11 +765,11 @@ DCL_LOCK_STATE; | ||||
|     	case SIMPLE: return(GC_malloc_explicitly_typed(n*lb, simple_descr)); | ||||
|     	case LEAF: | ||||
|     	    lb *= n; | ||||
|     	    lb += sizeof(struct LeafDescriptor) + EXTRA_BYTES; | ||||
|     	    lb += sizeof(struct LeafDescriptor) + TYPD_EXTRA_BYTES; | ||||
|     	    break; | ||||
|     	case COMPLEX: | ||||
|     	    lb *= n; | ||||
|     	    lb += EXTRA_BYTES; | ||||
|     	    lb += TYPD_EXTRA_BYTES; | ||||
|     	    break; | ||||
|     } | ||||
|     if( SMALL_OBJ(lb) ) { | ||||
| @@ -772,6 +789,7 @@ DCL_LOCK_STATE; | ||||
| #	    endif | ||||
|         } else { | ||||
|             *opp = obj_link(op); | ||||
| 	    obj_link(op) = 0; | ||||
|             GC_words_allocd += lw; | ||||
|             FASTUNLOCK(); | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user