61 #if !defined(ENABLE_THREADS)
63 sourcestate_t *_no_threads_sourcestate;
73 #define GC_SYS_SIZE (20*1024*1024)
78 dolog(
"GC: Initialising with heap-size %d (max. %d)",
79 heapstartsize, heapmaxsize);
81 #if defined(ENABLE_HANDLES)
105 vm_abort(
"gc_init: region_create failed: out of memory");
110 vm_abort(
"gc_init: region_create failed: out of memory");
135 GC_LOG2(
printf(
"Registering Reference at %p\n", (
void *) ref); );
143 for (re = list_first(list); re != NULL; re = list_next(list, re)) {
145 vm_abort(
"gc_reference_register_intern: reference already registered");
158 list_add_last(list, re);
188 GC_LOG2(
printf(
"Un-Registering Reference at %p\n", (
void *) ref); );
191 for (re = list_first(list); re != NULL; re = list_next(list, re)) {
192 if (re->
ref == ref) {
194 list_remove(list, re);
203 vm_abort(
"gc_reference_unregister_intern: reference not found");
242 #if defined(ENABLE_RT_TIMING)
243 struct timespec time_start, time_suspend, time_rootset, time_mark, time_compact, time_end;
257 RT_TIMING_GET_TIME(time_start);
267 #if defined(ENABLE_THREADS)
270 GC_LOG( threads_dump(); );
281 vm_abort(
"gc_collect: no stacktrace available for current thread!");
286 GC_LOG(
dolog(
"GC: Stackwalking current thread ..."); );
287 #if defined(ENABLE_THREADS)
299 RT_TIMING_GET_TIME(time_suspend);
310 if (opt_GCDebugRootSet)
316 RT_TIMING_GET_TIME(time_rootset);
327 RT_TIMING_GET_TIME(time_mark);
334 #if defined(ENABLE_MEMCHECK)
341 RT_TIMING_GET_TIME(time_compact);
372 #if defined(ENABLE_STATISTICS)
380 #if defined(ENABLE_THREADS)
383 threads_startworld();
387 #if defined(GCCONF_FINALIZER)
395 RT_TIMING_GET_TIME(time_end);
397 RT_TIMING_TIME_DIFF(time_start , time_suspend, RT_TIMING_GC_SUSPEND);
398 RT_TIMING_TIME_DIFF(time_suspend, time_rootset, RT_TIMING_GC_ROOTSET1)
399 RT_TIMING_TIME_DIFF(time_rootset, time_mark , RT_TIMING_GC_MARK);
400 RT_TIMING_TIME_DIFF(time_mark , time_compact, RT_TIMING_GC_COMPACT);
401 RT_TIMING_TIME_DIFF(time_compact, time_end , RT_TIMING_GC_ROOTSET2);
402 RT_TIMING_TIME_DIFF(time_start , time_end , RT_TIMING_GC_TOTAL);
412 lock_hashtable_cleanup();
416 #if defined(ENABLE_THREADS)
433 if (thread->gc_critical) {
445 replace_gc_from_native(thread, pc, sp);
456 GC_LOG(
dolog(
"\tJIT (pc=%p) & KNOWN(codeinfo=%p) -> replacement",
466 GC_LOG(
dolog(
"\tJIT (pc=%p) & UN-KNOWN -> retry", pc); );
495 dolog(
"GC: Forced Collection ...");
502 dolog(
"GC: Forced Collection finished.");
516 dolog(
"GC: Invoking finalizers ...");
521 dolog(
"GC: Invoking finalizers finished.");
539 dolog(
"gc_finalize_all: Deprecated!");
560 #if defined(ENABLE_STATISTICS)
561 int gcstat_collections;
562 int gcstat_collections_forced;
563 int gcstat_mark_depth;
564 int gcstat_mark_depth_max;
565 int gcstat_mark_count;
567 void gcstat_println()
569 printf(
"\nGCSTAT - General Statistics:\n");
570 printf(
"\t# of collections: %d\n", gcstat_collections);
571 printf(
"\t# of forced collections: %d\n", gcstat_collections_forced);
573 printf(
"\nGCSTAT - Marking Statistics:\n");
574 printf(
"\t# of objects marked: %d\n", gcstat_mark_count);
575 printf(
"\tMaximal marking depth: %d\n", gcstat_mark_depth_max);
577 printf(
"\nGCSTAT - Compaction Statistics:\n");
void gc_collect(s4 level)
void gc_init(u4 heapmaxsize, u4 heapstartsize)
static void gc_reference_unregister_intern(list_t *list, java_object_t **ref)
void gc_weakreference_unregister(java_object_t **ref)
void replace_activate_replacement_points(codeinfo *code, bool mappable)
codeinfo * code_find_codeinfo_for_pc_nocheck(void *pc)
void gc_weakreference_register(java_object_t **ref, int32_t reftype)
#define GCSTAT_COUNT(cnt)
void stacktrace_print(stacktrace_t *st)
s8 gc_get_free_bytes(void)
s8 gc_get_max_heap_size(void)
void * region_create(regioninfo_t *region, u4 size)
void vm_abort(const char *text,...)
cacao::detail::threadobject impl
void heap_println_usage()
void gc_invoke_finalizers(void)
regioninfo_t * heap_region_main
#define GC_ASSERT(assertion)
void gc_finalize_all(void)
s8 gc_get_total_bytes(void)
void compact_me(rootset_t *rs, regioninfo_t *region)
void copy_me(regioninfo_t *src, regioninfo_t *dst, rootset_t *rs)
regioninfo_t * heap_region_sys
void rootset_print(rootset_t *rs)
void gc_reference_register(java_object_t **ref, int32_t reftype)
void final_set_all_reclaimable()
bool gc_suspend(threadobject *thread, u1 *pc, u1 *sp)
This file contains the real-time timing utilities.
list_t * gc_reflist_strong
s8 gc_get_heap_size(void)
static void gc_reference_register_intern(list_t *list, java_object_t **ref, int32_t reftype)
void rootset_writeback(rootset_t *rs)
void gc_reference_unregister(java_object_t **ref)
void mark_me(rootset_t *rs)
java_handle_bytearray_t * stacktrace_get_current(void)
void heap_increase_size(rootset_t *rs)
rootset_t * rootset_readout()