--- rpl/src/gestion_objets.c 2017/07/02 22:29:02 1.134 +++ rpl/src/gestion_objets.c 2017/07/12 15:42:42 1.135 @@ -1510,25 +1510,45 @@ liberation(struct_processus *s_etat_proc return; } - // Appel de la fonction de duplication associée à l'objet + // Appel de la fonction de liberation 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. + l_element_courant = (*s_etat_processus).s_bibliotheques; - (*s_etat_processus).erreur_execution = d_ex_type_externe_drop; - } - else + while(l_element_courant != NULL) { - if (__type_drop(s_etat_processus, (void **) &s_objet) == 0) + if ((*((struct_bibliotheque *) (*l_element_courant).donnee)) + .descripteur == (*s_objet).descripteur_bibliotheque) { - (*s_etat_processus).erreur_execution = - d_ex_type_externe_drop; + if ((__type_drop = dlsym((*s_objet) + .descripteur_bibliotheque, "__type_drop")) == NULL) + { + // La fonction de libération 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; } + + l_element_courant = (*l_element_courant).suivant; + } + + if (l_element_courant == NULL) + { + (*s_etat_processus).erreur_execution = d_ex_type_externe_drop; } break; @@ -2866,20 +2886,41 @@ copie_objet(struct_processus *s_etat_pro // externe. Le descripteur de bibliothèque est directement // associé à la structure objet. - if ((__type_dup = dlsym((*s_objet).descripteur_bibliotheque, - "__type_dup")) == NULL) + l_element_courant = (*s_etat_processus).s_bibliotheques; + + while(l_element_courant != NULL) { - // La fonction de duplication n'existe pas dans la - // bibliothèque. + if ((*((struct_bibliotheque *) (*l_element_courant).donnee)) + .descripteur == (*s_objet).descripteur_bibliotheque) + { + 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_etat_processus).erreur_execution = + d_ex_type_externe_dup; + return(NULL); + } - s_nouvel_objet = s_objet; + s_nouvel_objet = s_objet; - if (__type_dup(s_etat_processus, (void **) &s_nouvel_objet) == 0) + if (__type_dup(s_etat_processus, (void **) &s_nouvel_objet) + == 0) + { + return(NULL); + } + + break; + } + + l_element_courant = (*l_element_courant).suivant; + } + + if (l_element_courant == NULL) { + (*s_etat_processus).erreur_execution = d_ex_type_externe_dup; return(NULL); }