Diff for /rpl/src/instructions_d5.c between versions 1.26 and 1.45

version 1.26, 2010/06/08 10:22:37 version 1.45, 2010/12/14 15:46:24
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.16    RPL/2 (R) version 4.0.20
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2010 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
Line 20 Line 20
 */  */
   
   
 #include "rpl.conv.h"  #include "rpl-conv.h"
   
   
 /*  /*
Line 1172  instruction_detach(struct_processus *s_e Line 1172  instruction_detach(struct_processus *s_e
     pthread_mutex_init(&((*s_argument_thread).mutex), &attributs_mutex);      pthread_mutex_init(&((*s_argument_thread).mutex), &attributs_mutex);
     pthread_mutexattr_destroy(&attributs_mutex);      pthread_mutexattr_destroy(&attributs_mutex);
   
       pthread_mutexattr_init(&attributs_mutex);
       pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
       pthread_mutex_init(&((*s_argument_thread).mutex_nombre_references),
               &attributs_mutex);
       pthread_mutexattr_destroy(&attributs_mutex);
   
     if ((*s_argument_thread).pid > 0)      if ((*s_argument_thread).pid > 0)
     {      {
         /*          /*
Line 1200  instruction_detach(struct_processus *s_e Line 1206  instruction_detach(struct_processus *s_e
         (*(*((struct_processus_fils *) (*s_objet).objet)).thread)          (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
                 .nombre_references = 1;                  .nombre_references = 1;
   
         if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)  
         {  
             (*s_etat_processus).erreur_systeme = d_es_processus;  
             return;  
         }  
   
         /*          /*
          * On copie l'objet plutôt que le pointeur car cet objet peut être           * On copie l'objet plutôt que le pointeur car cet objet peut être
          * accédé depuis deux threads distincts et aboutir à un blocage lors           * accédé depuis deux threads distincts et aboutir à un blocage lors
Line 1281  instruction_detach(struct_processus *s_e Line 1281  instruction_detach(struct_processus *s_e
             return;              return;
         }          }
   
   #       ifndef OS2
         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;
Line 1299  instruction_detach(struct_processus *s_e Line 1300  instruction_detach(struct_processus *s_e
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
             return;              return;
         }          }
   #       endif
   
         (*s_argument_thread).s_etat_processus = s_etat_processus;          (*s_argument_thread).s_etat_processus = s_etat_processus;
   
Line 1321  instruction_detach(struct_processus *s_e Line 1323  instruction_detach(struct_processus *s_e
          * Processus fils           * Processus fils
          */           */
   
   #       ifdef _BROKEN_SIGINFO
           liberation_fifos_signaux(s_etat_processus);
           creation_fifos_signaux(s_etat_processus);
   #       endif
   
         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 1510  instruction_detach(struct_processus *s_e Line 1517  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
   #           ifdef _BROKEN_SIGINFO
               destruction_fifos_signaux(s_etat_processus);
   #           endif
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
Line 1540  instruction_detach(struct_processus *s_e Line 1551  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
   #           ifdef _BROKEN_SIGINFO
               destruction_fifos_signaux(s_etat_processus);
   #           endif
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
   
           pthread_mutex_trylock(&((*s_etat_processus).protection_liste_mutexes));
   
         if (pthread_mutex_unlock(&((*s_etat_processus)          if (pthread_mutex_unlock(&((*s_etat_processus)
                 .protection_liste_mutexes)) != 0)                  .protection_liste_mutexes)) != 0)
         {          {
Line 1571  instruction_detach(struct_processus *s_e Line 1588  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
   #           ifdef _BROKEN_SIGINFO
               destruction_fifos_signaux(s_etat_processus);
   #           endif
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
Line 1582  instruction_detach(struct_processus *s_e Line 1603  instruction_detach(struct_processus *s_e
         }          }
   
         (*s_etat_processus).var_volatile_processus_pere = 0;          (*s_etat_processus).var_volatile_processus_pere = 0;
           (*s_etat_processus).var_volatile_processus_racine = 0;
   
         // On réinitialise toutes les interruptions.          // On réinitialise toutes les interruptions.
   
Line 1593  instruction_detach(struct_processus *s_e Line 1615  instruction_detach(struct_processus *s_e
   
         liberation(s_etat_processus, (*s_etat_processus).at_exit);          liberation(s_etat_processus, (*s_etat_processus).at_exit);
         (*s_etat_processus).at_exit = NULL;          (*s_etat_processus).at_exit = NULL;
           liberation(s_etat_processus, (*s_etat_processus).at_poke);
           (*s_etat_processus).at_poke = NULL;
           (*s_etat_processus).traitement_at_poke = 'N';
   
         for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)          for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
         {          {
Line 1716  instruction_detach(struct_processus *s_e Line 1741  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
   #           ifdef _BROKEN_SIGINFO
               destruction_fifos_signaux(s_etat_processus);
   #           endif
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
Line 1732  instruction_detach(struct_processus *s_e Line 1761  instruction_detach(struct_processus *s_e
             (*s_argument_thread2).nombre_references--;              (*s_argument_thread2).nombre_references--;
   
             BUG((*s_argument_thread2).nombre_references < 0,              BUG((*s_argument_thread2).nombre_references < 0,
   #                   ifdef _BROKEN_SIGINFO
                       destruction_fifos_signaux(s_etat_processus),
   #                   endif
                     printf("(*s_argument_thread2).nombre_references = %d\n",                      printf("(*s_argument_thread2).nombre_references = %d\n",
                     (int) (*s_argument_thread2).nombre_references));                      (int) (*s_argument_thread2).nombre_references));
   
Line 1758  instruction_detach(struct_processus *s_e Line 1790  instruction_detach(struct_processus *s_e
                 }                  }
   
                 free(s_argument_thread2);                  free(s_argument_thread2);
                   free((*(*l_element_courant).donnee).objet);
                   free((*l_element_courant).donnee);
             }              }
   
             l_element_suivant = (*l_element_courant).suivant;              l_element_suivant = (*l_element_courant).suivant;
Line 1793  instruction_detach(struct_processus *s_e Line 1827  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
   #           ifdef _BROKEN_SIGINFO
               destruction_fifos_signaux(s_etat_processus);
   #           endif
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
Line 1857  instruction_detach(struct_processus *s_e Line 1895  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
   #           ifdef _BROKEN_SIGINFO
               destruction_fifos_signaux(s_etat_processus);
   #           endif
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
Line 1909  instruction_detach(struct_processus *s_e Line 1951  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
   #           ifdef _BROKEN_SIGINFO
               destruction_fifos_signaux(s_etat_processus);
   #           endif
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
Line 2093  instruction_detach(struct_processus *s_e Line 2139  instruction_detach(struct_processus *s_e
         }          }
   
         liberation(s_etat_processus, (*s_etat_processus).at_exit);          liberation(s_etat_processus, (*s_etat_processus).at_exit);
           liberation(s_etat_processus, (*s_etat_processus).at_poke);
   
         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)
Line 2456  instruction_detach(struct_processus *s_e Line 2503  instruction_detach(struct_processus *s_e
                                     registre_stop;                                      registre_stop;
                         }                          }
   
   #                       ifdef _BROKEN_SIGINFO
                           destruction_fifos_signaux(s_etat_processus);
   #                       endif
   
                         (*s_etat_processus).erreur_systeme = d_es_signal;                          (*s_etat_processus).erreur_systeme = d_es_signal;
                         exit(EXIT_FAILURE);                          exit(EXIT_FAILURE);
                     }                      }
Line 2490  instruction_detach(struct_processus *s_e Line 2541  instruction_detach(struct_processus *s_e
   
                     if (sigaction(SIGPIPE, &registre, NULL) != 0)                      if (sigaction(SIGPIPE, &registre, NULL) != 0)
                     {                      {
   #                       ifdef _BROKEN_SIGINFO
                           destruction_fifos_signaux(s_etat_processus);
   #                       endif
   
                         pthread_mutex_unlock(&((*s_etat_processus).mutex));                          pthread_mutex_unlock(&((*s_etat_processus).mutex));
   
                         (*s_etat_processus).erreur_systeme = d_es_signal;                          (*s_etat_processus).erreur_systeme = d_es_signal;
Line 2806  instruction_detach(struct_processus *s_e Line 2861  instruction_detach(struct_processus *s_e
   
         liberation(s_etat_processus, s_objet);          liberation(s_etat_processus, s_objet);
   
 #       ifndef Cygwin  #       if !defined(Cygwin) && !defined(OpenBSD)
         (*s_etat_processus).pile_signal.ss_flags = SS_DISABLE;          do
         sigaltstack(&((*s_etat_processus).pile_signal), NULL);          {
               (*s_etat_processus).pile_signal.ss_flags = SS_DISABLE;
           }
           while(sigaltstack(&((*s_etat_processus).pile_signal), NULL) != 0);
         free((*s_etat_processus).pile_signal.ss_sp);          free((*s_etat_processus).pile_signal.ss_sp);
 #       endif  #       endif
   
Line 2851  instruction_detach(struct_processus *s_e Line 2909  instruction_detach(struct_processus *s_e
         retrait_thread(s_etat_processus);          retrait_thread(s_etat_processus);
   
         pthread_mutex_destroy(&((*s_etat_processus).mutex));          pthread_mutex_destroy(&((*s_etat_processus).mutex));
           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_key_delete(semaphore_fork_processus_courant);          pthread_key_delete(semaphore_fork_processus_courant);
Line 2882  instruction_detach(struct_processus *s_e Line 2941  instruction_detach(struct_processus *s_e
   
         clear_history();          clear_history();
   
   #       ifdef _BROKEN_SIGINFO
           destruction_fifos_signaux(s_etat_processus);
   #       endif
   
         free(s_etat_processus);          free(s_etat_processus);
   
 #       ifdef DEBUG_MEMOIRE  #       ifdef DEBUG_MEMOIRE
Line 2897  instruction_detach(struct_processus *s_e Line 2960  instruction_detach(struct_processus *s_e
         return;          return;
     }      }
   
     if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     // Si le pid existe déjà dans la pile des processus, il s'agit forcement      // Si le pid existe déjà dans la pile des processus, il s'agit forcement
     // d'un processus moribond. On attend donc qu'il soit effectivement      // d'un processus moribond. On attend donc qu'il soit effectivement
     // libéré.      // libéré.
Line 2967  instruction_detach(struct_processus *s_e Line 3024  instruction_detach(struct_processus *s_e
   
     // Être sûr que le processus fils soit déjà présent...      // Être sûr que le processus fils soit déjà présent...
   
       attente.tv_sec = 0;
       attente.tv_nsec = GRANULARITE_us * 1000;
   
     while(kill((*s_argument_thread).pid, 0) != 0)      while(kill((*s_argument_thread).pid, 0) != 0)
     {      {
         //if ((errno != ESRCH) && (errno != EAGAIN))          //if ((errno != ESRCH) && (errno != EAGAIN))
Line 2978  instruction_detach(struct_processus *s_e Line 3038  instruction_detach(struct_processus *s_e
         }          }
   
         nanosleep(&attente, NULL);          nanosleep(&attente, NULL);
           INCR_GRANULARITE(attente.tv_nsec);
     }      }
   
     // 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.

Removed from v.1.26  
changed lines
  Added in v.1.45


CVSweb interface <joel.bertrand@systella.fr>