mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-28 05:50:30 +02:00
trace_worker_steal first does a try_pop on its own deque
Before asking other threads for values, see if there is any pending data that overflowed from the local mark stack.
This commit is contained in:
parent
8b8ddaf6e2
commit
1e3122d054
1 changed files with 10 additions and 0 deletions
|
@ -547,6 +547,16 @@ trace_worker_steal(struct local_tracer *trace) {
|
||||||
struct tracer *tracer = heap_tracer(trace->heap);
|
struct tracer *tracer = heap_tracer(trace->heap);
|
||||||
struct trace_worker *worker = trace->worker;
|
struct trace_worker *worker = trace->worker;
|
||||||
|
|
||||||
|
// It could be that the worker's local trace queue has simply
|
||||||
|
// overflowed. In that case avoid contention by trying to pop
|
||||||
|
// something from the worker's own queue.
|
||||||
|
{
|
||||||
|
DEBUG("tracer #%zu: trying to pop worker's own deque\n", worker->id);
|
||||||
|
struct gc_ref obj = trace_deque_try_pop(&worker->deque);
|
||||||
|
if (gc_ref_is_heap_object(obj))
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
DEBUG("tracer #%zu: trying to steal\n", worker->id);
|
DEBUG("tracer #%zu: trying to steal\n", worker->id);
|
||||||
struct gc_ref obj = trace_worker_steal_from_any(worker, tracer);
|
struct gc_ref obj = trace_worker_steal_from_any(worker, tracer);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue