--- rpl/src/gestion_objets.c 2017/01/18 15:44:18 1.130 +++ rpl/src/gestion_objets.c 2017/07/02 22:29:02 1.134 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.26 + RPL/2 (R) version 4.1.27 Copyright (C) 1989-2017 Dr. BERTRAND Joël This file is part of RPL/2. @@ -343,6 +343,8 @@ allocation(struct_processus *s_etat_proc } (*s_objet).type = type; + (*s_objet).extension_type = 0; + (*s_objet).descripteur_bibliotheque = NULL; switch(type) { @@ -434,6 +436,12 @@ allocation(struct_processus *s_etat_proc break; } + case EXT : + { + // Aucune allocation + break; + } + case FCT : { if ((*s_etat_processus).pointeur_fct > 0) @@ -821,6 +829,8 @@ liberation(struct_processus *s_etat_proc struct_liste_chainee *l_element_suivant; integer8 i; + integer8 (*__type_drop)(struct_processus *, + void **); if (s_objet == NULL) { @@ -1493,6 +1503,37 @@ liberation(struct_processus *s_etat_proc break; } + case EXT: + { + if (decrementation_atomique(s_objet) > 0) + { + return; + } + + // Appel de la fonction de duplication associée à l'objet + // externe. Le descripteur de bibliothèque est directement + // associé à la structure objet. + + if ((__type_drop = dlsym((*s_objet).descripteur_bibliotheque, + "__type_drop")) == NULL) + { + // La fonction de duplication n'existe pas dans la + // bibliothèque. + + (*s_etat_processus).erreur_execution = d_ex_type_externe_drop; + } + else + { + if (__type_drop(s_etat_processus, (void **) &s_objet) == 0) + { + (*s_etat_processus).erreur_execution = + d_ex_type_externe_drop; + } + } + + break; + } + default : { if (pthread_mutex_unlock(&((*s_objet).mutex)) != 0) @@ -1591,6 +1632,7 @@ copie_objet(struct_processus *s_etat_pro integer8 i; integer8 j; + integer8 (*__type_dup)(struct_processus *, void **); if (pthread_mutex_lock(&((*s_objet).mutex)) != 0) { @@ -2810,6 +2852,38 @@ copie_objet(struct_processus *s_etat_pro } break; + } + + case EXT: + { + if (type != 'O') + { + incrementation_atomique(s_objet); + return(s_objet); + } + + // Appel de la fonction de duplication associée à l'objet + // externe. Le descripteur de bibliothèque est directement + // associé à la structure objet. + + if ((__type_dup = dlsym((*s_objet).descripteur_bibliotheque, + "__type_dup")) == NULL) + { + // La fonction de duplication n'existe pas dans la + // bibliothèque. + + (*s_etat_processus).erreur_execution = d_ex_type_externe_dup; + return(NULL); + } + + s_nouvel_objet = s_objet; + + if (__type_dup(s_etat_processus, (void **) &s_nouvel_objet) == 0) + { + return(NULL); + } + + break; } default :