API de Incorporação do Mojo Core

A API de Incorporação do Mojo Core permite que processos inicializem e utilizem o Mojo para comunicação entre processos (IPC), empregando uma implementação do Mojo Core vinculada estaticamente à aplicação. A menos que você esteja introduzindo um novo ponto de entrada binário no sistema (por exemplo, um novo executável com uma definição de main()), geralmente não é necessário conhecer esta API. A maioria dos processos definidos no repositório do Chrome já inicializa totalmente o Mojo Core, garantindo que todas as outras APIs públicas do Mojo funcionem imediatamente.

Inicialização Básica

Para um incorporador, inicializar o Mojo Core requer uma única chamada para mojo::core::Init:

#include "mojo/core/embedder/embedder.h"

int executar(int argc, char** argv) {
  mojo::core::Init();

  // Agora é possível criar canais de mensagens, enviar mensagens, etc.

  return 0;
}

Isso ativa chamadas locais à API, permitindo a criação e uso de canais de mensagens. Em muitos casos, particularmente em cenários de testes unitários, isso é suficiente. No entanto, para suportar comunicação multiproceso real (como enviar ou aceitar convites do Mojo), uma etapa adicional de inicialização do IPC é necessária.

Inicialização do IPC

A implementação interna de IPC do Mojo requer um TaskRunner em segundo plano para monitorar entradas de E/S de outros processos. Isso é configurado com um objeto ScopedIPCSupport, que mantém o suporte IPC ativo durante sua vida útil.

Normalmente, uma aplicação cria uma thread dedicada em segundo plano e fornece seu TaskRunner ao Mojo. No Chromium, utiliza-se a thread de E/S existente no processo do navegador e nos processos filhos de conteúdo. Em geral, qualquer thread usada para suporte IPC do Mojo deve executar um loop base::MessageLoop::TYPE_IO.

#include "base/threading/thread.h"
#include "mojo/core/embedder/embedder.h"
#include "mojo/core/embedder/scoped_ipc_support.h"

int executar(int argc, char** argv) {
  mojo::core::Init();

  base::Thread thread_io("io_thread");
  thread_io.StartWithOptions(
      base::Thread::Options(base::MessageLoop::TYPE_IO, 0));

  // Enquanto este objeto existir, toda a API do Mojo relacionada a conexões IPC estará disponível, e canais de mensagens entre processos continuarão funcionando.
  mojo::core::ScopedIPCSupport suporte_ipc(
      thread_io.task_runner(),
      mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);

  return 0;
}

Este processo agora está totalmente preparado para usar o IPC do Mojo. Note que todos os tipos de processos existentes no Chromium já realizam essa configuração durante a inicialização.

Conectando Dois Processos

Com o IPC inicializado, é possível estabelecer conexões com outros processos usando a API pública de Convites (Invitations).

Tags: Mojo IPC C++ Chromium embedder-api

Publicado em 7-23 14:19