mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 11:40:18 +02:00
Remove heap_tracer; get to heap from tracer directly
This commit is contained in:
parent
ba9459ce56
commit
ac5d546481
4 changed files with 8 additions and 12 deletions
|
@ -25,6 +25,7 @@ enum trace_worker_state {
|
||||||
struct gc_heap;
|
struct gc_heap;
|
||||||
struct trace_worker {
|
struct trace_worker {
|
||||||
struct gc_heap *heap;
|
struct gc_heap *heap;
|
||||||
|
struct gc_tracer *tracer;
|
||||||
size_t id;
|
size_t id;
|
||||||
size_t steal_id;
|
size_t steal_id;
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
|
@ -55,6 +56,7 @@ static int
|
||||||
trace_worker_init(struct trace_worker *worker, struct gc_heap *heap,
|
trace_worker_init(struct trace_worker *worker, struct gc_heap *heap,
|
||||||
struct gc_tracer *tracer, size_t id) {
|
struct gc_tracer *tracer, size_t id) {
|
||||||
worker->heap = heap;
|
worker->heap = heap;
|
||||||
|
worker->tracer = tracer;
|
||||||
worker->id = id;
|
worker->id = id;
|
||||||
worker->steal_id = 0;
|
worker->steal_id = 0;
|
||||||
worker->thread = 0;
|
worker->thread = 0;
|
||||||
|
@ -67,7 +69,7 @@ static void trace_worker_trace(struct trace_worker *worker);
|
||||||
static void*
|
static void*
|
||||||
trace_worker_thread(void *data) {
|
trace_worker_thread(void *data) {
|
||||||
struct trace_worker *worker = data;
|
struct trace_worker *worker = data;
|
||||||
struct gc_tracer *tracer = heap_tracer(worker->heap);
|
struct gc_tracer *tracer = worker->tracer;
|
||||||
long trace_epoch = 0;
|
long trace_epoch = 0;
|
||||||
|
|
||||||
pthread_mutex_lock(&worker->lock);
|
pthread_mutex_lock(&worker->lock);
|
||||||
|
@ -155,7 +157,7 @@ tracer_share(struct local_tracer *trace) {
|
||||||
shared_worklist_push_many(trace->share_deque, objv, count);
|
shared_worklist_push_many(trace->share_deque, objv, count);
|
||||||
to_share -= count;
|
to_share -= count;
|
||||||
}
|
}
|
||||||
tracer_maybe_unpark_workers(heap_tracer(trace->worker->heap));
|
tracer_maybe_unpark_workers(trace->worker->tracer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -218,7 +220,7 @@ trace_worker_should_continue(struct trace_worker *worker) {
|
||||||
if (worker->id != 0)
|
if (worker->id != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
struct gc_tracer *tracer = heap_tracer(worker->heap);
|
struct gc_tracer *tracer = worker->tracer;
|
||||||
|
|
||||||
for (size_t spin_count = 0;; spin_count++) {
|
for (size_t spin_count = 0;; spin_count++) {
|
||||||
if (atomic_load_explicit(&tracer->active_tracers,
|
if (atomic_load_explicit(&tracer->active_tracers,
|
||||||
|
@ -249,7 +251,7 @@ trace_worker_should_continue(struct trace_worker *worker) {
|
||||||
static struct gc_ref
|
static struct gc_ref
|
||||||
trace_worker_steal(struct local_tracer *trace) {
|
trace_worker_steal(struct local_tracer *trace) {
|
||||||
struct trace_worker *worker = trace->worker;
|
struct trace_worker *worker = trace->worker;
|
||||||
struct gc_tracer *tracer = heap_tracer(worker->heap);
|
struct gc_tracer *tracer = worker->tracer;
|
||||||
|
|
||||||
// It could be that the worker's local trace queue has simply
|
// It could be that the worker's local trace queue has simply
|
||||||
// overflowed. In that case avoid contention by trying to pop
|
// overflowed. In that case avoid contention by trying to pop
|
||||||
|
@ -272,7 +274,7 @@ trace_worker_steal(struct local_tracer *trace) {
|
||||||
static void
|
static void
|
||||||
trace_worker_trace(struct trace_worker *worker) {
|
trace_worker_trace(struct trace_worker *worker) {
|
||||||
struct gc_heap *heap = worker->heap;
|
struct gc_heap *heap = worker->heap;
|
||||||
struct gc_tracer *tracer = heap_tracer(heap);
|
struct gc_tracer *tracer = worker->tracer;
|
||||||
atomic_fetch_add_explicit(&tracer->active_tracers, 1, memory_order_acq_rel);
|
atomic_fetch_add_explicit(&tracer->active_tracers, 1, memory_order_acq_rel);
|
||||||
|
|
||||||
struct local_tracer trace;
|
struct local_tracer trace;
|
||||||
|
|
|
@ -18,7 +18,7 @@ static int
|
||||||
gc_tracer_init(struct gc_tracer *tracer, struct gc_heap *heap,
|
gc_tracer_init(struct gc_tracer *tracer, struct gc_heap *heap,
|
||||||
size_t parallelism) {
|
size_t parallelism) {
|
||||||
tracer->heap = heap;
|
tracer->heap = heap;
|
||||||
return simple_worklist_init(&heap_tracer(heap)->worklist);
|
return simple_worklist_init(&tracer->worklist);
|
||||||
}
|
}
|
||||||
static void gc_tracer_prepare(struct gc_tracer *tracer) {}
|
static void gc_tracer_prepare(struct gc_tracer *tracer) {}
|
||||||
static void gc_tracer_release(struct gc_tracer *tracer) {
|
static void gc_tracer_release(struct gc_tracer *tracer) {
|
||||||
|
|
|
@ -10,9 +10,6 @@ struct gc_heap;
|
||||||
/// To be implemented by collector.
|
/// To be implemented by collector.
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Initialize the tracer when the heap is created.
|
|
||||||
static inline struct gc_tracer* heap_tracer(struct gc_heap *heap);
|
|
||||||
|
|
||||||
// Visit all fields in an object.
|
// Visit all fields in an object.
|
||||||
static inline void trace_one(struct gc_ref ref, struct gc_heap *heap,
|
static inline void trace_one(struct gc_ref ref, struct gc_heap *heap,
|
||||||
void *trace_data) GC_ALWAYS_INLINE;
|
void *trace_data) GC_ALWAYS_INLINE;
|
||||||
|
|
|
@ -351,9 +351,6 @@ struct gc_mutator {
|
||||||
struct gc_mutator *next;
|
struct gc_mutator *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct gc_tracer* heap_tracer(struct gc_heap *heap) {
|
|
||||||
return &heap->tracer;
|
|
||||||
}
|
|
||||||
static inline struct mark_space* heap_mark_space(struct gc_heap *heap) {
|
static inline struct mark_space* heap_mark_space(struct gc_heap *heap) {
|
||||||
return &heap->mark_space;
|
return &heap->mark_space;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue