aboutsummaryrefslogtreecommitdiffstats
path: root/gc/typd_mlc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gc/typd_mlc.c')
-rw-r--r--gc/typd_mlc.c108
1 files changed, 63 insertions, 45 deletions
diff --git a/gc/typd_mlc.c b/gc/typd_mlc.c
index 74f455d..0771700 100644
--- a/gc/typd_mlc.c
+++ b/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();
}