wingo pushed a commit to branch wip-whippet
in repository guile.

commit 461efa98a08d399975c64f3a56f63d7d6de7d0bc
Author: Andy Wingo <wi...@igalia.com>
AuthorDate: Mon Feb 10 13:41:19 2025 +0100

    Wire up tracepoints for event-listener interface
---
 src/bdw.c  | 19 +++++++++++++------
 src/mmc.c  | 14 ++++++++++----
 src/pcc.c  | 14 ++++++++++----
 src/semi.c | 14 ++++++++++----
 4 files changed, 43 insertions(+), 18 deletions(-)

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);

Reply via email to