heapprofd: mitigate potential data race during UnwindingWorker destruction

UnwindingWorker instances are intended to have an associated worker
thread, which should be the only thread mutating the
not-otherwise-synchronized (i.e.  task_runner) state of the
UnwindingWorker. However, the way I originally implemented it using
base::ThreadTaskRunner turns out to be incorrect, as we're still
constructing and, more importantly, destructing, the UnwindWorker
instances on the *main* thread.

The potential race is either during final shutdown, or the reconnect
sequence (which self-destructs and recreates the owning producer
instance). The destructor ends up running on the main thread while the
task thread is potentially actively modifying its state.

I believe that moving the base::ThreadTaskRunner to be the last memeber
mitigates the issue. Though we should still fix it properly.

Note that the original comment about keeping the ThreadTaskRunner first
is bogus in retrospect.

Change-Id: I22a6ad8e986279d6c5db4532f708691ea98e7de5
1 file changed
tree: 7da927fd4279c500461ab3bda873b839db66743b
  1. bazel/
  2. build_overrides/
  3. buildtools/
  4. debian/
  5. docs/
  6. gn/
  7. include/
  8. infra/
  9. protos/
  10. src/
  11. test/
  12. tools/
  13. ui/
  14. .clang-format
  15. .gitignore
  16. .gn
  17. .style.yapf
  18. Android.bp
  19. Android.bp.extras
  20. BUILD
  21. BUILD.extras
  22. BUILD.gn
  23. codereview.settings
  24. heapprofd.rc
  25. LICENSE
  26. MODULE_LICENSE_APACHE2
  27. NOTICE
  28. OWNERS
  29. perfetto.rc
  30. PRESUBMIT.py
  31. README.chromium
  32. README.md
  33. TEST_MAPPING
  34. traced_perf.rc
  35. WORKSPACE
README.md

Perfetto - Performance instrumentation and tracing

Perfetto is an open-source project for performance instrumentation and tracing of Linux/Android/Chrome platforms and user-space apps.

See www.perfetto.dev for docs.

Contributing

See /docs/contributing.md for instructions.

The source-of-truth repo is Android's Gerrit. The GitHub repo is a read-only mirror.

Bugs

  • For bugs affecting Android or the tracing internals use the internal bug tracker (go/perfetto-bugs).
  • For bugs affecting Chrome use http://crbug.com, Component:Speed>Tracing label:Perfetto.

Community

You can reach us on our Discord channel. If you prefer using IRC we have an experimental Discord <> IRC bridge synced with #perfetto-dev on Freenode.