Le double arbre à cames en tête
L’implémentation d’NJN repose sur trois bibliothèques : DOHC, qui assure la gestion de la mémoire et qui procure un ensemble de structures de données génériques ; CHASSIS, qui encapsule les services du système d’exploitation de manière à assurer la portabilité des applications ; et enfin CABLES, qui se charge de gérer les communications sous la forme d’appel de services distants asynchrone. Ce chapitre décrit brièvement les points essentiels de ces trois bibliothèques. DOHC n’est pas fixé à la compilation et peut changer au cours de l’exécution. Il peut s’agir de données scalaires entières ou flottantes, mais aussi d’objets plus complexes tels que des tableaux dynamiques, des tables de hachages, etc. En associant DOHC est gérée par un ramasse- miette. Ce dernier peut travailler à espace mémoire limité et fixé, si bien que l’on peut contrôler efficacement les besoins mémoire des applicationsparticulier sur les cibles matérielles disposant de peu de mémoire. Ce ramasse- miette comporte cependant quelques inconvénients. Le compromis adopté, celui de la rapidité, conduit dans certaines configurations à confier à l’utilisateur la libération mémoire de certains objets. Nous aborderons ce point plus en détail. DOHC et de montrer les possibilités offertes par la bibliothèque dans son ensemble. La première section est assez générale. Elle traite de l’organisation et des principes généraux de DOHC. Dans la section suivante nous verrons comment DOHC permet de construire des structures et des objets avec la librairie CLUTCH. Nous verrons ensuite les mécanismes de sérialisation qui facilitent les échanges de données à travers fichiers et réseaux. Enfin nous aborderons la gestion mémoire proprement dite.
Les objets DOHC de base et les conteneurs
Nous abordons dans cette section la structure générale de la librairie DOHC. On tente de dégager des généralités sur son utilisation, de placer quelques repères sur les différentes familles d’objets et de fonctions qui la composent, etc. DOHC sont manipulés à travers des références génériques (pointeurs). DOHC se charge d’allouer dynamiquement l’espace mémoire dont ils ont besoin et de gérer leurs types au cours de l’exécution. Du point de vue de l’utilisateur, les objets DOHC sont tous de typepeu de place en mémoire pour tenir dans une variable de type dohc_objet_t. Ils sont donc gérés comme n’importe quelle variable du langage C, c’est-à-dire de façon automatique ou statique selon la nature et le contexte de leur définition. On trouvera dans cette famille le singleton nil, les entiers, les flottants, les pointeurs, les constantes symboliques et les erreurs.• On trouve ensuite les conteneurs qui se subdivisent en deux sous-familles : les conteneurs indexés dont la taille peut varier au cours de l’exécution (tableaux, listes, tables de hachage et chaines de caractères), et les tas dont la taille est définie à la création des objets (tas bruts et structures). Ces objets sont alloués dynamiquement.Les méthodes qui manipulent ces objets sont pour la plupart polymorphes. Leur comportement n’est évidemment pas tout-à-fait le même d’un objet à l’autre mais il a toujours un sens vis-à-vis de l’objet manipulé.
On dispose d’une collection de méthodes en _at() pour manipuler un conteneur élément par élément. Elles ont toutes en commun de travailler à partir d’indices : dohc_insert_at(), dohc_delete_at(), dohc_get_at(), dohc_set_at(), etc. Notons au passage que le premier élément d’un conteneur porte toujours l’indice 0, sauf lorsqu’il s’agit d’une table de hachage. DOHC pour fournir une couche objet. Les concepts de classe, d’objet, d’héritage simple, de polymorphisme, de fonction virtuelle, d’interface (au sens du langageLa structure d’information DOHC comprend le nom de la classe, la taille des objets correspondants en octets, la fonction d’initialisation par défaut à partir d’une table de hachage, la fonction de finalisation de l’objet et une fonction de conversion en table de hachage. Initialisation et fonction de conversion en table de hachage sont complémentaires et sont indispensables pour que l’objet puisse être sérialisé. CLUTCH implémente l’ensemble des concepts de la programmation orientée objet. Pour pouvoir utiliser toutes les fonctionnalités de CLUTCH il faudrait y consacrer de nombreuses pages sans que celles-ci soient d’un intérêt fondamental pour cet exposé. Nous préférons pour cette raison nous en tenir à cette brève introduction. CLUTCH dépourvus de fonction de conversion en HTable), DOHC construit une référence appelée (Handle) qui, à défaut de permettre de transmettre l’objet à travers le réseau, assure de pouvoir le retrouver si la dite référence est désérialisée dans l’espace mémoire DOHC où est réellement situé l’objet. Cette possibilité permettra d’implémenter les communications entre objets distants dans NJN.