[XProto] Ensure x11::Connection is only used on a single thread

This fixes bug 1109422 which is caused by using the same
x11::Connection from both the GPU main thread and the viz compositor
thread.

Summary of changes:

* x11::Connection is now stored in TLS instead of as a singleton.  This
  does not affect the browser process, but it means the GPU process
  will now have 2 connections: 1 for the main thread and 1 for the viz
  compositor thread.  Additionally, chrome will have 3 connections
  when running in single-process-mode.

* In X11 and Ozone/X11 contexts, the viz compositor thread must be a
  UI thread now so it can dispatch X events.  This required making
  MessagePumpGlib compatible with multiple threads.

* The GPU sandbox presents a challenge: we cannot open an X11
  connection once it's up, since the socket() and connect()
  syscalls are blocked.  To workaround this, we must open the viz
  compositor X11 connection the same time we open the main thread's
  X11 connection.  For now, we stuff it in ui::X11UiThread as an
  obnoxious global variable.

XShmImagePool and X11SoftwareBitmapPresenter are simplified as they
are now only used on one thread.  Also CreateVizCompositorThread() no
longer requires a TaskRunner argument.

With this change, once we remove the rest of Xlib, we can remove any
locking when using X11.

BUG=1066670,1078392,1109422
R=nickdiego,sky,msisov,rjkroege

Change-Id: If122c071a2eef38ba0469fe592ab9cc71ccf6011
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2343314
Auto-Submit: Thomas Anderson <thomasanderson@chromium.org>
Reviewed-by: Sadrul Chowdhury <sadrul@chromium.org>
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
Reviewed-by: Robert Kroeger <rjkroege@chromium.org>
Reviewed-by: Maksim Sisov (GMT+3) <msisov@igalia.com>
Reviewed-by: Nick Yamane <nickdiego@igalia.com>
Reviewed-by: kylechar <kylechar@chromium.org>
Commit-Queue: Thomas Anderson <thomasanderson@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799697}
45 files changed
tree: 78679193d691939774da694f58044c1f43fbcc48
  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. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. jingle/
  31. media/
  32. mojo/
  33. native_client_sdk/
  34. net/
  35. pdf/
  36. ppapi/
  37. printing/
  38. remoting/
  39. rlz/
  40. sandbox/
  41. services/
  42. skia/
  43. sql/
  44. storage/
  45. styleguide/
  46. testing/
  47. third_party/
  48. tools/
  49. ui/
  50. url/
  51. weblayer/
  52. .clang-format
  53. .clang-tidy
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitattributes
  57. .gitignore
  58. .gn
  59. .vpython
  60. .vpython3
  61. .yapfignore
  62. AUTHORS
  63. BUILD.gn
  64. CODE_OF_CONDUCT.md
  65. codereview.settings
  66. DEPS
  67. DIR_METADATA
  68. ENG_REVIEW_OWNERS
  69. LICENSE
  70. LICENSE.chromium_os
  71. OWNERS
  72. PRESUBMIT.py
  73. PRESUBMIT_test.py
  74. PRESUBMIT_test_mocks.py
  75. README.md
  76. 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.

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.