8. Les collections#

Les collections d’objets JEVEUX sont des structures qui permettent la mise en commun des attributs et éventuellement un accès nommé à un groupe d’objets. Elles peuvent être associées à un unique segment de valeurs (collection contiguë) ou à autant de segments de valeurs que d’objets (collection dispersée). Elles sont bâties à partir des objets simples JEVEUX, et apparaissent donc sous cette forme parmi les objets associés à une classe. Le principal objet de la collection est l’objet de genre X, c’est un vecteur de 11 entiers contenant les identificateurs des différents objets composant la collection (entre autres les objets système de la collection qui contiennent un suffixe commençant par $$). Ce vecteur porte le nom attribué à l’aide de la routine JECREC (CHARACTER*24). Les objets système propres à la collection portent un suffixe commençant par $$ en position 25, s’ils sont associés à un objet partagé, ils portent un suffixe commençant par &&. Les attributs communs à l’ensemble des objets de collection sont déposés parmi les attributs de l’objet système $$DESO (genre, type, longueur, etc.).

Les objets système associés à une collection sont créés dans la classe associée (attribut identique pour l’ensemble des objets système) et chargés en mémoire par l’intermédiaire de la routine JJCREC.

Suffixe du nom de l’objet système de collection

Contenu

Type Fortran associé

Type de collection

1

$$DESO les attributs associés à cet objet sont les attributs communs de la collection

collection contiguë : valeurs associées aux différents objets de collection

INTEGER*8

dispersée et contiguë le segment de valeurs n’existe que pour les collections contiguës

2

$$IADD

adresses disque des objets de collections dispersées

INTEGER*8

dispersée

3

$$IADM

adresses mémoire des objets de collections dispersées

INTEGER*8

dispersée

4

$$MARQ

marques associées aux objets de collections dispersées

INTEGER*8

dispersée

5

$$NOMou bien objet partagé

liste des noms d’objets de collections nommées

suivant le répertoire associé

nommée

6

$$LONGou bien objet partagé

longueur mesurée dans le type des segments de valeurs; reçoit les valeurs associés aux attribus LONMAXet NOMMAX

INTEGER*8

de longueur variable

7

$$LONOou &&LONO

longueur effective mesurée dans le type des segments de valeurs; est utilisé en interne par le logiciel

INTEGER*8

de longueur variable

8

$$LUTIou &&LUTI

longueur utilisée des segments de valeurs

INTEGER*8

de longueur variable

9

$$NUM

informations concernant les collections numérotées

INTEGER*8

numérotée

Les routines utilisant les collections, et plus précisément l’objet descripteur de la collection contiennent les instructions suivantes :


INTEGER IVNMAX , IDDESO ,IDIADD , IDIADM , + IDMARQ , IDNOM , IDLONG , + IDLONO , IDLUTI ,IDNUM PARAMETER ( IVNMAX = 0 , IDDESO = 1 ,IDIADD = 2 , IDIADM = 3 , + IDMARQ = 4 , IDNOM = 5 , IDLONG = 7 , + IDLONO = 8 , IDLUTI = 9 ,IDNUM = 10 )

Ce qui permet de se positionner directement dans la zone mémoire pour obtenir les identificateurs des objets système (lorsqu’ils existent) dans l’ordre suivant : $$DESO, $$IADD, $$IADM, $$MARQ, $$NOM, $$LONG, $$LONO, $$LUTI et $$NUM. Le nombre maximum d’objets de collection est stocké à l’adresse IVNMAX.

Les collections nommées

Les objets associés à une telle collection sont accessibles par leur nom (fonction JEXNOM) et par leur numéro d’ordre d’insertion (fonction JEXNUM). Il est possible d’utiliser les routines JENUNO et JENONU pour passer du numéro au nom et inversement. La longueur des noms des objets est limitée à 8 caractères (CHARACTER*8) si la collection s’appuie sur un répertoire de nom « interne », ou bien peut valoir 8, 16 ou 24 si la collection s’appuie sur un répertoire de nom « externe », c’est à dire créé préalablement (répertoire de noms partagé).

