sandbox_pattern_libvlccore.tex 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. \section{Utilisation d'objets proxy}
  2. Nous allons alors utiliser les différentes abstractions mises en place
  3. précédemment pour la communication inter-processus, que ce soit pour le
  4. transfert de données de contrôle pour les RPC ou des données applicatives avec
  5. les blocs mémoires. C'est ici qu'intervient le découpage de l'application en
  6. différents morceaux ainsi que les méthodes synchrones qu'on va utiliser pour
  7. pouvoir les relier sans altérer le fonctionnement actuel. On va donc également
  8. devoir définir quels seront les points d'entrées pour la sandbox, c'est-à-dire
  9. la manière dont la sandbox va pouvoir s'injecter dans le code existant.
  10. Le pattern utilisé ici sera principalement d'avoir un objet proxy pour tous les
  11. objets qui seront utilisé entre processus.
  12. Dans cette partie, nous allons majoritairement prendre en considération le cas
  13. du découpage du décodeur, ainsi que des objets étant directement lié à son
  14. fonctionnement.
  15. % TODO: graphe d'interaction du décodeur
  16. \section{Intégration des objets proxys dans l'architecture}
  17. Le décodeur est dans notre cas créé via l'appel à \inltype{input_DecoderNew}. On
  18. va donc stocker une nouvelle table de fonctions dans la libvlc, dont l'une
  19. \inltype{pf_create_stage} indiquera comment créer un étage donné. On peut alors
  20. surcharger \inltype{input_DecoderNew} poour appeler \inltype{pf_create_stage} et
  21. initialiser cette dernière à des valeurs différentes selon si on démarre en
  22. sandbox ou non. Cela justifie notamment les pointeurs \inltype{create_vlc} et
  23. \inltype{delete_vlc} dans la configuration de lancement de la sandbox.
  24. \begin{code}{c}{Création du décodeur}
  25. decoder_t *input_DecoderNew( input_thread_t *p_input,
  26. es_format_t *fmt, input_clock_t *p_clock,
  27. sout_instance_t *p_sout )
  28. {
  29. return vlc_CreateStage( VLC_OBJECT(p_input), STAGE_DECODER,
  30. p_input, fmt, p_clock, p_sout );
  31. }
  32. \end{code}
  33. Le décodeur fonctionne dans son propre thread et subit des interactions
  34. principalement depuis l'objet \inltype{input} via l'API de fonctions commençant
  35. par \inltype{input_Decoder}. On va donc rajouter une table virtuelle dans
  36. l'objet représentant le décodeur pour pouvoir changer de stratégie lors de sa
  37. création.
  38. Ce pattern va être présent pour tous les objets qui sont fonctionnellement liés
  39. au décodeur. En particulier, on a par exemple l'input et le décodeur proxy dans
  40. un processus, puis l'input proxy et le décodeur dans un autre, donnant lieu à la
  41. situation suivante.
  42. \begin{figure}[htbp]
  43. \centering
  44. \includesvg[width = 250pt]{schemas/decoder_proxy}
  45. \caption{Proxy input et décodeur avec le modèle}
  46. \end{figure}
  47. Les paragraphes précédents décrivent la création d'un décodeur depuis le
  48. processus de l'input, mais on voit au graphe précédent qu'il faut également
  49. pouvoir faire un proxy de l'input dans le processus du décodeur, c'est-à-dire
  50. pouvoir «transmettre» l'input d'un processus à l'autre. Nous allons donc
  51. reprendre le concept de jeton d'accès et permettre l'envoi d'objet proxy à
  52. travers une IPC.\@ Il faut alors détailler ces objets proxies du point de vue de
  53. l'envoi de message.
  54. \begin{code}{c}{Structure privée d'un objet proxy}
  55. struct vlc_rpc_proxy_t
  56. {
  57. vlc_process_interconn_t *interconn;
  58. uint32_t id;
  59. uint32_t stage_id;
  60. void *p_this;
  61. vlc_rpc_proxy_cb call;
  62. };
  63. \end{code}
  64. Chaque objet proxy dispose de cette structure. \inltype{interconn} indique la
  65. méthode de communication pour rejoindre l'autre étage dans un autre processus.
  66. \inltype{stage_id} indique au broker quel processus contacter pour l'envoi.
  67. Enfin, tous les objets proxies disposent d'un identifiant unique au processus,
  68. permettant d'envoyer ou recevoir des RPC.\@ En cas de réception, \inltype{call}
  69. sera appelé.
  70. \begin{code}{c}{Fonction de rappel pour les proxies}
  71. typedef void (*vlc_rpc_proxy_cb)(vlc_rpc_proxy_t *p_proxy,
  72. uint32_t i_query,
  73. vlc_process_msg_t *p_msg);
  74. \end{code}
  75. Comme ces objets seront «transmis», il faut alors seulement définir des méthodes
  76. pour créer un \inltype{vlc_rpc_proxy_t} depuis un objet existant, et créer un
  77. objet proxy à partir d'un \inltype{vlc_rpc_proxy_t}.
  78. \section{Avantages et limites}
  79. Commençons par des désavantages liées à cette méthode par rapport à la
  80. précédente. D'abord, bien qu'apportant l'isolation demandée au chapitre
  81. précédent, elle demande bien plus de travail d'intégration. En plus de cela, on
  82. voit avec la relation entre l'input et le décodeur que la méthode est beaucoup
  83. soumise aux défauts ou aux difficultés d'architecture du projet et qu'il devient
  84. nécessaire d'effectuer des réécritures de certaines parties.
  85. Un exemple non présenté ici est celui de la réécriture de
  86. l'\inltype{input_clock} en \inltype{vlc_clock}, pour des raisons différentes
  87. mais apportant plus de flexibilité pour ce modèle.
  88. De plus, beaucoup d'abstraction doit être apportée sous la forme de tables
  89. virtuelles dans les différents objets de VLC.\@ Bien que pouvant apporter de la
  90. flexibilité, cela demande beaucoup de transfor,ation sur la manière de
  91. programmer dans l'application en général.
  92. Enfin, comme expliqué dans le chapitre sur la boucle événementielle, toutes les
  93. opérations, et en particulier les RPC dans des RPC ne sont pas possibles et
  94. limmitent particulièrement la conception de ce modèle.
  95. Néanmoins, ces défauts peuvent être considérés comme des incitations à améliorer
  96. la conception générale de l'application en donnant une ligne directrice très
  97. claire.