diff options
author | Paolo Molaro <lupus@oddwiz.org> | 2005-01-24 18:29:23 +0300 |
---|---|---|
committer | Paolo Molaro <lupus@oddwiz.org> | 2005-01-24 18:29:23 +0300 |
commit | 8cb052c1777f0a2dec281f509633af531194fd35 (patch) | |
tree | f94f0668d51c54aa1b9b1b78bd40c1841e1439c3 /libgc | |
parent | f8c69aca1044a69b36a95b1694e97982ac1df6fe (diff) |
Mon Jan 24 16:39:42 CET 2005 Paolo Molaro <lupus@ximian.com>
* alloc.c, include/gc.h: add event notification, mostly from
a patch by Ben Maurer.
svn path=/trunk/mono/; revision=39416
Diffstat (limited to 'libgc')
-rw-r--r-- | libgc/ChangeLog | 6 | ||||
-rw-r--r-- | libgc/alloc.c | 32 | ||||
-rw-r--r-- | libgc/include/gc.h | 16 |
3 files changed, 54 insertions, 0 deletions
diff --git a/libgc/ChangeLog b/libgc/ChangeLog index a6b47a9cd79..df873088b3b 100644 --- a/libgc/ChangeLog +++ b/libgc/ChangeLog @@ -1,3 +1,9 @@ + +Mon Jan 24 16:39:42 CET 2005 Paolo Molaro <lupus@ximian.com> + + * alloc.c, include/gc.h: add event notification, mostly from + a patch by Ben Maurer. + 2005-01-23 Geoff Norton <gnorton@customerdna.com> * os_dir.c: Change GC_task_self to be static everywhere on Darwin. diff --git a/libgc/alloc.c b/libgc/alloc.c index b4b2b1bb77f..c1f40635071 100644 --- a/libgc/alloc.c +++ b/libgc/alloc.c @@ -260,6 +260,10 @@ void GC_maybe_gc() static int n_partial_gcs = 0; if (GC_should_collect()) { + if (GC_notify_event) + GC_notify_event (GC_EVENT_START); + + if (!GC_incremental) { GC_gcollect_inner(); n_partial_gcs = 0; @@ -305,6 +309,10 @@ void GC_maybe_gc() GC_n_attempts++; } } + + + if (GC_notify_event) + GC_notify_event (GC_EVENT_END); } } @@ -478,11 +486,16 @@ GC_stop_func stop_func; # if defined(CONDPRINT) && !defined(PRINTTIMES) if (GC_print_stats) GET_TIME(start_time); # endif + # if defined(REGISTER_LIBRARIES_EARLY) GC_cond_register_dynamic_libraries(); # endif STOP_WORLD(); IF_THREADS(GC_world_stopped = TRUE); + + if (GC_notify_event) + GC_notify_event (GC_EVENT_MARK_START); + # ifdef CONDPRINT if (GC_print_stats) { GC_printf1("--> Marking for collection %lu ", @@ -547,6 +560,10 @@ GC_stop_func stop_func; (*GC_check_heap)(); } + + if (GC_notify_event) + GC_notify_event (GC_EVENT_MARK_END); + IF_THREADS(GC_world_stopped = FALSE); START_WORLD(); # ifdef PRINTTIMES @@ -617,6 +634,9 @@ GC_stop_func stop_func; } } +void (*GC_notify_event) GC_PROTO((GCEventType e)); +void (*GC_on_heap_resize) GC_PROTO((size_t new_size)); + /* Finish up a collection. Assumes lock is held, signals are disabled, */ /* but the world is otherwise running. */ void GC_finish_collection() @@ -629,6 +649,10 @@ void GC_finish_collection() GET_TIME(start_time); finalize_time = start_time; # endif + + + if (GC_notify_event) + GC_notify_event (GC_EVENT_RECLAIM_START); # ifdef GATHERSTATS GC_mem_found = 0; @@ -638,6 +662,7 @@ void GC_finish_collection() GC_print_address_map(); } # endif + COND_DUMP; if (GC_find_leak) { /* Mark all objects on the free list. All objects should be */ @@ -740,6 +765,10 @@ void GC_finish_collection() # ifdef USE_MUNMAP GC_unmap_old(); # endif + + if (GC_notify_event) + GC_notify_event (GC_EVENT_RECLAIM_END); + # ifdef PRINTTIMES GET_TIME(done_time); GC_printf2("Finalize + initiate sweep took %lu + %lu msecs\n", @@ -960,6 +989,9 @@ word n; if (GC_collect_at_heapsize < GC_heapsize /* wrapped */) GC_collect_at_heapsize = (word)(-1); # endif + if (GC_on_heap_resize) + GC_on_heap_resize (GC_heapsize); + return(TRUE); } diff --git a/libgc/include/gc.h b/libgc/include/gc.h index 93ede344232..a60a6560d54 100644 --- a/libgc/include/gc.h +++ b/libgc/include/gc.h @@ -92,6 +92,22 @@ GC_API GC_PTR (*GC_oom_fn) GC_PROTO((size_t bytes_requested)); /* pointer to a previously allocated heap */ /* object. */ +typedef enum { + GC_EVENT_START, + GC_EVENT_MARK_START, + GC_EVENT_MARK_END, + GC_EVENT_RECLAIM_START, + GC_EVENT_RECLAIM_END, + GC_EVENT_END +} GCEventType; + +GC_API void (*GC_notify_event) GC_PROTO((GCEventType event_type)); + /* Invoked at specific points during every collection. + */ + +GC_API void (*GC_on_heap_resize) GC_PROTO((size_t new_size)); + /* Invoked when the heap grows or shrinks */ + GC_API int GC_find_leak; /* Do not actually garbage collect, but simply */ /* report inaccessible memory that was not */ |