sammccall added inline comments.

================
Comment at: clang-tools-extra/clangd/TUScheduler.cpp:1054
     Requests.push_back({std::move(Task), std::string(Name), 
steady_clock::now(),
-                        std::move(Ctx), Update, Invalidation,
-                        std::move(Invalidate)});
+                        std::move(Ctx), std::move(QueueCtx), Update,
+                        Invalidation, std::move(Invalidate)});
----------------
kadircet wrote:
> what if we just pushed the span here and kept it alive in the queue? it is 
> move-able at the moment.
> 
> our tracing contract seem to be saying beginSpan/endSpan calls would always 
> form a proper stack, i am not sure about its importance to the jsontracer, 
> but I don't think rest of our tracers cares (and i think it would be nice for 
> that trace to actually span the whole time in queue).
> what if we just pushed the span here and kept it alive in the queue?
Mechanically it's a little more complicated than that, but I get what you're 
saying - unfortunately it doesn't quite work.

> it is move-able at the moment.
(in fact not: it has a WithContext member whose move operators are deleted)

> our tracing contract seem to be saying beginSpan/endSpan calls would always 
> form a proper stack
Yes - this is in fact documented as the *only* point of endSpan - it marks the 
strictly-stacking lifetimes of stack-allocated trace::Spans objects themselves. 
Tracers that don't need this strict stacking are supposed to watch for the 
destruction of the context frames created by beginSpan instead. This extends 
the span over context-propagation, at the cost of no longer strictly stacking.

> i am not sure about its importance to the jsontracer
The chrome trace viewer (which jsontracer targets) really does require strict 
stacking. I'm not 100% sure, but I think the behavior was just to silently 
discard events that don't nest properly.

> I don't think rest of our tracers cares (and i think it would be nice for 
> that trace to actually span the whole time in queue).
Right, so our private out-of-tree tracer follows request/context timelines 
rather than thread ones, and doesn't require strict nesting. It completely 
ignores endSpan(), and ends events when the context gets destroyed instead. 
That's why we bundle up the QueueCtx into the request and then destroy it as 
soon as we dequeue - it makes that trace actually span the whole time in queue 
:-)

(Happy to chat more about this or add some comments/diagrams/something if we 
should make this more clear)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96027/new/

https://reviews.llvm.org/D96027

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to