1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- // Copyright 2021 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef CHROMEOS_LACROS_LACROS_SERVICE_NEVER_BLOCKING_STATE_H_
- #define CHROMEOS_LACROS_LACROS_SERVICE_NEVER_BLOCKING_STATE_H_
- #include <utility>
- #include "base/memory/weak_ptr.h"
- #include "base/sequence_checker.h"
- #include "chromeos/crosapi/mojom/crosapi.mojom.h"
- #include "mojo/public/cpp/bindings/pending_receiver.h"
- #include "mojo/public/cpp/bindings/pending_remote.h"
- #include "mojo/public/cpp/bindings/remote.h"
- namespace chromeos {
- // This class that holds all state associated with LacrosChromeService that is
- // affine to a single, never-blocking sequence. The sequence must be
- // never-blocking to avoid deadlocks, see https://crbug.com/1103765.
- //
- // This class is considered an implementation detail of LacrosService.
- // It exists as a standalone class/file because template member functions must
- // be defined in header files.
- class LacrosServiceNeverBlockingState {
- public:
- LacrosServiceNeverBlockingState();
- ~LacrosServiceNeverBlockingState();
- // Crosapi is the interface that lacros-chrome uses to message
- // ash-chrome. This method binds the remote, which allows queuing of message
- // to ash-chrome. The messages will not go through until
- // RequestCrosapiReceiver() is invoked.
- void BindCrosapi();
- void FusePipeCrosapi(
- mojo::PendingRemote<crosapi::mojom::Crosapi> pending_remote);
- void OnBrowserStartup(crosapi::mojom::BrowserInfoPtr browser_info);
- // Calls the indicated Bind* function on the crosapi interface with the given
- // receiver.
- template <typename ReceiverType,
- void (crosapi::mojom::Crosapi::*bind_func)(ReceiverType)>
- void BindCrosapiFeatureReceiver(ReceiverType receiver) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- (crosapi_.get()->*bind_func)(std::move(receiver));
- }
- base::WeakPtr<LacrosServiceNeverBlockingState> GetWeakPtr();
- private:
- // This remote allows lacros-chrome to send messages to ash-chrome.
- mojo::Remote<crosapi::mojom::Crosapi> crosapi_;
- // This class holds onto the receiver for Crosapi until ash-chrome
- // is ready to bind it.
- mojo::PendingReceiver<crosapi::mojom::Crosapi> pending_crosapi_receiver_;
- SEQUENCE_CHECKER(sequence_checker_);
- base::WeakPtrFactory<LacrosServiceNeverBlockingState> weak_factory_{this};
- };
- } // namespace chromeos
- #endif // CHROMEOS_LACROS_LACROS_SERVICE_NEVER_BLOCKING_STATE_H_
|