Diff for /rpl/src/gestion_objets.c between versions 1.34 and 1.45.2.3

version 1.34, 2010/08/06 15:32:58 version 1.45.2.3, 2011/05/09 13:52:11
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.18    RPL/2 (R) version 4.0.24
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2011 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 57  decrementation_atomique(struct_objet *s_ Line 57  decrementation_atomique(struct_objet *s_
     return((*s_objet).nombre_occurrences);      return((*s_objet).nombre_occurrences);
 }  }
   
 inline void  void
 initialisation_objet(struct_objet *s_objet)  initialisation_objet(struct_objet *s_objet)
 {  {
     pthread_mutexattr_t     attributs_mutex;      pthread_mutexattr_t     attributs_mutex;
Line 758  liberation(struct_processus *s_etat_proc Line 758  liberation(struct_processus *s_etat_proc
 {  {
     logical1                            drapeau;      logical1                            drapeau;
   
       sigset_t                            oldset;
       sigset_t                            set;
   
     struct_liste_chainee                *l_element_courant;      struct_liste_chainee                *l_element_courant;
     struct_liste_chainee                *l_element_suivant;      struct_liste_chainee                *l_element_suivant;
   
Line 1127  liberation(struct_processus *s_etat_proc Line 1130  liberation(struct_processus *s_etat_proc
   
         case PRC :          case PRC :
         {          {
               sigfillset(&set);
               pthread_sigmask(SIG_BLOCK, &set, &oldset);
   
             if (pthread_mutex_lock(&((*(*((struct_processus_fils *)              if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
                     (*s_objet).objet)).thread).mutex)) != 0)                      (*s_objet).objet)).thread).mutex_nombre_references)) != 0)
             {              {
                   pthread_sigmask(SIG_SETMASK, &oldset, NULL);
                   sigpending(&set);
   
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  return;
             }              }
Line 1155  liberation(struct_processus *s_etat_proc Line 1164  liberation(struct_processus *s_etat_proc
             }              }
   
             if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)              if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
                     (*s_objet).objet)).thread).mutex)) != 0)                      (*s_objet).objet)).thread).mutex_nombre_references)) != 0)
             {              {
                   pthread_sigmask(SIG_SETMASK, &oldset, NULL);
                   sigpending(&set);
   
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  return;
             }              }
   
               pthread_sigmask(SIG_SETMASK, &oldset, NULL);
               sigpending(&set);
   
             if (drapeau == d_vrai)              if (drapeau == d_vrai)
             {              {
                 pthread_mutex_destroy(&((*(*((struct_processus_fils *)                  pthread_mutex_destroy(&((*(*((struct_processus_fils *)
                         (*s_objet).objet)).thread).mutex));                          (*s_objet).objet)).thread).mutex));
                   pthread_mutex_destroy(&((*(*((struct_processus_fils *)
                           (*s_objet).objet)).thread).mutex_nombre_references));
                 free((*((struct_processus_fils *) (*s_objet).objet)).thread);                  free((*((struct_processus_fils *) (*s_objet).objet)).thread);
   
             }              }
   
             if (decrementation_atomique(s_objet) > 0)              if (decrementation_atomique(s_objet) > 0)
Line 1497  struct_objet * Line 1513  struct_objet *
 copie_objet(struct_processus *s_etat_processus,  copie_objet(struct_processus *s_etat_processus,
         struct_objet *s_objet, unsigned char type)          struct_objet *s_objet, unsigned char type)
 {  {
       sigset_t                    oldset;
       sigset_t                    set;
   
     struct_liste_chainee        *l_element_base;      struct_liste_chainee        *l_element_base;
     struct_liste_chainee        *l_element_courant;      struct_liste_chainee        *l_element_courant;
     struct_liste_chainee        *l_element_courant_ecriture;      struct_liste_chainee        *l_element_courant_ecriture;
Line 2267  copie_objet(struct_processus *s_etat_pro Line 2286  copie_objet(struct_processus *s_etat_pro
   
         case PRC :          case PRC :
         {          {
               sigfillset(&set);
               pthread_sigmask(SIG_BLOCK, &set, &oldset);
   
             if (pthread_mutex_lock(&((*(*((struct_processus_fils *)              if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
                     (*s_objet).objet)).thread).mutex)) != 0)                      (*s_objet).objet)).thread).mutex_nombre_references)) != 0)
             {              {
                   pthread_sigmask(SIG_SETMASK, &oldset, NULL);
                   sigpending(&set);
   
                 return(NULL);                  return(NULL);
             }              }
   
