Organisation de la mémoire ========================== .. image:: images/Shape1.gif .. _RefSchema_Shape1.gif: JEVEUX alloue dynamiquement chaque zone mémoire destinée à accueillir les valeurs associées à l'objet ou à la collection d'objets. Un contrôle de l'espace cumulé est effectué lors de chaque nouvelle allocation, et un mécanisme de déchargement peut éventuellement être mis en œuvre pour libérer des espaces de la mémoire associés aux objet que le développeur à déclaré comme n'étant plus utilisé. Sur les plates-formes 64 bits, l'allocation de la zone mémoire est réalisée dynamiquement à l'aide de la routine système HPALLOC. Cette zone est vue dans le logiciel à travers le tableau de type entier (INTEGER*8 ISZON) de longueur LISZON et d'une adresse de début JISZON. Il est stocké dans le commun /IZONJE/. On utilisera dans la suite du document le terme "mot" pour désigner l'unité d'adressage. Sur plate-forme 64 bits le mot a pour longueur 8 octets et correspond à longueur du type INTEGER*8. La zone est gérée mot par mot en unité de type INTEGER (unité d'adressage), les segments de valeurs associés aux objets JEVEUX sont encadré par 8 mots contenant, dans cet ordre, les informations suivantes : 1. l'adresse suivant le dernier mot constituant le segment de valeurs et les 8 identificateurs; 2. la valeur d'un décalage utilisé pour aligner les segments de type de longueur supérieure à l'unité d'adressage. Sur plate-forme 64 bits, cette valeur est toujours nulle pour les segments de valeurs associés à des objets de type INTEGER et REAL*8. Elle vaut 8 (octets) parfois pour les segments des valeurs associés à des objets de type COMPLEX*16 : en effet il arrive que le début du segment de valeur (position 5) ne puisse coïncider avec une position dans le tableau de référence ZK16, il faut alors se déplacer d'un mot (8 octets). C'est encore plus fréquent avec le type CHARACTER lorsqu'il vaut 16, 32 ou 80 ! 3. l'identificateur entier associé aux objets simples ou aux collections ; 4. le statut du segment de valeurs qui peut prendre la valeur X ou U (codé sur un entier); 5. l'état du segment de valeurs qui peut prendre la valeur X, A ou D (codé sur un entier);; 6. l'identificateur entier associé aux objets de collection ; 7. le code de la classe associée à l'objet JEVEUX ; 8. l'adresse du premier mot précédant le segment de valeurs et les 8 identificateurs. La gestion de la zone mémoire avec le type INTEGER ne permet pas de s'aligner correctement avec les types de longueur supérieure à cette unité d'adressage. Bien que l'ordre EQUIVALENCE présent dans le logiciel permette d'aligner l'adresse initiale des différentes variables (tableaux) de référence ZI, ZI4, ZR, ZC, ZL, ZK8, ZK16, ZK24, ZK32 et ZK80, le positionnement d'un segment de valeurs associé à un objet de type ZK32 a peu de chance d'être aligné avec un "multiple" de 4 du tableau ISZON sur plate-forme 64 bits, d'où la nécessité de gérer un décalage parmi les descripteurs. Les valeurs permettant de coder le statut et l'état du segment de valeurs sont obtenues de façon à ce que la représentation ne corresponde à aucun type utilisé au sein du segment de valeurs et ce afin de détecter les éventuels écrasements de ces descripteurs. Ce rôle est dévolu à la routine JJLIRS qui est appelée principalement lors des requêtes de mise en mémoire du segment de valeurs. L'émission d'un message d'erreur du type "ECRASEMENT AMONT POSSIBLE ..." indique que l'identificateur (3) ou le statut (4) ont été écrasés, l'émission d'un message d'erreur du type "ECRASEMENT AVAL POSSIBLE ..." indique que l'état (5) ou la classe (7) ont été écrasés. Sur plate-forme 64 bits, les valeurs utilisées ont la représentation octale suivante: .. csv-table:: "0100000000000000000000", "pour X,", "0300000000000000000000", "pour A," "0200000000000000000000", "pour U,", "0400000000000000000000", "pour D." **Usage des segments de valeurs** Le couple état/statut permet de connaître l'usage d'un segment de valeurs en mémoire : * XX indique que le segment de valeurs est libre, cette position est directement utilisable, * UA indique que le segment de valeurs est utilisé en lecture (son image disque ne sera pas actualisée après libération), * UD indique que le segment de valeurs est utilisé en écriture (son image disque sera actualisée après libération), * XD indique que le segment de valeurs a été libéré, mais que son contenu devra être déchargé sur disque, * XA indique que le segment de valeurs a été libéré, cette position est directement utilisable.