Fix priority inversion with protobufs initialization on Windows

This CL is fixing a priority inversion caused by process-wide lock used
to guard recursive protobufs initialization.

Protobuf are lazily initialized and inner protobufs are recursively
initialized at that same time. To avoid conflicts (parallel loading)
a lock is used to ensure only one thread is currently loading some
protobufs definition.

The priority inversion is caused when a background thread is creating
a protobuf and needs to load it. Any attempt to initialize a other
protobuf (even not related) will be blocked until the completion of
the background loading.

This CL is proposing to boost thread priority while loading protobuf.
Since protobuf are lazily loaded, they can only be loaded once.


Example:
  68fee496149cd484

Main Thread:
  NtWaitForAlertByThreadId
  RtlAcquireSRWLockExclusive
  google::protobuf::internal::InitSCCImpl
  autofill::AutofillPageQueryRequest::AutofillPageQueryRequest

Background Thread:
  InitDefaultsscc_info_VisualFeatures_ColorHistogramBin_components_2fsafe_5fbrowsing_2fcore_2fproto_2fcsd_2eproto
  [...]
  google::protobuf::internal::`anonymous namespace'::InitSCC_DFS
  google::protobuf::internal::InitSCCImpl
  safe_browsing::ClientSideModel::ClientSideModel


Bug: 1218253
Change-Id: I145cf2087bc2189ec14998ec594b4042c0a09cc2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3076381
Commit-Queue: Etienne Bergeron <etienneb@chromium.org>
Reviewed-by: Avi Drissman <avi@chromium.org>
Reviewed-by: Leonard Grey <lgrey@chromium.org>
Cr-Commit-Position: refs/heads/master@{#910346}
8 files changed
tree: b6fee82521585a3e7633443d75d75f486cc4d2b0
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. cloud_print/
  13. codelabs/
  14. components/
  15. content/
  16. courgette/
  17. crypto/
  18. dbus/
  19. device/
  20. docs/
  21. extensions/
  22. fuchsia/
  23. gin/
  24. google_apis/
  25. google_update/
  26. gpu/
  27. headless/
  28. infra/
  29. ios/
  30. ipc/
  31. jingle/
  32. media/
  33. mojo/
  34. native_client_sdk/
  35. net/
  36. pdf/
  37. ppapi/
  38. printing/
  39. remoting/
  40. rlz/
  41. sandbox/
  42. services/
  43. skia/
  44. sql/
  45. storage/
  46. styleguide/
  47. testing/
  48. third_party/
  49. tools/
  50. ui/
  51. url/
  52. weblayer/
  53. .clang-format
  54. .clang-tidy
  55. .eslintrc.js
  56. .git-blame-ignore-revs
  57. .gitattributes
  58. .gitignore
  59. .gn
  60. .mailmap
  61. .vpython
  62. .vpython3
  63. .yapfignore
  64. AUTHORS
  65. BUILD.gn
  66. CODE_OF_CONDUCT.md
  67. codereview.settings
  68. DEPS
  69. DIR_METADATA
  70. ENG_REVIEW_OWNERS
  71. LICENSE
  72. LICENSE.chromium_os
  73. OWNERS
  74. PRESUBMIT.py
  75. PRESUBMIT_test.py
  76. PRESUBMIT_test_mocks.py
  77. README.md
  78. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure .

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.

If you found a bug, please file it at https://crbug.com/new.