system_connector.cc 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "chromecast/browser/system_connector.h"
  5. #include "base/check_op.h"
  6. #include "base/threading/sequence_local_storage_slot.h"
  7. #include "content/public/browser/browser_task_traits.h"
  8. #include "content/public/browser/browser_thread.h"
  9. #include "mojo/public/cpp/bindings/pending_receiver.h"
  10. #include "mojo/public/cpp/bindings/pending_remote.h"
  11. namespace chromecast {
  12. namespace {
  13. base::SequenceLocalStorageSlot<service_manager::Connector>&
  14. GetConnectorStorage() {
  15. static base::SequenceLocalStorageSlot<service_manager::Connector> storage;
  16. return storage;
  17. }
  18. void BindReceiverOnMainThread(
  19. mojo::PendingReceiver<service_manager::mojom::Connector> receiver) {
  20. DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
  21. auto* main_thread_connector = GetSystemConnector();
  22. DCHECK(main_thread_connector)
  23. << "GetSystemConnector() called on background thread with no system "
  24. << "Connector set on the main thread.";
  25. main_thread_connector->BindConnectorReceiver(std::move(receiver));
  26. }
  27. } // namespace
  28. service_manager::Connector* GetSystemConnector() {
  29. auto& storage = GetConnectorStorage();
  30. if (!content::BrowserThread::IsThreadInitialized(
  31. content::BrowserThread::UI) ||
  32. content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) {
  33. return storage.GetValuePointer();
  34. }
  35. if (!storage) {
  36. mojo::PendingRemote<service_manager::mojom::Connector> remote;
  37. content::GetUIThreadTaskRunner({})->PostTask(
  38. FROM_HERE, base::BindOnce(&BindReceiverOnMainThread,
  39. remote.InitWithNewPipeAndPassReceiver()));
  40. storage.emplace(std::move(remote));
  41. }
  42. return storage.GetValuePointer();
  43. }
  44. void SetSystemConnector(std::unique_ptr<service_manager::Connector> connector) {
  45. if (!connector) {
  46. GetConnectorStorage().reset();
  47. return;
  48. }
  49. mojo::PendingRemote<service_manager::mojom::Connector> remote;
  50. connector->BindConnectorReceiver(remote.InitWithNewPipeAndPassReceiver());
  51. GetConnectorStorage().emplace(std::move(remote));
  52. }
  53. } // namespace chromecast