Migração de IPC Legado do Chrome para Mojo

O sistema de IPC (Inter-Process Communication) legado do Chrome, centralizado no diretório //ipc, foi substituído pelo Mojo. A migração de mensagens legadas para o Mojo é essencial para a modernização da infraestrutura do navegador, garantindo maior escalabilidade e isolamento.

Abordagem de Migração

A arquitetura legada baseava-se em um único canal (FIFO) entre processos, o que frequentemente resultava em dependências de ordenação implícitas e acoplamento excessivo. Ao converter para Mojo, o objetivo principal é a decomposição em serviços independentes ou interfaces isoladas.

1. Transição para Serviços

Sempre que possível, mensagens devem ser movidas para serviços definidos em //services. Isso promove o desacoplamento e permite o versionamento claro das interfaces públicas.

2. Interfaces Independentes vs. Associadas

Por padrão, conexões Mojo operam de forma independente. Se a ordenação das mensagens for crítica — algo comum em navegação e frames —, deve-se utilizar interfacse associadas (Channel-associated interfaces), que preservam a ordem FIFO em relação ao canal legado durante o período de transição.

Exemplo Prático: Definição de Interface

Para migrar um sistema simples de decodificação, defina a interface em um arquivo .mojom:

module processamento.mojom;

interface Decodificador {
 Executar(array<uint8> dados) => (int32 status, array<uint8> resultado);
};

A implementação no lado do servidor deve registrar o binder correspondente:

class DecodificadorImpl : public processamento::mojom::Decodificador {
public:
 static void CriarBinding(processamento::mojom::DecodificadorRequest request) {
   mojo::MakeStrongBinding(std::make_unique<DecodificadorImpl>(), std::move(request));
 }

 void Executar(const std::vector<uint8_t>& dados, ExecutarCallback callback) override {
   // Lógica de decodificação
 }
};

Uso do Connector

O Connector é a peça fundamental para interações entre serviços. Em processos de renderização, utilize o ServiceManagerConnection para estabelecer a conexão:

processamento::mojom::DecodificadorPtr decodificador;
content::RenderThread::Get()->GetConnector()->BindInterface(
   "nome_do_servico", &decodificador);
decodificador->Executar(dados_brutos, base::BindOnce(&OnResultado));

Tratamento de Tipos Nativos

Caso precise reutilizar estruturas C++ existentes sem redefini-las no Mojo, utilize o atributo [Native]:

[Native]
struct EstruturaComplexa;

O mapeamento deve ser configurado via arquivo .typemap, apontando para os traits de serialização legados (IPC::ParamTraits). Isso permite que a estrutura seja transmitida pelo Mojo utilizando a lógica de serialização já existente, minimizando riscos durante a migração.

Tags: Chromium Mojo IPC C++ SistemasDistribuídos

Publicado em 6-21 18:54