1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-07 12:40:19 +02:00

Wire up tracepoints for event-listener interface

This commit is contained in:
Andy Wingo 2025-02-10 13:41:19 +01:00
parent cca54736a0
commit 461efa98a0
4 changed files with 43 additions and 18 deletions

View file

@ -5,6 +5,7 @@
#include "gc-api.h" #include "gc-api.h"
#include "gc-ephemeron.h" #include "gc-ephemeron.h"
#include "gc-tracepoint.h"
#define GC_IMPL 1 #define GC_IMPL 1
#include "gc-internal.h" #include "gc-internal.h"
@ -70,11 +71,16 @@ struct gc_mutator {
}; };
struct gc_heap *__the_bdw_gc_heap; struct gc_heap *__the_bdw_gc_heap;
#define HEAP_EVENT(event, ...) \ #define HEAP_EVENT(event, ...) do { \
__the_bdw_gc_heap->event_listener.event(__the_bdw_gc_heap->event_listener_data, ##__VA_ARGS__) __the_bdw_gc_heap->event_listener.event(__the_bdw_gc_heap->event_listener_data, \
#define MUTATOR_EVENT(mut, event, ...) \ ##__VA_ARGS__); \
__the_bdw_gc_heap->event_listener.event(mut->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) { static inline size_t gc_inline_bytes_to_freelist_index(size_t bytes) {
return (bytes - 1U) / GC_INLINE_GRANULE_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 = struct gc_mutator *ret =
GC_generic_malloc(sizeof(struct gc_mutator), mutator_gc_kind); GC_generic_malloc(sizeof(struct gc_mutator), mutator_gc_kind);
ret->heap = heap; 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); pthread_mutex_lock(&heap->lock);
ret->next = heap->mutators; ret->next = heap->mutators;

View file

@ -17,6 +17,7 @@
#include "gc-platform.h" #include "gc-platform.h"
#include "gc-stack.h" #include "gc-stack.h"
#include "gc-trace.h" #include "gc-trace.h"
#include "gc-tracepoint.h"
#include "heap-sizer.h" #include "heap-sizer.h"
#include "large-object-space.h" #include "large-object-space.h"
#include "nofl-space.h" #include "nofl-space.h"
@ -67,10 +68,15 @@ struct gc_heap {
void *event_listener_data; void *event_listener_data;
}; };
#define HEAP_EVENT(heap, event, ...) \ #define HEAP_EVENT(heap, event, ...) do { \
(heap)->event_listener.event((heap)->event_listener_data, ##__VA_ARGS__) (heap)->event_listener.event((heap)->event_listener_data, ##__VA_ARGS__); \
#define MUTATOR_EVENT(mut, event, ...) \ GC_TRACEPOINT(event, ##__VA_ARGS__); \
(mut)->heap->event_listener.event((mut)->event_listener_data, ##__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 gc_mutator {
struct nofl_allocator allocator; struct nofl_allocator allocator;

View file

@ -17,6 +17,7 @@
#include "gc-inline.h" #include "gc-inline.h"
#include "gc-platform.h" #include "gc-platform.h"
#include "gc-trace.h" #include "gc-trace.h"
#include "gc-tracepoint.h"
#include "heap-sizer.h" #include "heap-sizer.h"
#include "large-object-space.h" #include "large-object-space.h"
#if GC_PARALLEL #if GC_PARALLEL
@ -74,10 +75,15 @@ struct gc_heap {
void *event_listener_data; void *event_listener_data;
}; };
#define HEAP_EVENT(heap, event, ...) \ #define HEAP_EVENT(heap, event, ...) do { \
(heap)->event_listener.event((heap)->event_listener_data, ##__VA_ARGS__) (heap)->event_listener.event((heap)->event_listener_data, ##__VA_ARGS__); \
#define MUTATOR_EVENT(mut, event, ...) \ GC_TRACEPOINT(event, ##__VA_ARGS__); \
(mut)->heap->event_listener.event((mut)->event_listener_data, ##__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 gc_mutator {
struct copy_space_allocator allocator; struct copy_space_allocator allocator;

View file

@ -9,6 +9,7 @@
#include "gc-internal.h" #include "gc-internal.h"
#include "gc-platform.h" #include "gc-platform.h"
#include "gc-tracepoint.h"
#include "heap-sizer.h" #include "heap-sizer.h"
#include "semi-attrs.h" #include "semi-attrs.h"
#include "large-object-space.h" #include "large-object-space.h"
@ -59,10 +60,15 @@ struct gc_mutator {
void *event_listener_data; void *event_listener_data;
}; };
#define HEAP_EVENT(heap, event, ...) \ #define HEAP_EVENT(heap, event, ...) do { \
(heap)->event_listener.event((heap)->event_listener_data, ##__VA_ARGS__) (heap)->event_listener.event((heap)->event_listener_data, ##__VA_ARGS__); \
#define MUTATOR_EVENT(mut, event, ...) \ GC_TRACEPOINT(event, ##__VA_ARGS__); \
(mut)->heap->event_listener.event((mut)->event_listener_data, ##__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) { static inline void clear_memory(uintptr_t addr, size_t size) {
memset((char*)addr, 0, size); memset((char*)addr, 0, size);