Diff for /rpl/src/instructions_d5.c between versions 1.68 and 1.89

version 1.68, 2011/09/14 17:55:59 version 1.89, 2012/05/21 17:25:43
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.3    RPL/2 (R) version 4.1.9
   Copyright (C) 1989-2011 Dr. BERTRAND Joël    Copyright (C) 1989-2012 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 814  instruction_der(struct_processus *s_etat Line 814  instruction_der(struct_processus *s_etat
 void  void
 instruction_detach(struct_processus *s_etat_processus)  instruction_detach(struct_processus *s_etat_processus)
 {  {
       int                         pipe_initialisation_segment_signaux[2];
   
     logical1                    drapeau;      logical1                    drapeau;
     logical1                    variable_partagee;  
   
     pid_t                       ppid;      pid_t                       ppid;
     pid_t                       pid_final;      pid_t                       pid_final;
Line 828  instruction_detach(struct_processus *s_e Line 829  instruction_detach(struct_processus *s_e
   
     sig_atomic_t                registre_stop;      sig_atomic_t                registre_stop;
   
     sigset_t                    oldset;  
     sigset_t                    set;  
   
     ssize_t                     longueur_ecriture;      ssize_t                     longueur_ecriture;
   
     struct_descripteur_thread   *s_argument_thread;      struct_descripteur_thread   *s_argument_thread;
Line 850  instruction_detach(struct_processus *s_e Line 848  instruction_detach(struct_processus *s_e
   
     struct timespec             attente;      struct timespec             attente;
   
       unsigned char               caractere;
     unsigned char               *message;      unsigned char               *message;
   
     unsigned int                erreur;      unsigned int                erreur;
   
     unsigned long               i;      unsigned long               i;
   
       volatile logical1           variable_partagee;
   
     (*s_etat_processus).erreur_execution = d_ex;      (*s_etat_processus).erreur_execution = d_ex;
   
     attente.tv_sec = 0;      attente.tv_sec = 0;
Line 1085  instruction_detach(struct_processus *s_e Line 1086  instruction_detach(struct_processus *s_e
         return;          return;
     }      }
   
       if (pipe(pipe_initialisation_segment_signaux) != 0)
       {
           (*s_etat_processus).erreur_systeme = d_es_processus;
           return;
       }
   
     ppid = getpid();      ppid = getpid();
   
     /*      /*
Line 1104  instruction_detach(struct_processus *s_e Line 1111  instruction_detach(struct_processus *s_e
      * de mémoire, ni libération, ni copie d'objet concurrent au fork().       * de mémoire, ni libération, ni copie d'objet concurrent au fork().
      */       */
   
     sigfillset(&set);  
     pthread_sigmask(SIG_BLOCK, &set, &oldset);  
     verrouillage_threads_concurrents(s_etat_processus);      verrouillage_threads_concurrents(s_etat_processus);
     (*s_argument_thread).pid = fork();      (*s_argument_thread).pid = fork();
     deverrouillage_threads_concurrents(s_etat_processus);      deverrouillage_threads_concurrents(s_etat_processus);
     pthread_sigmask(SIG_SETMASK, &oldset, NULL);  
     sigpending(&set);  
   
     (*s_argument_thread).thread_pere = pthread_self();      (*s_argument_thread).thread_pere = pthread_self();
     (*s_argument_thread).processus_detache = d_vrai;      (*s_argument_thread).processus_detache = d_vrai;
Line 1229  instruction_detach(struct_processus *s_e Line 1232  instruction_detach(struct_processus *s_e
             return;              return;
         }          }
   
 #       ifndef OS2  #       ifdef SCHED_OTHER
 #       ifndef Cygwin  
         if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)          if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
             return;              return;
         }          }
   #       endif
   
   #       ifdef PTHREAD_EXPLICIT_SCHED
         if (pthread_attr_setinheritsched(&attributs,          if (pthread_attr_setinheritsched(&attributs,
                 PTHREAD_EXPLICIT_SCHED) != 0)                  PTHREAD_EXPLICIT_SCHED) != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
             return;              return;
         }          }
   #       endif
   
   #       ifdef PTHREAD_SCOPE_SYSTEM
         if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)          if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
             return;              return;
         }          }
 #       endif  #       endif
 #       endif  
   
         (*s_argument_thread).s_etat_processus = s_etat_processus;          (*s_argument_thread).s_etat_processus = s_etat_processus;
   
Line 1275  instruction_detach(struct_processus *s_e Line 1280  instruction_detach(struct_processus *s_e
   
         liberation_queue_signaux(s_etat_processus);          liberation_queue_signaux(s_etat_processus);
         creation_queue_signaux(s_etat_processus);          creation_queue_signaux(s_etat_processus);
           routine_recursive = 0;
   
         (*s_etat_processus).pointeur_signal_lecture = 0;          (*s_etat_processus).pointeur_signal_lecture = 0;
         (*s_etat_processus).pointeur_signal_ecriture = 0;          (*s_etat_processus).pointeur_signal_ecriture = 0;
   
           if (write_atomic(s_etat_processus,
                   pipe_initialisation_segment_signaux[1],
                   "-", sizeof(unsigned char)) != sizeof(unsigned char))
           {
               (*s_etat_processus).erreur_systeme = d_es_processus;
           }
   
           close(pipe_initialisation_segment_signaux[0]);
           close(pipe_initialisation_segment_signaux[1]);
   
         if ((*s_etat_processus).debug == d_vrai)          if ((*s_etat_processus).debug == d_vrai)
             if (((*s_etat_processus).type_debug &              if (((*s_etat_processus).type_debug &
                     d_debug_processus) != 0)                      d_debug_processus) != 0)
Line 1351  instruction_detach(struct_processus *s_e Line 1367  instruction_detach(struct_processus *s_e
         l_element_courant = (*s_etat_processus).liste_mutexes;          l_element_courant = (*s_etat_processus).liste_mutexes;
         while(l_element_courant != NULL)          while(l_element_courant != NULL)
         {          {
             pthread_mutex_trylock(&((*((struct_mutex *) (*(*l_element_courant)  
                     .donnee).objet)).mutex));  
             pthread_mutex_unlock(&((*((struct_mutex *) (*(*l_element_courant)  
                     .donnee).objet)).mutex));  
             pthread_mutex_destroy(&((*((struct_mutex *) (*(*l_element_courant)  
                     .donnee).objet)).mutex));  
   
             liberation(s_etat_processus, (*l_element_courant).donnee);              liberation(s_etat_processus, (*l_element_courant).donnee);
             l_element_suivant = (*l_element_courant).suivant;              l_element_suivant = (*l_element_courant).suivant;
             free(l_element_courant);              free(l_element_courant);
Line 1939  instruction_detach(struct_processus *s_e Line 1948  instruction_detach(struct_processus *s_e
   
         if ((*s_etat_processus).erreur_systeme == d_es)          if ((*s_etat_processus).erreur_systeme == d_es)
         {          {
               // Évite le warning variable s_copie might be clobbered by
               // longjmp or vfork
               struct_objet **s;
   
               if ((s = malloc(sizeof(struct_objet *))) == NULL)
               {
                   (*s_etat_processus).erreur_execution = d_es_allocation_memoire;
                   return;
               }
   
               (*s) = s_copie;
   
             if (setjmp(contexte_processus) == 0)              if (setjmp(contexte_processus) == 0)
             {              {
                 if (variable_partagee == d_faux)                  if (variable_partagee == d_faux)
Line 1972  instruction_detach(struct_processus *s_e Line 1993  instruction_detach(struct_processus *s_e
                 }                  }
                 else                  else
                 {                  {
                     if (evaluation(s_etat_processus, s_copie, 'E') == d_erreur)                      if (evaluation(s_etat_processus, (*s), 'E') == d_erreur)
                     {                      {
                         if (((*s_etat_processus).erreur_execution == d_ex) &&                          if (((*s_etat_processus).erreur_execution == d_ex) &&
                                 ((*s_etat_processus).erreur_systeme == d_es))                                  ((*s_etat_processus).erreur_systeme == d_es))
Line 1983  instruction_detach(struct_processus *s_e Line 2004  instruction_detach(struct_processus *s_e
                     }                      }
                     else                      else
                     {                      {
                         if ((*s_etat_processus).at_exit != NULL)                          if (((*s_etat_processus).var_volatile_alarme == 0)
                                   && ((*s_etat_processus).arret_depuis_abort == 0)
                                   && ((*s_etat_processus).at_exit != NULL))
                         {                          {
                             (*s_etat_processus).var_volatile_requete_arret = 0;                              (*s_etat_processus).var_volatile_requete_arret = 0;
   
Line 1997  instruction_detach(struct_processus *s_e Line 2020  instruction_detach(struct_processus *s_e
                         }                          }
                     }                      }
   
                     liberation(s_etat_processus, s_copie);                      liberation(s_etat_processus, (*s));
                 }                  }
             }              }
   
               free(s);
         }          }
   
         liberation(s_etat_processus, (*s_etat_processus).at_exit);          liberation(s_etat_processus, (*s_etat_processus).at_exit);
Line 2008  instruction_detach(struct_processus *s_e Line 2033  instruction_detach(struct_processus *s_e
         l_element_courant = (*s_etat_processus).liste_mutexes;          l_element_courant = (*s_etat_processus).liste_mutexes;
         while(l_element_courant != NULL)          while(l_element_courant != NULL)
         {          {
             pthread_mutex_trylock(&((*((struct_mutex *)  
                     (*(*l_element_courant).donnee).objet)).mutex));  
             pthread_mutex_unlock(&((*((struct_mutex *)  
                     (*(*l_element_courant).donnee).objet)).mutex));  
             pthread_mutex_destroy(&((*((struct_mutex *)  
                     (*(*l_element_courant).donnee).objet)).mutex));  
   
             liberation(s_etat_processus, (*l_element_courant).donnee);              liberation(s_etat_processus, (*l_element_courant).donnee);
             l_element_suivant = (*l_element_courant).suivant;              l_element_suivant = (*l_element_courant).suivant;
             free(l_element_courant);              free(l_element_courant);
Line 2418  instruction_detach(struct_processus *s_e Line 2436  instruction_detach(struct_processus *s_e
   
             nanosleep(&attente, NULL);              nanosleep(&attente, NULL);
             pthread_mutex_lock(&((*s_etat_processus).mutex));              pthread_mutex_lock(&((*s_etat_processus).mutex));
   
               scrutation_interruptions(s_etat_processus);
         }          }
   
         pthread_mutex_unlock(&((*s_etat_processus).mutex));          pthread_mutex_unlock(&((*s_etat_processus).mutex));
Line 2754  instruction_detach(struct_processus *s_e Line 2774  instruction_detach(struct_processus *s_e
         pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));          pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));
         pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));          pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));
   
         pthread_mutex_unlock(&((*s_etat_processus).mutex_fork));  #       ifndef SEMAPHORES_NOMMES
         pthread_mutex_destroy(&((*s_etat_processus).mutex_fork));          sem_post(&((*s_etat_processus).semaphore_fork));
           sem_destroy(&((*s_etat_processus).semaphore_fork));
   #       else
           sem_post((*s_etat_processus).semaphore_fork);
           sem_destroy3((*s_etat_processus).semaphore_fork, getpid(),
                   pthread_self(), SEM_FORK);
   #       endif
   
         free((*s_etat_processus).localisation);          free((*s_etat_processus).localisation);
         free(s_argument_thread);          free(s_argument_thread);
Line 2822  instruction_detach(struct_processus *s_e Line 2848  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
               scrutation_interruptions(s_etat_processus);
             l_element_courant = (*l_element_courant).suivant;              l_element_courant = (*l_element_courant).suivant;
         }          }
     } while(drapeau == d_vrai);      } while(drapeau == d_vrai);
Line 2841  instruction_detach(struct_processus *s_e Line 2868  instruction_detach(struct_processus *s_e
         return;          return;
     }      }
   
     // Être sûr que le processus fils soit déjà présent...      // On attend une donnée fictive pour être sûr que le segment de mémoire
       // partagée destiné à la gestion des signaux est bien initialisé.
   
     attente.tv_sec = 0;      attente.tv_sec = 0;
     attente.tv_nsec = GRANULARITE_us * 1000;      attente.tv_nsec = GRANULARITE_us * 1000;
   
     while(kill((*s_argument_thread).pid, 0) != 0)      while(read_atomic(s_etat_processus,
               pipe_initialisation_segment_signaux[0],
               &caractere, sizeof(caractere)) == 0)
     {      {
         //if ((errno != ESRCH) && (errno != EAGAIN))          scrutation_interruptions(s_etat_processus);
         if (errno != ESRCH)  
         {  
             (*s_etat_processus).erreur_systeme = d_es_processus;  
             pthread_mutex_unlock(&((*s_etat_processus).mutex));  
             return;  
         }  
   
         nanosleep(&attente, NULL);          nanosleep(&attente, NULL);
         INCR_GRANULARITE(attente.tv_nsec);          INCR_GRANULARITE(attente.tv_nsec);
     }      }
   
       close(pipe_initialisation_segment_signaux[0]);
       close(pipe_initialisation_segment_signaux[1]);
   
     // Le fils peut être présent sans être en attente du signal de départ.      // Le fils peut être présent sans être en attente du signal de départ.
   
     if (envoi_signal_processus((*s_argument_thread).pid, rpl_sigstart) != 0)      if (envoi_signal_processus((*s_argument_thread).pid, rpl_sigstart) != 0)

Removed from v.1.68  
changed lines
  Added in v.1.89


CVSweb interface <joel.bertrand@systella.fr>