4. Gestion des libérations#

La libération est le mécanisme le plus complexe mis en œuvre dans JEVEUX. On conçoit aisément que lorsque que l’on gère un espace mémoire fini, il arrive un moment où il n’est plus possible de trouver de place. Il faut alors provoquer des déchargements sur disque ou bien récupérer la place des zones devenues inutiles. JEVEUX prend en charge ces mécanismes, à condition bien sûr, que le programmeur lui ait indiqué les objets concernés ; il est nécessaire de prendre certaines précautions avant de libérer un objet, plusieurs unités de programme pouvant utiliser simultanément une adresse mémoire. La stratégie de libération fait appel d’une part à un mécanisme interne au gestionnaire de mémoire que nous allons décrire et d’autre part à des règles de programmation qui font l’objet du document [D2.06.99] « Nouvelle stratégie de libération des objets JEVEUX ».

La libération d’un segment de valeurs se matérialise par le positionnement à la valeur X de l’état en lieu et place de la valeur U. Il n’y a pas d’autre effet immédiat, ce n’est que lors d’une recherche ultérieure de position en mémoire que l’on traitera effectivement le contenu du segments de valeurs.

La mise en mémoire d’un objet JEVEUX s’accompagne de l’affectation d’un attribut système : la marque. Cet attribut, de type entier, prend la valeur d’un compteur incrémenté à chaque appel à la routine JEMARQ et décrémenté à chaque appel à la routine JEDEMA. Il est possible d’obtenir la valeur de la marque courante en appelant la routine JEVEMA.

Les marques courantes ont ainsi une valeur strictement positive. Les valeurs -1, -2 et -3 sont utilisées pour traiter les exceptions suivantes.

La valeur -1 est utilisée pour garder en permanence (tout au long de l’exécution d’une commande Aster) certains objets qui seront libérés par un appel spécifique. Cette marque est utilisée lors de l’appel à la routine JEVEUT.

La valeur -2 est utilisée par JEVEUX pour ramener de façon temporaire certains objets qui seront libérés aussitôt l’action terminée (mise en mémoire des objets système de collection, …).

La valeur -3 est utilisée pour garder en permanence (tout au long de l’exécution de Code_Aster ) les objets utilisés par le Superviseur.

La marque -3 peut venir en remplacement de toute marque existante, la marque -1 peut remplacer une marque (positive) existante. L’objet système contenant la liste des adresses des segments de valeurs doit alors être modifié. La marque -3 est utilisée lors de l’appel à la routine JEVEUS.

On construit ainsi une hiérarchie des segments de valeurs associés aux objets. Chaque appel à la routine JEDEMA va provoquer la libération des segments de valeurs possédant la marque courante. Afin d’optimiser les libérations entraînées par un appel à JEDEMA, la mise en mémoire de chaque segment de valeurs s’accompagne du stockage de sa position (son adresse mémoire) dans un objet système (segment de valeurs de type entier). Ainsi l’ensemble des segments de valeurs associés à une marque identique est facilement identifiable et leur repérage ne nécessite qu’un simple balayage d’un vecteur d’entiers. La boucle sur les segments de valeurs est effectuée en deux temps : on traite tout d’abord globalement les collections, puis les objets simples et les segments de valeurs associés aux collections contiguës sont libérés.

L’actualisation de la marque d’un objet est réalisée lors de l’appel à la routine JJECRS, au besoin, l’objet système KDESMA est redimensionné (cet objet est désigné ici par le nom de la variable Fortran utilisée pour stocker son adresse au sein des unités de programme).

C’est la routine JJLIDE qui réalise effectivement la libération des segments de valeurs. Le premier argument de cette routine est le nom de l’appelant, il conditionne le type d’opération à effectuer :

LIBE

mécanisme standard de libération avec examen de l’état, du statut et de la marque,

TASS

mécanisme de libération avec écriture immédiate utilisé lors du retassage des fichiers ou en mode debug JEVEUX,

LIBF

mécanisme utilisé en fin de travail lors de la fermeture d’une base JEVEUX.

Concernant les objets simples, cette libération ne pose pas de problème particulier : la routine JJLIDE vérifie que la marque associée au segment de valeurs est identique à la marque courante stockée dans le commun /IADMJE/, elle modifie les descripteurs (état et statut) du segment de valeurs et affecte à 0 la marque associée, éventuellement elle provoque un déchargement (JXECRO) et modifie le contenu des attributs adresse mémoire et adresse disque. La libération d’un objet de collection dispersée suit le même processus, les attributs étant modifiés au sein des objets système de collection. La libération d’une collection est plus délicate, les objets système devant être maintenus accessibles en mémoire tant qu’un segment de valeurs associé à l’un des objets de collection est présent en mémoire (utilisé, déchargeable, et même amovible).