Line 2277  copie_objet(struct_processus *s_etat_pro Line 2302  copie_objet(struct_processus *s_etat_pro
                     .nombre_references++;                      .nombre_references++;
   
             if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)              if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
                     (*s_objet).objet)).thread).mutex)) != 0)                      (*s_objet).objet)).thread).mutex_nombre_references)) != 0)
             {              {
                   pthread_sigmask(SIG_SETMASK, &oldset, NULL);
                   sigpending(&set);
   
                 return(NULL);                  return(NULL);
             }              }
   
               pthread_sigmask(SIG_SETMASK, &oldset, NULL);
               sigpending(&set);
   
             if (type != 'O')              if (type != 'O')
             {              {
                 incrementation_atomique(s_objet);                  incrementation_atomique(s_objet);
Line 2295  copie_objet(struct_processus *s_etat_pro Line 2326  copie_objet(struct_processus *s_etat_pro
   
             (*((struct_processus_fils *) (*s_nouvel_objet).objet)) =              (*((struct_processus_fils *) (*s_nouvel_objet).objet)) =
                     (*((struct_processus_fils *) (*s_objet).objet));                      (*((struct_processus_fils *) (*s_objet).objet));
   
             break;              break;
         }          }
   
Line 2799  copie_etat_processus(struct_processus *s Line 2829  copie_etat_processus(struct_processus *s
 #   endif  #   endif
   
     (*s_nouvel_etat_processus).var_volatile_processus_pere = 0;      (*s_nouvel_etat_processus).var_volatile_processus_pere = 0;
       (*s_nouvel_etat_processus).var_volatile_processus_racine = 0;
     (*s_nouvel_etat_processus).fichiers_graphiques = NULL;      (*s_nouvel_etat_processus).fichiers_graphiques = NULL;
     (*s_nouvel_etat_processus).entree_standard = NULL;      (*s_nouvel_etat_processus).entree_standard = NULL;
     (*s_nouvel_etat_processus).s_marques = NULL;      (*s_nouvel_etat_processus).s_marques = NULL;
Line 2842  copie_etat_processus(struct_processus *s Line 2873  copie_etat_processus(struct_processus *s
   
     if ((*s_nouvel_etat_processus).generateur_aleatoire != NULL)      if ((*s_nouvel_etat_processus).generateur_aleatoire != NULL)
     {      {
         (*s_nouvel_etat_processus).generateur_aleatoire = NULL;          if (((*s_nouvel_etat_processus).generateur_aleatoire =
     }                  gsl_rng_clone((*s_etat_processus).generateur_aleatoire))
                   == NULL)
           {
               (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
               return(NULL);
           }
   
     (*s_nouvel_etat_processus).type_generateur_aleatoire = NULL;          gsl_rng_set((*s_nouvel_etat_processus).generateur_aleatoire,
                   gsl_rng_get((*s_etat_processus).generateur_aleatoire));
       }
   
     // Copie de la localisation      // Copie de la localisation
   
Line 3973  debug_fork() Line 4011  debug_fork()
     pthread_mutex_lock(&mutex_allocation);      pthread_mutex_lock(&mutex_allocation);
     pid = fork();      pid = fork();
   
   #   ifdef OS2
     if (pid == 0)      if (pid == 0)
     {      {
           sem_init(&semaphore_liste_threads, 0, 1);
           sem_init(&semaphore_gestionnaires_signaux, 0, 0);
           sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1);
           sem_init(&((*s_etat_processus).semaphore_fork), 0, 0);
       }
   #   endif
   
       if (pid == 0)
       {
   #       ifdef _BROKEN_SIGINFO
           liberation_fifos_signaux(s_etat_processus);
           creation_fifos_signaux(s_etat_processus);
   #       endif
   
         pthread_mutex_destroy(&mutex_allocation);          pthread_mutex_destroy(&mutex_allocation);
         debug_memoire_initialisation();          debug_memoire_initialisation();
     }      }

Removed from v.1.34  
changed lines
  Added in v.1.45.2.3


CVSweb interface <joel.bertrand@systella.fr>