\section{Motivation}

Chacun des morceaux de l'architecture de VLC se retrouvant isolé dans des
processus indépendant, on a besoin d'un moyen de créer une communication
inter-processus. Plus encore, on a besoin de pouvoir transférer la capacité de
communiquer d'un processus à l'autre de façon à contrôler de façon fiable les
autorisations de chaque processus.

La communication entre les processus est importante car il s'agit de la base
pour pouvoir effectuer des appels de fonctions distants -- ou RPC pour Remote
Procedure Call.  Cela va notamment nous servir à reproduire le modèle
d'exécution actuel de VLC pour le faire progressivement évoluer vers une
architecture plus découplée et moins contrainte.

Bien entendu, reproduire l'architecture de VLC implique que les RPCs puissent
renvoyer des valeurs et il faut donc que la communication entre deux étages soit
systématiquement bidirectionnelle si elle existe.

\section{Simplification vers le modèle broker}

La situation n'est pas totalement la même entre une architecture broker et une
architecture orchestrateur, mais nous allons voir que l'on peut se ramener de la
seconde à la première sans perte d'abstraction dès lors qu'on peut produire des
jetons d'accès pour les IPC.

On peut en effet réaliser la construction suivante. On représente chaque lien
entre deux processus par une paire d'objets \inltype{vlc_process_ipc_t}
distribuée entre les deux processus. Il s'agit alors du modèle orchestrateur.

Maintenant on le modifie pour casser le lien en deux et passer avec une
architecture broker. Chaque lien devient donc une paire de lien avec d’abord une
connexion worker-broker puis une autre connexion broker-worker. Le broker
s’assure ainsi de faire le routage et vérifier les accès.

On a donc découplé le fonctionnement du worker de la politique d’accès choisie.
Cette propriété est très importante pour la suite, car elle permet de construire
le modèle puis d’adapter l’implémentation à ce qui se rapproche le plus du
fonctionnement du système sous-jacent.

En pratique, ce comportement est actuellement obtenu avec de simples indices,
n'apportant pas la garantie de sécurité attendue pour une sandbox mais
permettant de tester et déboguer plus facilement le comportement de
l'application en multiprocessus.

\section{Abstraction des messages et RPC}

% TODO: framework de sérialisation
% TODO: format du message envoyés (header)
% TODO: framework d'envoi et de réception
% TODO: implémentation broker

On a également besoin d'un moyen de sérialiser et envoyer des messages pour
construire les appels de fonctions déportés (RPC, pour Remote Procedure Call)
qui vont nous permettre de conserver le même modèle d'exécution qu'en
multithread.

N'étant pas le sujet principal et étant un problème déjà résolu de beaucoup de
façon différentes, mon implémentation de ces messages est réduite à l'essentiel
et permet d'une part de créer des messages avec \inltype{vlc_process_msg_new},
puis d'autre part de sérialiser ou désérialiser des données dedans à partir de
fonctions du type \inltype{vlc_msg_recv_{type}} ou
\inltype{vlc_msg_append_{type}}.

Étant donnée que l'architecture précédente est simulée avec des indices,
les messages doivent indiquer le processus de destination. Ils doivent également
indiquer l'action à effectuer, correspondant à une table indice vers type de RPC
appelable.

\section{Abstraction des moyens de communication}

Pour masquer les détails de l'implémentation du bus de communication entre les
processus, on introduit le type \inltype{vlc_process_ipc_t} qui est capable de
stocker ce bus bidirectionnel et on construit les fonctions de communication
dessus.

En particulier, on va retrouver deux fonctions principales. Tout d'abord,
\inltype{vlc_ipc_SendMsg} permet à partir d'envoyer un message et ses
descripteurs de fichier sur une IPC, puis \inltype{vlc_ipc_RecvMsg} qui
allouera le message et récupèrera les descripteurs de fichiers.

\begin{code}{c}{Prototypes des fonctions d'envoi de messages}
VLC_API int
vlc_ipc_SendMsg( vlc_process_ipc_t *p_ipc, vlc_process_msg_t *p_msg );

VLC_API int
vlc_ipc_RecvMsg( vlc_process_ipc_t *p_ipc, vlc_process_msg_t **pp_msg );
\end{code}
