[!ENABLE_HANDLES]: Added development break.
* src/mm/cacao-gc/gc.c (gc_reference_register): Added reftype to arguments.
* src/mm/gc-common.h: Added reftype defines.
* src/mm/cacao-gc/rootset.h: Removed reftype defines.
* src/mm/cacao-gc/rootset.c: Adapted to changes.
* src/vmcore/loader.c (loader_hashtable_classloader_add): Pass reftype to GC.
* src/native/jni.c (_Jv_JNI_NewGlobalRef): Likewise.
* src/threads/native/threads.c (threads_init): Likewise.
* src/threads/threads-common.c (threads_thread_new): Likewise.
(threads_thread_print_info) [WITH_CLASSPATH_GNU]: Fixed thread name printing.
* src/cacaoh/dummy.c (gc_reference_register): Adapted dummy function to new sig.
--HG--
branch : exact-gc
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: dummy.c 8368 2007-08-20 21:36:53Z michi $
+ $Id: dummy.c 8374 2007-08-21 10:20:33Z michi $
*/
/* gc *************************************************************************/
-void gc_reference_register(java_object_t **ref)
+void gc_reference_register(java_object_t **ref, int32_t reftype)
{
vm_abort("gc_reference_register");
}
*******************************************************************************/
-void gc_reference_register(java_object_t **ref)
+void gc_reference_register(java_object_t **ref, int32_t reftype)
{
list_gcref_entry_t *re;
re = NEW(list_gcref_entry_t);
- re->ref = ref;
+ re->ref = ref;
+#if !defined(NDEBUG)
+ re->reftype = reftype;
+#endif
list_add_last(gc_reflist, re);
}
# error "GC does only work with replacement enabled!"
#endif
+#if 1 && !defined(ENABLE_HANDLES)
+# error "GC does only work with handles (indirection cells) enabled!"
+#endif
+
#if 1 && !defined(__ALPHA__) && !defined(__ARM__) && !defined(__I386__) && !defined(__POWERPC__) && !defined(__X86_64__) && !defined(__M68K__) && !defined(__SPARC_64__)
# error "GC was only ported to some architectures so far!"
#endif
struct list_gcref_entry_t {
listnode_t linkage;
java_object_t **ref;
+#if !defined(NDEBUG)
+ s4 reftype;
+#endif
};
#define ROOTSET_ADD(adr,mrk,tp) \
if (refcount >= rs->capacity) \
rs = rootset_resize(rs); \
- rs->refs[refcount].ref = (adr); \
- rs->refs[refcount].marks = (mrk); \
- rs->refs[refcount].type = (tp); \
+ rs->refs[refcount].ref = (adr); \
+ rs->refs[refcount].marks = (mrk); \
+ rs->refs[refcount].reftype = (tp); \
refcount++;
static rootset_t *rootset_from_globals(rootset_t *rs)
re = list_first_unsynced(gc_reflist);
while (re) {
- GC_LOG2( printf("Found Registered Reference: %p at %p\n", *(re->ref), re->ref); );
+ GC_LOG2( printf("Found Registered Reference: %p at %p of type %d\n", *(re->ref), re->ref, ref->reftype); );
/* add this registered reference to the root set */
- ROOTSET_ADD(re->ref, true, REFTYPE_REGISTERED)
+ ROOTSET_ADD(re->ref, true, re->reftype)
re = list_next_unsynced(gc_reflist, re);
}
GC_LOG2( printf("Found Finalizer Entry: %p\n", (void *) fe->o); );
/* add this object with finalizer to the root set */
- ROOTSET_ADD(&( fe->o ), false, REFTYPE_FINALIZER)
+ ROOTSET_ADD(&( fe->o ), false, GC_REFTYPE_FINALIZER)
fe = list_next_unsynced(final_list, fe);
}
printf("\tto object : "); heap_print_object(f->value->a); printf("\n"); );
/* add this static field reference to the root set */
- ROOTSET_ADD(f->value, true, REFTYPE_CLASSREF);
+ ROOTSET_ADD(f->value, true, GC_REFTYPE_CLASSREF);
}
GC_LOG2( printf("Found Reference (Java Local): %p\n", (void *) sf->javalocals[i].a); );
/* add this reference to the root set */
- ROOTSET_ADD((java_object_t **) &( sf->javalocals[i] ), true, REFTYPE_STACK);
+ ROOTSET_ADD((java_object_t **) &( sf->javalocals[i] ), true, GC_REFTYPE_STACK);
}
GC_LOG2( printf("Found Reference (Java Stack): %p\n", (void *) sf->javastack[i].a); );
/* add this reference to the root set */
- ROOTSET_ADD((java_object_t **) &( sf->javastack[i] ), true, REFTYPE_STACK);
+ ROOTSET_ADD((java_object_t **) &( sf->javastack[i] ), true, GC_REFTYPE_STACK);
}
GC_LOG( printf("Found Reference (Sync Slot): %p\n", (void *) sf->syncslots[i].a); );
/* add this reference to the root set */
- ROOTSET_ADD((java_object_t **) &( sf->syncslots[i] ), true, REFTYPE_STACK);
+ ROOTSET_ADD((java_object_t **) &( sf->syncslots[i] ), true, GC_REFTYPE_STACK);
}
}
/* there should be no null pointers in here */
GC_ASSERT(lrt->refs[i] != NULL);
- GC_LOG( printf("Found LocalRef: %p\n", (void *) lrt->refs[i]); );
+ GC_LOG2( printf("Found LocalRef: %p\n", (void *) lrt->refs[i]); );
/* add this reference to the root set */
- ROOTSET_ADD(&( lrt->refs[i] ), true, REFTYPE_LOCALREF);
+ ROOTSET_ADD(&( lrt->refs[i] ), true, GC_REFTYPE_LOCALREF);
}
/* Debugging ******************************************************************/
#if !defined(NDEBUG)
-static const char* ref_type_names[] = {
- "XXXXXX", "REGIST", "CLASSL",
- "GLOBAL", "FINAL ", "LOCAL ",
- "STACK ", "STATIC"
+static const char* reftype_names[] = {
+ "XXXXXXXXXXXX", "THREADOBJECT", "CLASSLOADER ",
+ "GLOBAL-REF ", "FINALIZER ", "LOCAL-REF ",
+ "ON-STACK-ADR", "STATIC FIELD"
};
void rootset_print(rootset_t *rs)
/*printf("\t\tReference at %p points to ...\n", (void *) rs->refs[i]);*/
printf("\t\t");
- printf("%s ", ref_type_names[rs->refs[i].type]);
+ printf("%s ", reftype_names[rs->refs[i].reftype]);
if (rs->refs[i].marks)
printf("MARK+UPDATE");
else
#define ROOTSET_INITIAL_CAPACITY 16
-#define REFTYPE_THREADOBJECT 1
-#define REFTYPE_REGISTERED 1
-#define REFTYPE_CLASSLOADER 2
-#define REFTYPE_GLOBALREF 3
-#define REFTYPE_FINALIZER 4
-#define REFTYPE_LOCALREF 5
-#define REFTYPE_STACK 6
-#define REFTYPE_CLASSREF 7
-
/* rootset is passed as array of pointers, which point to the location of
the reference */
java_object_t **ref; /* a pointer to the actual reference */
bool marks; /* indicates if a reference marks */
#if !defined(NDEBUG)
- s4 type;
+ s4 reftype;
#endif
} rootset_entry_t;
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: gc-common.h 8302 2007-08-13 13:50:50Z michi $
+ $Id: gc-common.h 8374 2007-08-21 10:20:33Z michi $
*/
#include "vmcore/method.h"
+/* reference types ************************************************************/
+
+#define GC_REFTYPE_THREADOBJECT 1
+#define GC_REFTYPE_CLASSLOADER 2
+#define GC_REFTYPE_JNI_GLOBALREF 3
+#define GC_REFTYPE_FINALIZER 4
+#define GC_REFTYPE_LOCALREF 5
+#define GC_REFTYPE_STACK 6
+#define GC_REFTYPE_CLASSREF 7
+
+
/* function prototypes ********************************************************/
void gc_init(u4 heapmaxsize, u4 heapstartsize);
void heap_init_objectheader(java_object_t *o, u4 size);
s4 heap_get_hashcode(java_object_t *o);
-void gc_reference_register(java_object_t **ref);
+void gc_reference_register(java_object_t **ref, int32_t reftype);
void gc_reference_unregister(java_object_t **ref);
#endif
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: jni.c 8364 2007-08-20 19:52:00Z michi $
+ $Id: jni.c 8374 2007-08-21 10:20:33Z michi $
*/
#if defined(ENABLE_GC_CACAO)
/* register global ref with the GC */
- gc_reference_register(&(gre->o));
+ gc_reference_register(&(gre->o), GC_REFTYPE_JNI_GLOBALREF);
#endif
gre->o = o;
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: threads.c 8360 2007-08-20 18:02:50Z michi $
+ $Id: threads.c 8374 2007-08-21 10:20:33Z michi $
*/
#if defined(ENABLE_GC_CACAO)
/* register reference to java.lang.Thread with the GC */
- gc_reference_register((java_object_t **) &(mainthread->object));
+ gc_reference_register((java_object_t **) &(mainthread->object), GC_REFTYPE_THREADOBJECT);
#endif
/* create a java.lang.Thread for the main thread */
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: threads-common.c 8360 2007-08-20 18:02:50Z michi $
+ $Id: threads-common.c 8374 2007-08-21 10:20:33Z michi $
*/
#if defined(ENABLE_GC_CACAO)
/* register reference to java.lang.Thread with the GC */
- gc_reference_register((java_object_t **) &(t->object));
+ gc_reference_register((java_object_t **) &(t->object), GC_REFTYPE_THREADOBJECT);
#endif
}
void threads_thread_print_info(threadobject *t)
{
java_lang_Thread *object;
+#if defined(WITH_CLASSPATH_GNU)
+ java_lang_String *namestring;
+#endif
utf *name;
assert(t->state != THREAD_STATE_NEW);
/* get thread name */
#if defined(WITH_CLASSPATH_GNU)
- name = javastring_toutf((java_handle_t *) LLNI_field_direct(object, name), false);
+ LLNI_field_get_ref(object, name, namestring);
+ name = javastring_toutf((java_handle_t *) namestring, false);
#elif defined(WITH_CLASSPATH_SUN) || defined(WITH_CLASSPATH_CLDC1_1)
/* FIXME: In cldc the name is a char[] */
/* name = object->name; */
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: loader.c 8369 2007-08-20 21:39:32Z michi $
+ $Id: loader.c 8374 2007-08-21 10:20:33Z michi $
*/
#if defined(ENABLE_GC_CACAO)
/* register the classloader object with the GC */
- gc_reference_register(&(cle->object));
+ gc_reference_register(&(cle->object), GC_REFTYPE_CLASSLOADER);
#endif
LLNI_CRITICAL_START;