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).