Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Contact: cacao@cacaojvm.org
-
- Authors: Michael Starzinger
-
- $Id$
-
*/
#define GC_THREAD(ref, refptr, start, end) \
if (POINTS_INTO(ref, start, end)) { \
GC_ASSERT(GC_IS_MARKED(ref)); \
- *refptr = (java_objectheader *) ref->vftbl; \
+ *refptr = (java_object_t *) ref->vftbl; \
ref->vftbl = (struct _vftbl *) GC_SET_THREAD_BIT(refptr); \
}
*******************************************************************************/
-void compact_thread_rootset(rootset_t *rs, void *start, void *end)
+static void compact_thread_rootset(rootset_t *rs, void *start, void *end)
{
- java_objectheader *ref;
- java_objectheader **refptr;
+ java_object_t *ref;
+ java_object_t **refptr;
int i;
GC_LOG2( printf("threading in rootsets\n"); );
for (i = 0; i < rs->refcount; i++) {
/* load the reference */
- refptr = rs->refs[i];
+ refptr = rs->refs[i].ref;
ref = *( refptr );
GC_LOG2( printf("\troot pointer to %p\n", (void *) ref); );
}
-/* compact_thread_classes ******************************************************
-
- Threads all the references from classinfo structures (static fields)
-
- IN:
- start.....Region to be compacted start here
- end.......Region to be compacted ends here
-
-*******************************************************************************/
-
-void compact_thread_classes(void *start, void *end)
-{
- java_objectheader *ref;
- java_objectheader **refptr;
- classinfo *c;
- fieldinfo *f;
- /*hashtable_classloader_entry *cle;*/
- void *sys_start, *sys_end;
- int i;
-
- GC_LOG2( printf("threading in classes\n"); );
-
- /* TODO: cleanup!!! */
- sys_start = heap_region_sys->base;
- sys_end = heap_region_sys->ptr;
-
-#if 0
- /* walk through all classloaders */
- for (i = 0; i < hashtable_classloader->size; i++) {
- cle = hashtable_classloader->ptr[i];
-
- while (cle) {
-
- /* thread the classloader */
- refptr = &( cle->object );
- ref = *( refptr );
- GC_LOG2( printf("\tclassloader from hashtable at %p\n", (void *) ref); );
- GC_THREAD(ref, refptr, start, end);
-
- cle = cle->hashlink;
- }
- }
-#endif
-
- /* walk through all classinfo blocks */
- for (c = sys_start; c < (classinfo *) sys_end; c++) {
-
- /* thread the classloader */
- /*refptr = &( c->classloader );
- ref = *( refptr );
- GC_LOG2( printf("\tclassloader from classinfo at %p\n", (void *) ref); );
- GC_THREAD(ref, refptr, start, end);*/
-
- /* walk through all fields */
- f = c->fields;
- for (i = 0; i < c->fieldscount; i++, f++) {
-
- /* check if this is a static reference */
- if (!IS_ADR_TYPE(f->type) || !(f->flags & ACC_STATIC))
- continue;
-
- /* load the reference */
- refptr = (java_objectheader **) &(f->value);
- ref = *( refptr );
-
- GC_LOG2( printf("\tclass-field points to %p\n", (void *) ref); );
- /*GC_LOG2(
- printf("\tfield: "); field_print(f); printf("\n");
- printf("\tclass-field points to ");
- if (ref == NULL) {
- printf("(NULL)\n");
- } else if (GC_IS_THREADED(ref->vftbl)) {
- printf("(threaded)\n");
- } else {
- heap_print_object(ref); printf("\n");
- }
- );*/
-
- /* thread the reference */
- GC_THREAD(ref, refptr, start, end);
-
- }
-
- }
-
-}
-
-
/* compact_thread_references ***************************************************
Threads all the references of an object.
*******************************************************************************/
-void compact_thread_references(java_objectheader *o, void *start, void *end)
+static void compact_thread_references(java_object_t *o, void *start, void *end)
{
- java_objectheader *ref;
- java_objectheader **refptr;
+ java_object_t *ref;
+ java_object_t **refptr;
GC_LOG2( printf("threading in ");
heap_print_object(o); printf("\n"); );
*******************************************************************************/
-void compact_unthread_references(java_objectheader *o, void *new)
+static void compact_unthread_references(java_object_t *o, void *new)
{
- java_objectheader **refptr;
+ java_object_t **refptr;
ptrint tmp;
GC_LOG2( printf("unthreading in ...\n"); );
GC_ASSERT(GC_IS_THREADED(o->vftbl));
/* walk down the threaded chain */
- refptr = (java_objectheader **) (ptrint) o->vftbl;
+ refptr = (java_object_t **) (ptrint) o->vftbl;
while (GC_IS_THREADED(refptr)) {
/* remove the threading bit */
- refptr = (java_objectheader **) GC_REMOVE_THREAD_BIT(refptr);
+ refptr = (java_object_t **) GC_REMOVE_THREAD_BIT(refptr);
GC_LOG2( printf("\treference at %p\n", (void *) refptr); );
/* update the reference in the chain */
tmp = (ptrint) *refptr;
- *refptr = (java_objectheader *) (ptrint) new;
+ *refptr = (java_object_t *) (ptrint) new;
/* skip to the next chain value */
- refptr = (java_objectheader **) tmp;
+ refptr = (java_object_t **) tmp;
}
*******************************************************************************/
-u4 compact_move(u1 *old, u1 *new, u4 size)
+static u4 compact_move(u1 *old, u1 *new, u4 size)
{
s4 hashcode;
u4 new_size;
/* copy old object content to new location */
MCOPY(new, old, u1, size);
-#if !defined(NDEBUG)
+#if defined(ENABLE_MEMCHECK)
/* invalidate old object */
MSET(old, MEMORY_CLEAR_BYTE, u1, size);
#endif
new_size = size;
/* check if we need to attach the hashcode to the object */
- if (GC_TEST_FLAGS((java_objectheader *) new, HDRFLAG_HASH_TAKEN)) {
+ if (GC_TEST_FLAGS((java_object_t *) new, HDRFLAG_HASH_TAKEN)) {
/* TODO: move this whole bunch to heap_attach_hashcode() */
/* change the flags accordingly */
- GC_CLEAR_FLAGS((java_objectheader *) new, HDRFLAG_HASH_TAKEN);
- GC_SET_FLAGS((java_objectheader *) new, HDRFLAG_HASH_ATTACHED);
+ GC_CLEAR_FLAGS((java_object_t *) new, HDRFLAG_HASH_TAKEN);
+ GC_SET_FLAGS((java_object_t *) new, HDRFLAG_HASH_ATTACHED);
/* attach the hashcode at the end of the object */
new_size += SIZEOF_VOID_P;
{
u1 *ptr;
u1 *ptr_new;
- java_objectheader *o;
+ java_object_t *o;
u4 o_size;
u4 o_size_new;
u4 used;
GC_LOG( dolog("GC: Compaction Phase 0 started ..."); );
/* Phase 0:
- * - thread all references in classes
* - thread all references in the rootset */
- compact_thread_classes(region->base, region->ptr);
compact_thread_rootset(rs, region->base, region->ptr);
GC_LOG( dolog("GC: Compaction Phase 1 started ..."); );
* - update forward references */
ptr = region->base; ptr_new = region->base;
while (ptr < region->ptr) {
- o = (java_objectheader *) ptr;
+ o = (java_object_t *) ptr;
/* uncollectable items should never be compacted */
GC_ASSERT(!GC_TEST_FLAGS(o, HDRFLAG_UNCOLLECTABLE));
/* only marked objects survive */
if (GC_IS_MARKED(o)) {
+#if defined(GCCONF_HDRFLAG_REFERENCING)
+ /* check if this objects contains references */
+ if (GC_TEST_FLAGS(o, HDRFLAG_REFERENCING))
+#endif
+
/* thread all the references in this object */
compact_thread_references(o, region->base, region->ptr);
used = 0;
ptr = region->base; ptr_new = region->base;
while (ptr < region->ptr) {
- o = (java_objectheader *) ptr;
+ o = (java_object_t *) ptr;
/* if this object is still part of a threaded chain ... */
if (GC_IS_THREADED(o->vftbl)) {