--- rpl/src/gestion_objets.c 2017/06/29 12:33:34 1.132 +++ rpl/src/gestion_objets.c 2017/06/30 13:11:26 1.133 @@ -829,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) { @@ -958,19 +960,6 @@ liberation(struct_processus *s_etat_proc break; } - case EXT : - { - if (decrementation_atomique(s_objet) > 0) - { - return; - } - - BUG((*s_objet).descripteur_bibliotheque == NULL, - pthread_mutex_unlock(&((*s_objet).mutex)), - printf("(*s_objet).liberation==NULL\n")); - break; - } - case FCH : { if (decrementation_atomique(s_objet) > 0) @@ -1514,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) @@ -1612,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) { @@ -2831,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 :