1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-11 22:31:12 +02:00

Add gc_trace_worker_call_with_data

Goal is to pass thread-local evacuation buffers.
This commit is contained in:
Andy Wingo 2024-07-08 18:09:34 +02:00
parent ac5d546481
commit 5ff78f01c8
4 changed files with 47 additions and 9 deletions

View file

@ -32,6 +32,7 @@ struct trace_worker {
enum trace_worker_state state;
pthread_mutex_t lock;
struct shared_worklist deque;
struct gc_trace_worker_data *data;
};
#define TRACE_WORKERS_MAX_COUNT 8
@ -60,7 +61,9 @@ trace_worker_init(struct trace_worker *worker, struct gc_heap *heap,
worker->id = id;
worker->steal_id = 0;
worker->thread = 0;
worker->state = TRACE_WORKER_STOPPED;
pthread_mutex_init(&worker->lock, NULL);
worker->data = NULL;
return shared_worklist_init(&worker->deque);
}
@ -272,10 +275,13 @@ trace_worker_steal(struct local_tracer *trace) {
}
static void
trace_worker_trace(struct trace_worker *worker) {
struct gc_heap *heap = worker->heap;
struct gc_tracer *tracer = worker->tracer;
trace_with_data(struct gc_tracer *tracer,
struct gc_heap *heap,
struct gc_trace_worker_data *worker_data,
void *data) {
struct trace_worker *worker = data;
atomic_fetch_add_explicit(&tracer->active_tracers, 1, memory_order_acq_rel);
worker->data = worker_data;
struct local_tracer trace;
trace.worker = worker;
@ -302,9 +308,16 @@ trace_worker_trace(struct trace_worker *worker) {
DEBUG("tracer #%zu: done tracing, %zu objects traced\n", worker->id, n);
worker->data = NULL;
atomic_fetch_sub_explicit(&tracer->active_tracers, 1, memory_order_acq_rel);
}
static void
trace_worker_trace(struct trace_worker *worker) {
gc_trace_worker_call_with_data(trace_with_data, worker->tracer,
worker->heap, worker);
}
static inline void
gc_tracer_enqueue_root(struct gc_tracer *tracer, struct gc_ref ref) {
struct shared_worklist *worker0_deque = &tracer->workers[0].deque;