diff --git a/src/bdw.c b/src/bdw.c index 72b13012e..5f90057a7 100644 --- a/src/bdw.c +++ b/src/bdw.c @@ -5,6 +5,7 @@ #include "gc-api.h" #include "gc-ephemeron.h" +#include "gc-tracepoint.h" #define GC_IMPL 1 #include "gc-internal.h" @@ -70,11 +71,16 @@ struct gc_mutator { }; struct gc_heap *__the_bdw_gc_heap; -#define HEAP_EVENT(event, ...) \ - __the_bdw_gc_heap->event_listener.event(__the_bdw_gc_heap->event_listener_data, ##__VA_ARGS__) -#define MUTATOR_EVENT(mut, event, ...) \ - __the_bdw_gc_heap->event_listener.event(mut->event_listener_data, ##__VA_ARGS__) - +#define HEAP_EVENT(event, ...) do { \ + __the_bdw_gc_heap->event_listener.event(__the_bdw_gc_heap->event_listener_data, \ + ##__VA_ARGS__); \ + GC_TRACEPOINT(event, ##__VA_ARGS__); \ + } while (0) +#define MUTATOR_EVENT(mut, event, ...) do { \ + __the_bdw_gc_heap->event_listener.event(mut->event_listener_data, \ + ##__VA_ARGS__); \ + GC_TRACEPOINT(event, ##__VA_ARGS__); \ + } while (0) static inline size_t gc_inline_bytes_to_freelist_index(size_t bytes) { return (bytes - 1U) / GC_INLINE_GRANULE_BYTES; } @@ -386,7 +392,8 @@ static inline struct gc_mutator *add_mutator(struct gc_heap *heap) { struct gc_mutator *ret = GC_generic_malloc(sizeof(struct gc_mutator), mutator_gc_kind); ret->heap = heap; - ret->event_listener_data = HEAP_EVENT(mutator_added); + ret->event_listener_data = + heap->event_listener.mutator_added(heap->event_listener_data); pthread_mutex_lock(&heap->lock); ret->next = heap->mutators; diff --git a/src/mmc.c b/src/mmc.c index 7394fdc18..db7e1f512 100644 --- a/src/mmc.c +++ b/src/mmc.c @@ -17,6 +17,7 @@ #include "gc-platform.h" #include "gc-stack.h" #include "gc-trace.h" +#include "gc-tracepoint.h" #include "heap-sizer.h" #include "large-object-space.h" #include "nofl-space.h" @@ -67,10 +68,15 @@ struct gc_heap { void *event_listener_data; }; -#define HEAP_EVENT(heap, event, ...) \ - (heap)->event_listener.event((heap)->event_listener_data, ##__VA_ARGS__) -#define MUTATOR_EVENT(mut, event, ...) \ - (mut)->heap->event_listener.event((mut)->event_listener_data, ##__VA_ARGS__) +#define HEAP_EVENT(heap, event, ...) do { \ + (heap)->event_listener.event((heap)->event_listener_data, ##__VA_ARGS__); \ + GC_TRACEPOINT(event, ##__VA_ARGS__); \ + } while (0) +#define MUTATOR_EVENT(mut, event, ...) do { \ + (mut)->heap->event_listener.event((mut)->event_listener_data, \ + ##__VA_ARGS__); \ + GC_TRACEPOINT(event, ##__VA_ARGS__); \ + } while (0) struct gc_mutator { struct nofl_allocator allocator; diff --git a/src/pcc.c b/src/pcc.c index 1abf70bf6..f3a94d22b 100644 --- a/src/pcc.c +++ b/src/pcc.c @@ -17,6 +17,7 @@ #include "gc-inline.h" #include "gc-platform.h" #include "gc-trace.h" +#include "gc-tracepoint.h" #include "heap-sizer.h" #include "large-object-space.h" #if GC_PARALLEL @@ -74,10 +75,15 @@ struct gc_heap { void *event_listener_data; }; -#define HEAP_EVENT(heap, event, ...) \ - (heap)->event_listener.event((heap)->event_listener_data, ##__VA_ARGS__) -#define MUTATOR_EVENT(mut, event, ...) \ - (mut)->heap->event_listener.event((mut)->event_listener_data, ##__VA_ARGS__) +#define HEAP_EVENT(heap, event, ...) do { \ + (heap)->event_listener.event((heap)->event_listener_data, ##__VA_ARGS__); \ + GC_TRACEPOINT(event, ##__VA_ARGS__); \ + } while (0) +#define MUTATOR_EVENT(mut, event, ...) do { \ + (mut)->heap->event_listener.event((mut)->event_listener_data, \ + ##__VA_ARGS__); \ + GC_TRACEPOINT(event, ##__VA_ARGS__); \ + } while (0) struct gc_mutator { struct copy_space_allocator allocator; diff --git a/src/semi.c b/src/semi.c index 256295c1d..0d0c9ecca 100644 --- a/src/semi.c +++ b/src/semi.c @@ -9,6 +9,7 @@ #include "gc-internal.h" #include "gc-platform.h" +#include "gc-tracepoint.h" #include "heap-sizer.h" #include "semi-attrs.h" #include "large-object-space.h" @@ -59,10 +60,15 @@ struct gc_mutator { void *event_listener_data; }; -#define HEAP_EVENT(heap, event, ...) \ - (heap)->event_listener.event((heap)->event_listener_data, ##__VA_ARGS__) -#define MUTATOR_EVENT(mut, event, ...) \ - (mut)->heap->event_listener.event((mut)->event_listener_data, ##__VA_ARGS__) +#define HEAP_EVENT(heap, event, ...) do { \ + (heap)->event_listener.event((heap)->event_listener_data, ##__VA_ARGS__); \ + GC_TRACEPOINT(event, ##__VA_ARGS__); \ + } while (0) +#define MUTATOR_EVENT(mut, event, ...) do { \ + (mut)->heap->event_listener.event((mut)->event_listener_data, \ + ##__VA_ARGS__); \ + GC_TRACEPOINT(event, ##__VA_ARGS__); \ + } while (0) static inline void clear_memory(uintptr_t addr, size_t size) { memset((char*)addr, 0, size);