Les collections numérotées

Les objets associés à une telle collection sont uniquement accessibles par leur numéro d’ordre d’insertion (fonction JEXNUM). L’objet système $$NUM est un vecteur de 2 entiers contenant respectivement le nombre maximum d’objets de collection et le nombre d’objets utilisés.

Les collections dispersées

Chaque objet est associé à un segment de valeurs, il n’est donc pas nécessaire de ramener l’ensemble de la collection pour accéder à un objet particulier. Dans ce cas il est nécessaire de gérer 3 objets système : l’un pour les adresses mémoire des segments de valeurs ($$IADM), l’autre pour les adresses disque ($$IADD) et le dernier pour gérer les libérations ($$MARQ).

Les collections contiguës

Il existe un seul segment de valeurs pour l’ensemble des objets de la collection qui est créé et dimensionné une fois pour toutes lors de la première mise en mémoire d’un des objets de collection. Ce segment de valeur est associé à l’objet système $$DESO.

Les collections de longueur variable

Chaque objet doit être dimensionné : en affectant l’attribut de longueur par la routine JEECRA ou bien en fournissant d’un vecteur de longueur (objet partagé). Dans ce cas 3 objets système sont nécessaires : pour les longueurs ($$LONG ou objet partagé), pour les longueurs dans le type des segments de valeurs associés ($$LONO ou bien &&LONO dans le cas d’un objet partagé) et enfin pour les longueurs utilisées ($$LUTI ou bien &&LUTI dans le cas d’un objet partagé).

Dans le cas des collections contiguës, il est possible accéder directement au vecteur des longueurs cumulées (LONCUM) en utilisant la fonction JEXATR combinée avec l’appel à JEVEUO pour obtenir l’adresse de ce vecteur. Cet accès permet de s’affranchir d’un appel à JEVEUO par objet de collection. La dimension de l’objet système $$LONO est incrémentée de 1 par rapport à la longueur de l’objet système $$LONG à cet effet.

Ce mécanisme a été étendu aux collections dispersées pour accéder aux attributs LONMAX et LONUTI pour chaque objet de collection, l’accès à l’attribut pour chacun des objets de la collection à l’aide de la fonction JELIRA pouvant se révélant coûteux.

Les collections de longueur fixe

Chaque objet possède la même dimension, cet attribut peut être affecté de différentes façons : en affectant directement l’attribut de longueur d’un objet de la collection ou bien l’attribut LONT de longueur totale pour une collection contiguë (appel à JEECRA).

Le mécanisme d’accès aux objets de collection

Les requêtes d’accès aux objets de collection sollicitent les objets système attachés à la collection, de la même manière qu’il est nécessaire d’avoir accès aux objets système associés à une classe lors des requêtes sur les objets simples. Il est donc nécessaire que ces objets soient présents en mémoire dès qu’une requête est effectuée sur l’un des objets de collection. La routine JJALLC est chargée de mettre en mémoire les objets système de collection. Ils obéissent à des règles particulières concernant les libérations car ils ne peuvent être déchargés de la mémoire que lorsque tous les objets de collection ont été eux-mêmes déchargés (actualisation des adresses disque et mémoire). La gestion des objets partagés est encore plus délicate car il faut pouvoir se prémunir d’une libération intempestive de ces derniers, à cette fin, ils reçoivent une marque particulière qui vaut -1.

Les différentes requêtes sur les objets de collection s’effectuent à partir des routines JE utilisées pour les objets simples, mais requièrent l’usage des fonctions de synchronisation JEXNOM, JEXNUM ou JEXATR. Ces fonctions de type CHARACTER*32 mettent à jour le contenu des communs respectifs /IDATJE/, /INUMJE/ et /KNOMJE/, de plus elles remplacent la chaîne de caractères associée au nom de l’objet JEVEUX en position 25 à 32 par les suffixes respectifs $$XNOM , $$XNUM et $$XATR. Les routines de bas niveau iront ensuite rechercher cette information au sein des différents communs suivant le type d’accès.