--- rpl/src/gestion_objets.c 2018/05/30 09:27:32 1.138 +++ rpl/src/gestion_objets.c 2018/12/21 10:56:16 1.139 @@ -106,6 +106,7 @@ initialisation_allocateur(struct_process (*s_etat_processus).pointeur_int = 0; (*s_etat_processus).pointeur_mat = 0; (*s_etat_processus).pointeur_nom = 0; + (*s_etat_processus).pointeur_rec = 0; (*s_etat_processus).pointeur_rel = 0; (*s_etat_processus).pointeur_tab = 0; (*s_etat_processus).pointeur_vec = 0; @@ -141,6 +142,8 @@ liberation_allocateur(struct_processus * free((*s_etat_processus).objets_mat[i++])); for(i = 0; i < (*s_etat_processus).pointeur_nom; free((*s_etat_processus).objets_nom[i++])); + for(i = 0; i < (*s_etat_processus).pointeur_rec; + free((*s_etat_processus).objets_rec[i++])); for(i = 0; i < (*s_etat_processus).pointeur_rel; free((*s_etat_processus).objets_rel[i++])); for(i = 0; i < (*s_etat_processus).pointeur_tab; @@ -623,6 +626,28 @@ allocation(struct_processus *s_etat_proc break; } + case REC : + { + if ((*s_etat_processus).pointeur_rec > 0) + { + (*s_objet).objet = (*s_etat_processus).objets_rec + [--(*s_etat_processus).pointeur_rec]; + } + else + { + if (((*s_objet).objet = malloc(2 * sizeof(struct_objet *))) + == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + free(s_objet); + return(NULL); + } + } + + break; + } + case REL : { if ((*s_etat_processus).pointeur_rel > 0) @@ -1273,6 +1298,31 @@ liberation(struct_processus *s_etat_proc break; } + case REC : + { + liberation(s_etat_processus, + (*((struct_record *) (*s_objet).objet)).noms); + liberation(s_etat_processus, + (*((struct_record *) (*s_objet).objet)).donnees); + + if (decrementation_atomique(s_objet) > 0) + { + return; + } + + if ((*s_etat_processus).pointeur_rec < TAILLE_CACHE) + { + (*s_etat_processus).objets_rec + [(*s_etat_processus).pointeur_rec++] = (*s_objet).objet; + } + else + { + free((real8 *) ((*s_objet).objet)); + } + + break; + } + case REL : { if (decrementation_atomique(s_objet) > 0)