File:  [local] / rpl / src / instructions_s9.c
Revision 1.37: download - view: text, annotated - select for diffs - revision graph
Wed Sep 14 14:34:28 2011 UTC (12 years, 7 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Première série de patches pour rendre la gestion des signaux propre.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.3
    4:   Copyright (C) 1989-2011 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'sort'
   29: ================================================================================
   30:   Entrées :
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_sort(struct_processus *s_etat_processus)
   40: {
   41:     integer8                    i;
   42:     integer8                    j;
   43:     integer8                    nombre_elements;
   44: 
   45:     logical1                    condition;
   46:     logical1                    inversion;
   47:     logical1                    presence_nom;
   48:     logical1                    terminaison_boucle_1;
   49:     logical1                    terminaison_boucle_2;
   50:     logical1                    terminaison_boucle_3;
   51:     logical1                    variable_partagee;
   52: 
   53:     struct_liste_chainee        *l_element_courant;
   54:     struct_liste_chainee        *l_element_precedent;
   55:     struct_liste_chainee        *l_element_tampon;
   56: 
   57:     struct_objet                *s_objet_copie;
   58:     struct_objet                *s_objet_critere;
   59:     struct_objet                *s_objet_liste;
   60:     struct_objet                *s_objet_registre;
   61:     struct_objet                *s_objet_test;
   62: 
   63:     signed long                 indice_i;
   64:     signed long                 indice_j;
   65:     signed long                 indice_k;
   66:     signed long                 indice_l;
   67: 
   68:     unsigned long               ecartement;
   69: 
   70:     (*s_etat_processus).erreur_execution = d_ex;
   71: 
   72:     if ((*s_etat_processus).affichage_arguments == 'Y')
   73:     {
   74:         printf("\n  SORT ");
   75: 
   76:         if ((*s_etat_processus).langue == 'F')
   77:         {
   78:             printf("(trie une liste selon un critère paramétrable)\n\n");
   79:         }
   80:         else
   81:         {
   82:             printf("(sort a list)\n\n");
   83:         }
   84: 
   85:         printf("    2: %s\n", d_LST);
   86:         printf("    1: %s\n", d_RPN);
   87:         printf("->  1: %s\n\n", d_LST);
   88: 
   89:         printf("    2: %s\n", d_TAB);
   90:         printf("    1: %s\n", d_RPN);
   91:         printf("->  1: %s\n\n", d_LST);
   92: 
   93:         printf("    2: %s\n", d_NOM);
   94:         printf("    1: %s\n", d_RPN);
   95: 
   96:         return;
   97:     }
   98:     else if ((*s_etat_processus).test_instruction == 'Y')
   99:     {
  100:         (*s_etat_processus).nombre_arguments = -1;
  101:         return;
  102:     }
  103:     
  104:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  105:     {
  106:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  107:         {
  108:             return;
  109:         }
  110:     }
  111: 
  112:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  113:             &s_objet_critere) == d_erreur)
  114:     {
  115:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  116:         return;
  117:     }
  118: 
  119:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  120:             &s_objet_liste) == d_erreur)
  121:     {
  122:         liberation(s_etat_processus, s_objet_critere);
  123: 
  124:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  125:         return;
  126:     }
  127: 
  128:     variable_partagee = d_faux;
  129: 
  130:     if ((*s_objet_liste).type == NOM)
  131:     {
  132:         if (recherche_variable(s_etat_processus, (*((struct_nom *)
  133:                 (*s_objet_liste).objet)).nom) == d_faux)
  134:         {
  135:             (*s_etat_processus).erreur_systeme = d_es;
  136:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
  137: 
  138:             liberation(s_etat_processus, s_objet_critere);
  139:             liberation(s_etat_processus, s_objet_liste);
  140: 
  141:             return;
  142:         }
  143: 
  144:         if ((*(*s_etat_processus).pointeur_variable_courante)
  145:                 .variable_verrouillee == d_vrai)
  146:         {
  147:             (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
  148: 
  149:             liberation(s_etat_processus, s_objet_critere);
  150:             liberation(s_etat_processus, s_objet_liste);
  151: 
  152:             return;
  153:         }
  154: 
  155:         if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
  156:         {
  157:             if (pthread_mutex_lock(&((*(*s_etat_processus)
  158:                     .s_liste_variables_partagees).mutex)) != 0)
  159:             {
  160:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  161:                 return;
  162:             }
  163: 
  164:             if (recherche_variable_partagee(s_etat_processus,
  165:                     (*(*s_etat_processus).pointeur_variable_courante).nom,
  166:                     (*(*s_etat_processus).pointeur_variable_courante)
  167:                     .variable_partagee, (*(*s_etat_processus)
  168:                     .pointeur_variable_courante).origine) == d_faux)
  169:             {
  170:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  171:                         .s_liste_variables_partagees).mutex)) != 0)
  172:                 {
  173:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  174:                     return;
  175:                 }
  176: 
  177:                 (*s_etat_processus).erreur_execution =
  178:                         d_ex_erreur_type_argument;
  179: 
  180:                 liberation(s_etat_processus, s_objet_critere);
  181:                 liberation(s_etat_processus, s_objet_liste);
  182: 
  183:                 return;
  184:             }
  185: 
  186:             if (((*(*(*s_etat_processus).s_liste_variables_partagees)
  187:                     .table[(*(*s_etat_processus).s_liste_variables_partagees)
  188:                     .position_variable].objet).type != LST) &&
  189:                     ((*(*(*s_etat_processus).s_liste_variables_partagees)
  190:                     .table[(*(*s_etat_processus).s_liste_variables_partagees)
  191:                     .position_variable].objet).type != TBL))
  192:             {
  193:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  194:                         .s_liste_variables_partagees).mutex)) != 0)
  195:                 {
  196:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  197:                     return;
  198:                 }
  199: 
  200:                 (*s_etat_processus).erreur_execution =
  201:                         d_ex_erreur_type_argument;
  202: 
  203:                 liberation(s_etat_processus, s_objet_critere);
  204:                 liberation(s_etat_processus, s_objet_liste);
  205: 
  206:                 return;
  207:             }
  208: 
  209:             liberation(s_etat_processus, s_objet_liste);
  210: 
  211:             s_objet_liste = (*(*s_etat_processus).s_liste_variables_partagees)
  212:                     .table[(*(*s_etat_processus).s_liste_variables_partagees)
  213:                     .position_variable].objet;
  214: 
  215:             if ((s_objet_copie = copie_objet(s_etat_processus, s_objet_liste,
  216:                     'N')) == NULL)
  217:             {
  218:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  219:                         .s_liste_variables_partagees).mutex)) != 0)
  220:                 {
  221:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  222:                     return;
  223:                 }
  224: 
  225:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  226:                 return;
  227:             }
  228: 
  229:             variable_partagee = d_vrai;
  230:         }
  231:         else
  232:         {
  233:             if (((*(*(*s_etat_processus).pointeur_variable_courante).objet)
  234:                     .type != LST) && ((*(*(*s_etat_processus)
  235:                     .pointeur_variable_courante).objet).type != TBL))
  236:             {
  237:                 (*s_etat_processus).erreur_execution =
  238:                         d_ex_erreur_type_argument;
  239: 
  240:                 liberation(s_etat_processus, s_objet_critere);
  241:                 liberation(s_etat_processus, s_objet_liste);
  242: 
  243:                 return;
  244:             }
  245: 
  246:             liberation(s_etat_processus, s_objet_liste);
  247: 
  248:             s_objet_liste = (*(*s_etat_processus).pointeur_variable_courante)
  249:                     .objet;
  250: 
  251:             if ((s_objet_copie = copie_objet(s_etat_processus, s_objet_liste,
  252:                     'N')) == NULL)
  253:             {
  254:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  255:                 return;
  256:             }
  257:         }
  258: 
  259:         liberation(s_etat_processus, s_objet_liste);
  260:         s_objet_liste = s_objet_copie;
  261:         (*(*s_etat_processus).pointeur_variable_courante).objet = s_objet_liste;
  262:         presence_nom = d_vrai;
  263:     }
  264:     else
  265:     {
  266:         if ((s_objet_copie = copie_objet(s_etat_processus, s_objet_liste, 'N'))
  267:                 == NULL)
  268:         {
  269:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  270:             return;
  271:         }
  272: 
  273:         liberation(s_etat_processus, s_objet_liste);
  274:         s_objet_liste = s_objet_copie;
  275:         presence_nom = d_faux;
  276:     }
  277: 
  278:     if (((*s_objet_liste).type == LST) &&
  279:             ((*s_objet_critere).type == RPN))
  280:     {
  281:         /*
  282:          * Tri bulle de la liste chaînée. On se contente d'un tri bulle
  283:          * car on travaille sur une liste chaînée et non sur un tableau
  284:          * sur lequel on pourrait accéder directement aux données grâce à
  285:          * leur indice.
  286:          */
  287: 
  288:         nombre_elements = 0;
  289:         l_element_courant = (*s_objet_liste).objet;
  290: 
  291:         while(l_element_courant != NULL)
  292:         {
  293:             l_element_courant = (*l_element_courant).suivant;
  294:             nombre_elements++;
  295:         }
  296: 
  297:         // Si la liste est vide, on considère qu'elle est triée.
  298:         // De la même manière, on considère qu'une liste d'un
  299:         // seul élément est toujours triée.
  300: 
  301:         if (nombre_elements > 1)
  302:         {
  303:             j = nombre_elements;
  304: 
  305:             do
  306:             {
  307:                 inversion = d_faux;
  308: 
  309:                 l_element_courant = (*s_objet_liste).objet;
  310:                 l_element_precedent = NULL;
  311: 
  312:                 for(i = 0; i < j - 1; i++)
  313:                 {
  314:                     // Test des éléments adjacents. Pour cela, on
  315:                     // empile les deux éléments adjacents dans la pile dans
  316:                     // l'ordre [i] [i+1] et on évalue le critère d'ordre.
  317: 
  318:                     if ((s_objet_copie = copie_objet(s_etat_processus,
  319:                             (*l_element_courant).donnee, 'P')) == NULL)
  320:                     {
  321:                         (*s_etat_processus).erreur_systeme =
  322:                                 d_es_allocation_memoire;
  323:                         return;
  324:                     }
  325: 
  326:                     if (empilement(s_etat_processus,
  327:                             &((*s_etat_processus).l_base_pile),
  328:                             s_objet_copie) == d_erreur)
  329:                     {
  330:                         return;
  331:                     }
  332: 
  333:                     if ((s_objet_copie = copie_objet(s_etat_processus,
  334:                             (*(*l_element_courant)
  335:                             .suivant).donnee, 'P')) == NULL)
  336:                     {
  337:                         (*s_etat_processus).erreur_systeme =
  338:                                 d_es_allocation_memoire;
  339:                         return;
  340:                     }
  341: 
  342:                     if (empilement(s_etat_processus,
  343:                             &((*s_etat_processus).l_base_pile),
  344:                             s_objet_copie) == d_erreur)
  345:                     {
  346:                         return;
  347:                     }
  348: 
  349:                     if (evaluation(s_etat_processus, s_objet_critere, 'N')
  350:                             == d_erreur)
  351:                     {
  352:                         liberation(s_etat_processus, s_objet_critere);
  353:                         liberation(s_etat_processus, s_objet_liste);
  354: 
  355:                         return;
  356:                     }
  357: 
  358:                     if (depilement(s_etat_processus,
  359:                             &((*s_etat_processus).l_base_pile), &s_objet_test)
  360:                             == d_erreur)
  361:                     {
  362:                         liberation(s_etat_processus, s_objet_critere);
  363:                         liberation(s_etat_processus, s_objet_liste);
  364: 
  365:                         (*s_etat_processus).erreur_execution =
  366:                                 d_ex_manque_argument;
  367:                         return;
  368:                     }
  369: 
  370:                     if ((*s_objet_test).type == INT)
  371:                     {
  372:                         condition = ((*((integer8 *) (*s_objet_test).objet))
  373:                                 == 0) ? d_faux : d_vrai;
  374:                     }
  375:                     else if ((*s_objet_test).type == REL)
  376:                     {
  377:                         condition = ((*((real8 *) (*s_objet_test).objet))
  378:                                 == 0) ? d_faux : d_vrai;
  379:                     }
  380:                     else
  381:                     {
  382:                         liberation(s_etat_processus, s_objet_critere);
  383:                         liberation(s_etat_processus, s_objet_liste);
  384:                         liberation(s_etat_processus, s_objet_test);
  385: 
  386:                         (*s_etat_processus).erreur_execution =
  387:                                 d_ex_erreur_type_argument;
  388:                         return;
  389:                     }
  390: 
  391:                     liberation(s_etat_processus, s_objet_test);
  392: 
  393:                     if (condition == d_faux)
  394:                     {
  395:                         // On échange les deux éléments adjacents
  396: 
  397:                         inversion = d_vrai;
  398: 
  399:                         if (l_element_precedent == NULL)
  400:                         {
  401:                             // Échange des deux premiers éléments
  402:                             // de la liste.
  403: 
  404:                             l_element_tampon = (*(*l_element_courant)
  405:                                     .suivant).suivant;
  406:                             (*s_objet_liste).objet = (*l_element_courant)
  407:                                     .suivant;
  408:                             (*((struct_liste_chainee *) (*s_objet_liste)
  409:                                     .objet)).suivant = l_element_courant;
  410:                             (*l_element_courant).suivant =
  411:                                     l_element_tampon;
  412:                             l_element_courant = (*s_objet_liste).objet;
  413:                         }
  414:                         else
  415:                         {
  416:                             // Échange de deux éléments quelconques de la
  417:                             // liste.
  418: 
  419:                             l_element_tampon = (*l_element_courant).suivant;
  420:                             (*l_element_courant).suivant =
  421:                                     (*(*l_element_courant).suivant).suivant;
  422:                             (*l_element_precedent).suivant = l_element_tampon;
  423:                             (*l_element_tampon).suivant = l_element_courant;
  424: 
  425:                             l_element_courant = l_element_tampon;
  426:                         }
  427:                     }
  428: 
  429:                     l_element_precedent = l_element_courant;
  430:                     l_element_courant = (*l_element_courant).suivant;
  431:                 }
  432: 
  433:                 j--;
  434:             } while(inversion != d_faux);
  435:         }
  436:     }
  437:     else if (((*s_objet_liste).type == TBL) &&
  438:             ((*s_objet_critere).type == RPN))
  439:     {
  440:         /*
  441:          * Tri Shell-Metzner d'une table
  442:          */
  443: 
  444:         ecartement = (*((struct_tableau *) (*s_objet_liste).objet))
  445:                 .nombre_elements;
  446:         terminaison_boucle_1 = d_faux;
  447: 
  448:         do
  449:         {
  450:             ecartement = ecartement / 2;
  451: 
  452:             if (ecartement >= 1)
  453:             {
  454:                 indice_j = 0;
  455:                 indice_k = (*((struct_tableau *) (*s_objet_liste).objet))
  456:                         .nombre_elements - ecartement;
  457:                 terminaison_boucle_2 = d_faux;
  458: 
  459:                 do
  460:                 {
  461:                     indice_i = indice_j;
  462:                     terminaison_boucle_3 = d_faux;
  463: 
  464:                     do
  465:                     {
  466:                         indice_l = indice_i + ecartement;
  467: 
  468:                         if ((indice_i > 0) && (indice_l > 0))
  469:                         {
  470:                             if ((s_objet_copie = copie_objet(s_etat_processus,
  471:                                     (*((struct_tableau *) (*s_objet_liste)
  472:                                     .objet)).elements[indice_i - 1], 'P'))
  473:                                     == NULL)
  474:                             {
  475:                                 (*s_etat_processus).erreur_systeme =
  476:                                         d_es_allocation_memoire;
  477:                                 return;
  478:                             }
  479: 
  480:                             if (empilement(s_etat_processus,
  481:                                     &((*s_etat_processus).l_base_pile),
  482:                                     s_objet_copie) == d_erreur)
  483:                             {
  484:                                 return;
  485:                             }
  486: 
  487:                             if ((s_objet_copie = copie_objet(s_etat_processus,
  488:                                     (*((struct_tableau *) (*s_objet_liste)
  489:                                     .objet)).elements[indice_l - 1], 'P'))
  490:                                     == NULL)
  491:                             {
  492:                                 (*s_etat_processus).erreur_systeme =
  493:                                         d_es_allocation_memoire;
  494:                                 return;
  495:                             }
  496: 
  497:                             if (empilement(s_etat_processus,
  498:                                     &((*s_etat_processus).l_base_pile),
  499:                                     s_objet_copie) == d_erreur)
  500:                             {
  501:                                 return;
  502:                             }
  503: 
  504:                             if (evaluation(s_etat_processus, s_objet_critere,
  505:                                     'N') == d_erreur)
  506:                             {
  507:                                 liberation(s_etat_processus, s_objet_critere);
  508:                                 liberation(s_etat_processus, s_objet_liste);
  509: 
  510:                                 return;
  511:                             }
  512: 
  513:                             if (depilement(s_etat_processus,
  514:                                     &((*s_etat_processus).l_base_pile),
  515:                                     &s_objet_test) == d_erreur)
  516:                             {
  517:                                 liberation(s_etat_processus, s_objet_critere);
  518:                                 liberation(s_etat_processus, s_objet_liste);
  519: 
  520:                                 (*s_etat_processus).erreur_execution =
  521:                                         d_ex_manque_argument;
  522:                                 return;
  523:                             }
  524: 
  525:                             if ((*s_objet_test).type == INT)
  526:                             {
  527:                                 condition = ((*((integer8 *) (*s_objet_test)
  528:                                         .objet)) == 0) ? d_faux : d_vrai;
  529:                             }
  530:                             else if ((*s_objet_test).type == REL)
  531:                             {
  532:                                 condition = ((*((real8 *) (*s_objet_test)
  533:                                         .objet)) == 0) ? d_faux : d_vrai;
  534:                             }
  535:                             else
  536:                             {
  537:                                 liberation(s_etat_processus, s_objet_critere);
  538:                                 liberation(s_etat_processus, s_objet_liste);
  539:                                 liberation(s_etat_processus, s_objet_test);
  540: 
  541:                                 (*s_etat_processus).erreur_execution =
  542:                                         d_ex_erreur_type_argument;
  543:                                 return;
  544:                             }
  545: 
  546:                             liberation(s_etat_processus, s_objet_test);
  547: 
  548:                             if (condition == d_faux)
  549:                             {
  550:                                 s_objet_registre =
  551:                                         (*((struct_tableau *)
  552:                                         (*s_objet_liste).objet)).elements
  553:                                         [indice_i - 1];
  554:                                 (*((struct_tableau *) (*s_objet_liste).objet))
  555:                                         .elements[indice_i - 1] =
  556:                                         (*((struct_tableau *) (*s_objet_liste)
  557:                                         .objet)).elements[indice_l - 1];
  558:                                 (*((struct_tableau *) (*s_objet_liste)
  559:                                         .objet)).elements[indice_l - 1] =
  560:                                         s_objet_registre;
  561: 
  562:                                 indice_i -= ecartement;
  563: 
  564:                                 if (indice_i < 1)
  565:                                 {
  566:                                     terminaison_boucle_3 = d_vrai;
  567:                                 }
  568:                             }
  569:                             else
  570:                             {
  571:                                 terminaison_boucle_3 = d_vrai;
  572:                             }
  573:                         }
  574:                         else
  575:                         {
  576:                             terminaison_boucle_3 = d_vrai;
  577:                         }
  578:                     } while(terminaison_boucle_3 == d_faux);
  579: 
  580:                     indice_j++;
  581: 
  582:                     if (indice_j > indice_k)
  583:                     {
  584:                         terminaison_boucle_2 = d_vrai;
  585:                     }
  586:                 } while(terminaison_boucle_2 == d_faux);
  587:             }
  588:             else
  589:             {
  590:                 terminaison_boucle_1 = d_vrai;
  591:             }
  592:         } while(terminaison_boucle_1 == d_faux);
  593:     }
  594:     else
  595:     {
  596:         if (pthread_mutex_unlock(&((*(*s_etat_processus)
  597:                 .s_liste_variables_partagees).mutex)) != 0)
  598:         {
  599:             (*s_etat_processus).erreur_systeme = d_es_processus;
  600:             return;
  601:         }
  602: 
  603:         liberation(s_etat_processus, s_objet_liste);
  604:         liberation(s_etat_processus, s_objet_critere);
  605: 
  606:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  607:         return;
  608:     }
  609: 
  610:     if (presence_nom == d_faux)
  611:     {
  612:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  613:                 s_objet_liste) == d_erreur)
  614:         {
  615:             return;
  616:         }
  617:     }
  618:     else
  619:     {
  620:         if (variable_partagee == d_vrai)
  621:         {
  622:             (*(*s_etat_processus).s_liste_variables_partagees)
  623:                     .table[(*(*s_etat_processus).s_liste_variables_partagees)
  624:                     .position_variable].objet = s_objet_liste;
  625: 
  626:             if (pthread_mutex_unlock(&((*(*s_etat_processus)
  627:                     .s_liste_variables_partagees).mutex)) != 0)
  628:             {
  629:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  630:                 return;
  631:             }
  632:         }
  633:     }
  634: 
  635:     liberation(s_etat_processus, s_objet_critere);
  636: 
  637:     return;
  638: }
  639: 
  640: 
  641: /*
  642: ================================================================================
  643:   Fonction 'save'
  644: ================================================================================
  645:   Entrées : structure processus
  646: --------------------------------------------------------------------------------
  647:   Sorties :
  648: --------------------------------------------------------------------------------
  649:   Effets de bord : néant
  650: ================================================================================
  651: */
  652: 
  653: void
  654: instruction_save(struct_processus *s_etat_processus)
  655: {
  656:     struct_objet                        *s_objet_1;
  657:     struct_objet                        *s_objet_2;
  658: 
  659:     struct_variable                     s_variable;
  660: 
  661:     (*s_etat_processus).erreur_execution = d_ex;
  662: 
  663:     if ((*s_etat_processus).affichage_arguments == 'Y')
  664:     {
  665:         printf("\n  SAVE ");
  666: 
  667:         if ((*s_etat_processus).langue == 'F')
  668:         {
  669:             printf("(affecte un objet à une variable globale)\n\n");
  670:         }
  671:         else
  672:         {
  673:             printf("(store an object in a global variable)\n\n");
  674:         }
  675: 
  676:         printf("    2: %s, %s, %s, %s, %s, %s,\n"
  677:                 "       %s, %s, %s, %s, %s,\n"
  678:                 "       %s, %s, %s, %s, %s,\n"
  679:                 "       %s, %s, %s, %s,\n"
  680:                 "       %s, %s\n",
  681:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
  682:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
  683:                 d_SQL, d_SLB, d_PRC, d_MTX);
  684:         printf("    1: %s\n", d_NOM);
  685: 
  686:         return;
  687:     }
  688:     else if ((*s_etat_processus).test_instruction == 'Y')
  689:     {
  690:         (*s_etat_processus).nombre_arguments = -1;
  691:         return;
  692:     }
  693:     
  694:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  695:     {
  696:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  697:         {
  698:             return;
  699:         }
  700:     }
  701: 
  702:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  703:             &s_objet_1) == d_erreur)
  704:     {
  705:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  706:         return;
  707:     }
  708: 
  709:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  710:             &s_objet_2) == d_erreur)
  711:     {
  712:         liberation(s_etat_processus, s_objet_1);
  713: 
  714:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  715:         return;
  716:     }
  717: 
  718:     if ((*s_objet_1).type != NOM)
  719:     {
  720:         liberation(s_etat_processus, s_objet_1);
  721:         liberation(s_etat_processus, s_objet_2);
  722: 
  723:         (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
  724:         return;
  725:     }
  726: 
  727:     if (recherche_variable_globale(s_etat_processus, (*((struct_nom *)
  728:             (*s_objet_1).objet)).nom) == d_vrai)
  729:     {
  730:         /*
  731:          * Une variable est accessible.
  732:          */
  733: 
  734:         if ((*(*s_etat_processus).pointeur_variable_courante)
  735:                 .variable_verrouillee == d_vrai)
  736:         {
  737:             liberation(s_etat_processus, s_objet_1);
  738:             liberation(s_etat_processus, s_objet_2);
  739: 
  740:             (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
  741:             return;
  742:         }
  743: 
  744:         if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
  745:         {
  746:             liberation(s_etat_processus, s_objet_1);
  747:             liberation(s_etat_processus, s_objet_2);
  748: 
  749:             (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
  750:             return;
  751:         }
  752: 
  753:         liberation(s_etat_processus,
  754:                 (*(*s_etat_processus).pointeur_variable_courante).objet);
  755:         (*(*s_etat_processus).pointeur_variable_courante).objet = s_objet_2;
  756:     }
  757:     else
  758:     {
  759:         /*
  760:          * Aucune variable n'est accessible (ni locale, ni globale).
  761:          */
  762: 
  763:         if ((s_variable.nom = malloc((strlen((*((struct_nom *)
  764:                 (*s_objet_1).objet)).nom) + 1) * sizeof(unsigned char)))
  765:                 == NULL)
  766:         {
  767:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  768:             return;
  769:         }
  770: 
  771:         strcpy(s_variable.nom, (*((struct_nom *) (*s_objet_1).objet)).nom);
  772:         s_variable.niveau = 1;
  773: 
  774:         /*
  775:          * Le niveau 0 correspond aux définitions. Les variables
  776:          * commencent à 1 car elles sont toujours incluses dans
  777:          * une définition.
  778:          */
  779: 
  780:         s_variable.objet = s_objet_2;
  781: 
  782:         if (creation_variable(s_etat_processus, &s_variable, 'V', 'P')
  783:                 == d_erreur)
  784:         {
  785:             return;
  786:         }
  787: 
  788:         (*s_etat_processus).erreur_systeme = d_es;
  789:     }
  790: 
  791:     liberation(s_etat_processus, s_objet_1);
  792: 
  793:     return;
  794: }
  795: 
  796: 
  797: /*
  798: ================================================================================
  799:   Fonction 'suspend'
  800: ================================================================================
  801:   Entrées : structure processus
  802: --------------------------------------------------------------------------------
  803:   Sorties :
  804: --------------------------------------------------------------------------------
  805:   Effets de bord : néant
  806: ================================================================================
  807: */
  808: 
  809: void
  810: instruction_suspend(struct_processus *s_etat_processus)
  811: {
  812:     struct timespec             attente;
  813: 
  814:     (*s_etat_processus).erreur_execution = d_ex;
  815: 
  816:     if ((*s_etat_processus).affichage_arguments == 'Y')
  817:     {
  818:         printf("\n  SUSPEND ");
  819: 
  820:         if ((*s_etat_processus).langue == 'F')
  821:         {
  822:             printf("(attend un signal RPL/SIGCONT)\n\n");
  823:             printf("  Aucun argument\n");
  824:         }
  825:         else
  826:         {
  827:             printf("(wait for RPL/SIGCONT signal)\n\n");
  828:             printf("  No argument\n");
  829:         }
  830: 
  831:         return;
  832:     }
  833:     else if ((*s_etat_processus).test_instruction == 'Y')
  834:     {
  835:         (*s_etat_processus).nombre_arguments = -1;
  836:         return;
  837:     }
  838: 
  839:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  840:     {
  841:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  842:         {
  843:             return;
  844:         }
  845:     }
  846: 
  847:     if ((*s_etat_processus).profilage == d_vrai)
  848:     {
  849:         profilage(s_etat_processus, "Suspend");
  850: 
  851:         if ((*s_etat_processus).erreur_systeme != d_es)
  852:         {
  853:             return;
  854:         }
  855:     }
  856: 
  857: #   ifndef SEMAPHORES_NOMMES
  858:     if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  859:     {
  860:         (*s_etat_processus).erreur_systeme = d_es_processus;
  861:         return;
  862:     }
  863: #   else
  864:     if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  865:     {
  866:         (*s_etat_processus).erreur_systeme = d_es_processus;
  867:         return;
  868:     }
  869: #   endif
  870: 
  871:     for((*s_etat_processus).redemarrage_processus = d_faux;;)
  872:     {
  873:         scrutation_interruptions(s_etat_processus);
  874: 
  875:         if ((*s_etat_processus).redemarrage_processus == d_vrai)
  876:         {
  877:             break;
  878:         }
  879: 
  880:         nanosleep(&attente, NULL);
  881:         INCR_GRANULARITE(attente.tv_nsec);
  882:     }
  883: 
  884: #   ifndef SEMAPHORES_NOMMES
  885:     while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  886: #   else
  887:     while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  888: #   endif
  889:     {
  890:         if (errno != EINTR)
  891:         {
  892:             (*s_etat_processus).erreur_systeme = d_es_processus;
  893:             return;
  894:         }
  895:     }
  896: 
  897:     if ((*s_etat_processus).profilage == d_vrai)
  898:     {
  899:         profilage(s_etat_processus, NULL);
  900:     }
  901: 
  902:     return;
  903: }
  904: 
  905: 
  906: /*
  907: ================================================================================
  908:   Fonction 'static'
  909: ================================================================================
  910:   Entrées : structure processus
  911: --------------------------------------------------------------------------------
  912:   Sorties :
  913: --------------------------------------------------------------------------------
  914:   Effets de bord : néant
  915: ================================================================================
  916: */
  917: 
  918: void
  919: instruction_static(struct_processus *s_etat_processus)
  920: {
  921:     (*s_etat_processus).erreur_execution = d_ex;
  922: 
  923:     if ((*s_etat_processus).affichage_arguments == 'Y')
  924:     {
  925:         printf("\n  STATIC ");
  926: 
  927:         if ((*s_etat_processus).langue == 'F')
  928:         {
  929:             printf("(déclaration de variables statiques)\n\n");
  930:             printf("  Aucun argument\n");
  931:         }
  932:         else
  933:         {
  934:             printf("(static variables declaration)\n\n");
  935:             printf("  No argument\n");
  936:         }
  937: 
  938:         return;
  939:     }
  940:     else if ((*s_etat_processus).test_instruction == 'Y')
  941:     {
  942:         (*s_etat_processus).nombre_arguments = -1;
  943:         return;
  944:     }
  945:     
  946:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  947:     {
  948:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  949:         {
  950:             return;
  951:         }
  952:     }
  953: 
  954:     if ((*s_etat_processus).creation_variables_partagees == d_vrai)
  955:     {
  956:         (*s_etat_processus).erreur_execution = d_ex_variable_statique_partagee;
  957:         return;
  958:     }
  959: 
  960:     (*s_etat_processus).creation_variables_statiques = d_vrai;
  961: 
  962:     return;
  963: }
  964: 
  965: 
  966: /*
  967: ================================================================================
  968:   Fonction 'shared'
  969: ================================================================================
  970:   Entrées : structure processus
  971: --------------------------------------------------------------------------------
  972:   Sorties :
  973: --------------------------------------------------------------------------------
  974:   Effets de bord : néant
  975: ================================================================================
  976: */
  977: 
  978: void
  979: instruction_shared(struct_processus *s_etat_processus)
  980: {
  981:     (*s_etat_processus).erreur_execution = d_ex;
  982: 
  983:     if ((*s_etat_processus).affichage_arguments == 'Y')
  984:     {
  985:         printf("\n  SHARED ");
  986: 
  987:         if ((*s_etat_processus).langue == 'F')
  988:         {
  989:             printf("(déclaration de variables partagées)\n\n");
  990:             printf("  Aucun argument\n");
  991:         }
  992:         else
  993:         {
  994:             printf("(shared variables declaration)\n\n");
  995:             printf("  No argument\n");
  996:         }
  997: 
  998:         return;
  999:     }
 1000:     else if ((*s_etat_processus).test_instruction == 'Y')
 1001:     {
 1002:         (*s_etat_processus).nombre_arguments = -1;
 1003:         return;
 1004:     }
 1005:     
 1006:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1007:     {
 1008:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1009:         {
 1010:             return;
 1011:         }
 1012:     }
 1013: 
 1014:     if ((*s_etat_processus).creation_variables_partagees == d_vrai)
 1015:     {
 1016:         (*s_etat_processus).erreur_execution = d_ex_variable_statique_partagee;
 1017:         return;
 1018:     }
 1019: 
 1020:     (*s_etat_processus).creation_variables_partagees = d_vrai;
 1021: 
 1022:     return;
 1023: }
 1024: 
 1025: 
 1026: /*
 1027: ================================================================================
 1028:   Fonction 'stoswi'
 1029: ================================================================================
 1030:   Entrées : structure processus
 1031: --------------------------------------------------------------------------------
 1032:   Sorties :
 1033: --------------------------------------------------------------------------------
 1034:   Effets de bord : néant
 1035: ================================================================================
 1036: */
 1037: 
 1038: void
 1039: instruction_stoswi(struct_processus *s_etat_processus)
 1040: {
 1041:     integer8                    interruption;
 1042: 
 1043:     struct_objet                *s_objet_argument_1;
 1044:     struct_objet                *s_objet_argument_2;
 1045: 
 1046:     (*s_etat_processus).erreur_execution = d_ex;
 1047: 
 1048:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1049:     {
 1050:         printf("\n  STOSWI ");
 1051: 
 1052:         if ((*s_etat_processus).langue == 'F')
 1053:         {
 1054:             printf("(définition d'une interruption logicielle)\n\n");
 1055:         }
 1056:         else
 1057:         {
 1058:             printf("(software interrupt definition)\n\n");
 1059:         }
 1060: 
 1061:         printf("    2: %s, %s\n", d_NOM, d_RPN);
 1062:         printf("    1: %s\n", d_INT);
 1063: 
 1064:         return;
 1065:     }
 1066:     else if ((*s_etat_processus).test_instruction == 'Y')
 1067:     {
 1068:         (*s_etat_processus).nombre_arguments = -1;
 1069:         return;
 1070:     }
 1071: 
 1072:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1073:     {
 1074:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
 1075:         {
 1076:             return;
 1077:         }
 1078:     }
 1079: 
 1080:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1081:             &s_objet_argument_1) == d_erreur)
 1082:     {
 1083:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1084:         return;
 1085:     }
 1086: 
 1087:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1088:             &s_objet_argument_2) == d_erreur)
 1089:     {
 1090:         liberation(s_etat_processus, s_objet_argument_1);
 1091: 
 1092:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1093:         return;
 1094:     }
 1095: 
 1096:     if ((*s_objet_argument_1).type == INT)
 1097:     {
 1098:         interruption = (*((integer8 *) (*s_objet_argument_1).objet));
 1099: 
 1100:         if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
 1101:         {
 1102:             liberation(s_etat_processus, s_objet_argument_1);
 1103:             liberation(s_etat_processus, s_objet_argument_2);
 1104: 
 1105:             (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
 1106:             return;
 1107:         }
 1108: 
 1109:         if ((*s_objet_argument_2).type == NOM)
 1110:         {
 1111:             liberation(s_etat_processus, (*s_etat_processus).corps_interruptions
 1112:                     [interruption - 1]);
 1113:             (*s_etat_processus).corps_interruptions[interruption - 1] =
 1114:                     s_objet_argument_2;
 1115:         }
 1116:         else if((*s_objet_argument_2).type == RPN)
 1117:         {
 1118:             liberation(s_etat_processus, (*s_etat_processus).corps_interruptions
 1119:                     [interruption - 1]);
 1120:             (*s_etat_processus).corps_interruptions[interruption - 1] =
 1121:                     s_objet_argument_2;
 1122:         }
 1123:         else
 1124:         {
 1125:             liberation(s_etat_processus, s_objet_argument_1);
 1126:             liberation(s_etat_processus, s_objet_argument_2);
 1127: 
 1128:             (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1129:             return;
 1130:         }
 1131:     }
 1132:     else
 1133:     {
 1134:         liberation(s_etat_processus, s_objet_argument_1);
 1135:         liberation(s_etat_processus, s_objet_argument_2);
 1136: 
 1137:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1138:         return;
 1139:     }
 1140: 
 1141:     liberation(s_etat_processus, s_objet_argument_1);
 1142: 
 1143:     return;
 1144: }
 1145: 
 1146: 
 1147: /*
 1148: ================================================================================
 1149:   Fonction 'swi'
 1150: ================================================================================
 1151:   Entrées : structure processus
 1152: --------------------------------------------------------------------------------
 1153:   Sorties :
 1154: --------------------------------------------------------------------------------
 1155:   Effets de bord : néant
 1156: ================================================================================
 1157: */
 1158: 
 1159: void
 1160: instruction_swi(struct_processus *s_etat_processus)
 1161: {
 1162:     int                         interruption_reduite;
 1163: 
 1164:     integer8                    interruption;
 1165: 
 1166:     pid_t                       pid;
 1167: 
 1168:     pthread_t                   tid;
 1169: 
 1170:     sig_atomic_t                registre;
 1171: 
 1172:     ssize_t                     longueur_ecriture;
 1173: 
 1174:     struct_objet                *s_objet_argument;
 1175: 
 1176:     struct timespec             attente;
 1177: 
 1178:     unsigned char               tampon;
 1179: 
 1180:     (*s_etat_processus).erreur_execution = d_ex;
 1181: 
 1182:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1183:     {
 1184:         printf("\n  SWI ");
 1185: 
 1186:         if ((*s_etat_processus).langue == 'F')
 1187:         {
 1188:             printf("(interruption logicielle)\n\n");
 1189:         }
 1190:         else
 1191:         {
 1192:             printf("(software interrupt)\n\n");
 1193:         }
 1194: 
 1195:         printf("    1: %s\n", d_INT);
 1196: 
 1197:         return;
 1198:     }
 1199:     else if ((*s_etat_processus).test_instruction == 'Y')
 1200:     {
 1201:         (*s_etat_processus).nombre_arguments = -1;
 1202:         return;
 1203:     }
 1204: 
 1205:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1206:     {
 1207:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1208:         {
 1209:             return;
 1210:         }
 1211:     }
 1212: 
 1213:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1214:             &s_objet_argument) == d_erreur)
 1215:     {
 1216:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1217:         return;
 1218:     }
 1219: 
 1220:     if ((*s_objet_argument).type == INT)
 1221:     {
 1222:         interruption = (*((integer8 *) (*s_objet_argument).objet));
 1223: 
 1224:         if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
 1225:         {
 1226:             liberation(s_etat_processus, s_objet_argument);
 1227: 
 1228:             (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
 1229:             return;
 1230:         }
 1231: 
 1232:         if ((*s_etat_processus).presence_pipes == d_faux)
 1233:         {
 1234:             liberation(s_etat_processus, s_objet_argument);
 1235: 
 1236:             (*s_etat_processus).erreur_execution = d_ex_absence_processus_pere;
 1237:             return;
 1238:         }
 1239: 
 1240:         // Envoi d'un PID invalide (-1) pour ne pas bloquer le thread
 1241:         // de surveillance.
 1242: 
 1243:         registre = (*s_etat_processus).var_volatile_traitement_retarde_stop;
 1244:         (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
 1245: 
 1246:         if ((*s_etat_processus).processus_detache == d_vrai)
 1247:         {
 1248:             pid = -1;
 1249: 
 1250:             attente.tv_sec = 0;
 1251:             attente.tv_nsec = GRANULARITE_us * 1000;
 1252: 
 1253: #           ifndef SEMAPHORES_NOMMES
 1254:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1255:             {
 1256:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1257:                 return;
 1258:             }
 1259: #           else
 1260:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1261:             {
 1262:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1263:                 return;
 1264:             }
 1265: #           endif
 1266: 
 1267:             while((longueur_ecriture = write_atomic(s_etat_processus,
 1268:                     (*s_etat_processus).pipe_nombre_objets_attente,
 1269:                     &pid, sizeof(pid))) != sizeof(pid))
 1270:             {
 1271: #               ifndef SEMAPHORES_NOMMES
 1272:                 while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1273: #               else
 1274:                 while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1275: #               endif
 1276:                 {
 1277:                     if (errno != EINTR)
 1278:                     {
 1279:                         (*s_etat_processus).erreur_systeme = d_es_processus;
 1280:                         return;
 1281:                     }
 1282:                 }
 1283: 
 1284:                 if (longueur_ecriture == -1)
 1285:                 {
 1286:                     if (registre == 0)
 1287:                     {
 1288:                         if ((*s_etat_processus)
 1289:                                 .var_volatile_traitement_retarde_stop == -1)
 1290:                         {
 1291:                             (*s_etat_processus).var_volatile_requete_arret = -1;
 1292:                         }
 1293: 
 1294:                         (*s_etat_processus)
 1295:                                 .var_volatile_traitement_retarde_stop
 1296:                                 = registre;
 1297:                     }
 1298: 
 1299:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1300:                     return;
 1301:                 }
 1302: 
 1303:                 nanosleep(&attente, NULL);
 1304:                 INCR_GRANULARITE(attente.tv_nsec);
 1305: 
 1306: #               ifndef SEMAPHORES_NOMMES
 1307:                 if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1308: #               else
 1309:                 if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1310: #               endif
 1311:                 {
 1312:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1313:                     return;
 1314:                 }
 1315:             }
 1316: 
 1317: #           ifndef SEMAPHORES_NOMMES
 1318:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1319: #           else
 1320:             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1321: #           endif
 1322:             {
 1323:                 if (errno != EINTR)
 1324:                 {
 1325:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1326:                     return;
 1327:                 }
 1328:             }
 1329:         }
 1330:         else
 1331:         {
 1332:             tid = -1;
 1333: 
 1334:             attente.tv_sec = 0;
 1335:             attente.tv_nsec = GRANULARITE_us * 1000;
 1336: 
 1337: #           ifndef SEMAPHORES_NOMMES
 1338:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1339:             {
 1340:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1341:                 return;
 1342:             }
 1343: #           else
 1344:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1345:             {
 1346:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1347:                 return;
 1348:             }
 1349: #           endif
 1350: 
 1351:             while((longueur_ecriture = write_atomic(s_etat_processus,
 1352:                     (*s_etat_processus).pipe_nombre_objets_attente,
 1353:                     &tid, sizeof(tid))) != sizeof(tid))
 1354:             {
 1355: #               ifndef SEMAPHORES_NOMMES
 1356:                 while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1357: #               else
 1358:                 while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1359: #               endif
 1360:                 {
 1361:                     if (errno != EINTR)
 1362:                     {
 1363:                         (*s_etat_processus).erreur_systeme = d_es_processus;
 1364:                         return;
 1365:                     }
 1366:                 }
 1367: 
 1368:                 if (longueur_ecriture == -1)
 1369:                 {
 1370:                     if (registre == 0)
 1371:                     {
 1372:                         if ((*s_etat_processus)
 1373:                                 .var_volatile_traitement_retarde_stop == -1)
 1374:                         {
 1375:                             (*s_etat_processus).var_volatile_requete_arret = -1;
 1376:                         }
 1377: 
 1378:                         (*s_etat_processus)
 1379:                                 .var_volatile_traitement_retarde_stop
 1380:                                 = registre;
 1381:                     }
 1382: 
 1383:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1384:                     return;
 1385:                 }
 1386: 
 1387:                 nanosleep(&attente, NULL);
 1388:                 INCR_GRANULARITE(attente.tv_nsec);
 1389: 
 1390: #               ifndef SEMAPHORES_NOMMES
 1391:                 if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1392:                 {
 1393:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1394:                     return;
 1395:                 }
 1396: #               else
 1397:                 if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1398:                 {
 1399:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1400:                     return;
 1401:                 }
 1402: #               endif
 1403:             }
 1404: 
 1405: #           ifndef SEMAPHORES_NOMMES
 1406:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1407: #           else
 1408:             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1409: #           endif
 1410:             {
 1411:                 if (errno != EINTR)
 1412:                 {
 1413:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1414:                     return;
 1415:                 }
 1416:             }
 1417:         }
 1418: 
 1419:         interruption_reduite = interruption;
 1420: 
 1421:         attente.tv_sec = 0;
 1422:         attente.tv_nsec = GRANULARITE_us * 1000;
 1423: 
 1424: #       ifndef SEMAPHORES_NOMMES
 1425:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1426:         {
 1427:             (*s_etat_processus).erreur_systeme = d_es_processus;
 1428:             return;
 1429:         }
 1430: #       else
 1431:         if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1432:         {
 1433:             (*s_etat_processus).erreur_systeme = d_es_processus;
 1434:             return;
 1435:         }
 1436: #       endif
 1437: 
 1438:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1439:                 (*s_etat_processus).pipe_interruptions,
 1440:                 &interruption_reduite, sizeof(interruption_reduite)))
 1441:                 != sizeof(interruption_reduite))
 1442:         {
 1443: #           ifndef SEMAPHORES_NOMMES
 1444:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1445: #           else
 1446:             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1447: #           endif
 1448:             {
 1449:                 if (errno != EINTR)
 1450:                 {
 1451:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1452:                     return;
 1453:                 }
 1454:             }
 1455: 
 1456:             if (longueur_ecriture == -1)
 1457:             {
 1458:                 if (registre == 0)
 1459:                 {
 1460:                     if ((*s_etat_processus)
 1461:                             .var_volatile_traitement_retarde_stop == -1)
 1462:                     {
 1463:                         (*s_etat_processus).var_volatile_requete_arret = -1;
 1464:                     }
 1465: 
 1466:                     (*s_etat_processus)
 1467:                             .var_volatile_traitement_retarde_stop
 1468:                             = registre;
 1469:                 }
 1470: 
 1471:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1472:                 return;
 1473:             }
 1474: 
 1475:             nanosleep(&attente, NULL);
 1476:             INCR_GRANULARITE(attente.tv_nsec);
 1477: 
 1478: #           ifndef SEMAPHORES_NOMMES
 1479:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1480:             {
 1481:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1482:                 return;
 1483:             }
 1484: #           else
 1485:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1486:             {
 1487:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1488:                 return;
 1489:             }
 1490: #           endif
 1491:         }
 1492: 
 1493: #       ifndef SEMAPHORES_NOMMES
 1494:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1495: #       else
 1496:         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1497: #       endif
 1498:         {
 1499:             if (errno != EINTR)
 1500:             {
 1501:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1502:                 return;
 1503:             }
 1504:         }
 1505: 
 1506:         if ((*s_etat_processus).processus_detache == d_vrai)
 1507:         {
 1508:             pid = -3;
 1509: 
 1510:             attente.tv_sec = 0;
 1511:             attente.tv_nsec = GRANULARITE_us * 1000;
 1512: 
 1513: #           ifndef SEMAPHORES_NOMMES
 1514:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1515:             {
 1516:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1517:                 return;
 1518:             }
 1519: #           else
 1520:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1521:             {
 1522:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1523:                 return;
 1524:             }
 1525: #           endif
 1526: 
 1527:             while((longueur_ecriture = write_atomic(s_etat_processus,
 1528:                     (*s_etat_processus).pipe_nombre_interruptions_attente,
 1529:                     &pid, sizeof(pid))) != sizeof(pid))
 1530:             {
 1531: #               ifndef SEMAPHORES_NOMMES
 1532:                 while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1533: #               else
 1534:                 while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1535: #               endif
 1536:                 {
 1537:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1538:                     return;
 1539:                 }
 1540: 
 1541:                 if (longueur_ecriture == -1)
 1542:                 {
 1543:                     if (registre == 0)
 1544:                     {
 1545:                         if ((*s_etat_processus)
 1546:                                 .var_volatile_traitement_retarde_stop == -1)
 1547:                         {
 1548:                             (*s_etat_processus).var_volatile_requete_arret = -1;
 1549:                         }
 1550: 
 1551:                         (*s_etat_processus)
 1552:                                 .var_volatile_traitement_retarde_stop
 1553:                                 = registre;
 1554:                     }
 1555: 
 1556:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1557:                     return;
 1558:                 }
 1559: 
 1560:                 nanosleep(&attente, NULL);
 1561:                 INCR_GRANULARITE(attente.tv_nsec);
 1562: 
 1563: #               ifndef SEMAPHORES_NOMMES
 1564:                 if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1565:                 {
 1566:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1567:                     return;
 1568:                 }
 1569: #               else
 1570:                 if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1571:                 {
 1572:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1573:                     return;
 1574:                 }
 1575: #               endif
 1576:             }
 1577: 
 1578:             pid = getpid();
 1579: 
 1580:             attente.tv_sec = 0;
 1581:             attente.tv_nsec = GRANULARITE_us * 1000;
 1582: 
 1583:             while((longueur_ecriture = write_atomic(s_etat_processus,
 1584:                     (*s_etat_processus).pipe_nombre_interruptions_attente,
 1585:                     &pid, sizeof(pid))) != sizeof(pid))
 1586:             {
 1587: #               ifndef SEMAPHORES_NOMMES
 1588:                 while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1589: #               else
 1590:                 while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1591: #               endif
 1592:                 {
 1593:                     if (errno != EINTR)
 1594:                     {
 1595:                         (*s_etat_processus).erreur_systeme = d_es_processus;
 1596:                         return;
 1597:                     }
 1598:                 }
 1599: 
 1600:                 if (longueur_ecriture == -1)
 1601:                 {
 1602:                     if (registre == 0)
 1603:                     {
 1604:                         if ((*s_etat_processus)
 1605:                                 .var_volatile_traitement_retarde_stop == -1)
 1606:                         {
 1607:                             (*s_etat_processus).var_volatile_requete_arret = -1;
 1608:                         }
 1609: 
 1610:                         (*s_etat_processus)
 1611:                                 .var_volatile_traitement_retarde_stop
 1612:                                 = registre;
 1613:                     }
 1614: 
 1615:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1616:                     return;
 1617:                 }
 1618: 
 1619:                 nanosleep(&attente, NULL);
 1620:                 INCR_GRANULARITE(attente.tv_nsec);
 1621: 
 1622: #               ifndef SEMAPHORES_NOMMES
 1623:                 if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1624:                 {
 1625:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1626:                     return;
 1627:                 }
 1628: #               else
 1629:                 if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1630:                 {
 1631:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1632:                     return;
 1633:                 }
 1634: #               endif
 1635:             }
 1636: 
 1637: #           ifndef SEMAPHORES_NOMMES
 1638:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1639: #           else
 1640:             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1641: #           endif
 1642:             {
 1643:                 if (errno != EINTR)
 1644:                 {
 1645:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1646:                     return;
 1647:                 }
 1648:             }
 1649:         }
 1650:         else
 1651:         {
 1652:             tid = -3;
 1653: 
 1654: #           ifndef SEMAPHORES_NOMMES
 1655:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1656:             {
 1657:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1658:                 return;
 1659:             }
 1660: #           else
 1661:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1662:             {
 1663:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1664:                 return;
 1665:             }
 1666: #           endif
 1667: 
 1668:             while((longueur_ecriture = write_atomic(s_etat_processus,
 1669:                     (*s_etat_processus).pipe_nombre_interruptions_attente,
 1670:                     &tid, sizeof(tid))) != sizeof(tid))
 1671:             {
 1672: #               ifndef SEMAPHORES_NOMMES
 1673:                 while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1674: #               else
 1675:                 while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1676: #               endif
 1677:                 {
 1678:                     if (errno != EINTR)
 1679:                     {
 1680:                         (*s_etat_processus).erreur_systeme = d_es_processus;
 1681:                         return;
 1682:                     }
 1683:                 }
 1684: 
 1685:                 if (longueur_ecriture == -1)
 1686:                 {
 1687:                     if (registre == 0)
 1688:                     {
 1689:                         if ((*s_etat_processus)
 1690:                                 .var_volatile_traitement_retarde_stop == -1)
 1691:                         {
 1692:                             (*s_etat_processus).var_volatile_requete_arret = -1;
 1693:                         }
 1694: 
 1695:                         (*s_etat_processus)
 1696:                                 .var_volatile_traitement_retarde_stop
 1697:                                 = registre;
 1698:                     }
 1699: 
 1700:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1701:                     return;
 1702:                 }
 1703: 
 1704:                 nanosleep(&attente, NULL);
 1705:                 INCR_GRANULARITE(attente.tv_nsec);
 1706: 
 1707: #               ifndef SEMAPHORES_NOMMES
 1708:                 if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1709:                 {
 1710:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1711:                     return;
 1712:                 }
 1713: #               else
 1714:                 if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1715:                 {
 1716:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1717:                     return;
 1718:                 }
 1719: #               endif
 1720:             }
 1721: 
 1722:             tid = pthread_self();
 1723: 
 1724:             attente.tv_sec = 0;
 1725:             attente.tv_nsec = GRANULARITE_us * 1000;
 1726: 
 1727:             while((longueur_ecriture = write_atomic(s_etat_processus,
 1728:                     (*s_etat_processus).pipe_nombre_interruptions_attente,
 1729:                     &tid, sizeof(tid))) != sizeof(tid))
 1730:             {
 1731: #               ifndef SEMAPHORES_NOMMES
 1732:                 while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1733: #               else
 1734:                 while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1735: #               endif
 1736:                 {
 1737:                     if (errno != EINTR)
 1738:                     {
 1739:                         (*s_etat_processus).erreur_systeme = d_es_processus;
 1740:                         return;
 1741:                     }
 1742:                 }
 1743: 
 1744:                 if (longueur_ecriture == -1)
 1745: 
 1746:                 {
 1747:                     if (registre == 0)
 1748:                     {
 1749:                         if ((*s_etat_processus)
 1750:                                 .var_volatile_traitement_retarde_stop == -1)
 1751:                         {
 1752:                             (*s_etat_processus).var_volatile_requete_arret = -1;
 1753:                         }
 1754: 
 1755:                         (*s_etat_processus)
 1756:                                 .var_volatile_traitement_retarde_stop
 1757:                                 = registre;
 1758:                     }
 1759: 
 1760:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1761:                     return;
 1762:                 }
 1763: 
 1764:                 nanosleep(&attente, NULL);
 1765:                 INCR_GRANULARITE(attente.tv_nsec);
 1766: 
 1767: #               ifndef SEMAPHORES_NOMMES
 1768:                 if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1769:                 {
 1770:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1771:                     return;
 1772:                 }
 1773: #               else
 1774:                 if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1775:                 {
 1776:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1777:                     return;
 1778:                 }
 1779: #               endif
 1780:             }
 1781: 
 1782: #           ifndef SEMAPHORES_NOMMES
 1783:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1784: #           else
 1785:             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1786: #           endif
 1787:             {
 1788:                 if (errno != EINTR)
 1789:                 {
 1790:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1791:                     return;
 1792:                 }
 1793:             }
 1794:         }
 1795: 
 1796:         attente.tv_sec = 0;
 1797:         attente.tv_nsec = GRANULARITE_us * 1000;
 1798: 
 1799: #       ifndef SEMAPHORES_NOMMES
 1800:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1801:         {
 1802:             (*s_etat_processus).erreur_systeme = d_es_processus;
 1803:             return;
 1804:         }
 1805: #       else
 1806:         if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1807:         {
 1808:             (*s_etat_processus).erreur_systeme = d_es_processus;
 1809:             return;
 1810:         }
 1811: #       endif
 1812: 
 1813:         while(read_atomic(s_etat_processus,
 1814:                 (*s_etat_processus).pipe_acquittement,
 1815:                 &tampon, sizeof(unsigned char)) != sizeof(unsigned char))
 1816:         {
 1817: #           ifndef SEMAPHORES_NOMMES
 1818:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1819: #           else
 1820:             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1821: #           endif
 1822:             {
 1823:                 if (errno != EINTR)
 1824:                 {
 1825:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1826:                     return;
 1827:                 }
 1828:             }
 1829: 
 1830:             nanosleep(&attente, NULL);
 1831:             INCR_GRANULARITE(attente.tv_nsec);
 1832: 
 1833: #           ifndef SEMAPHORES_NOMMES
 1834:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1835: #           else
 1836:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1837: #           endif
 1838:             {
 1839:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1840:                 return;
 1841:             }
 1842:         }
 1843: 
 1844: #       ifndef SEMAPHORES_NOMMES
 1845:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1846: #       else
 1847:         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1848: #       endif
 1849:         {
 1850:             if (errno != EINTR)
 1851:             {
 1852:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1853:                 return;
 1854:             }
 1855:         }
 1856: 
 1857:         if (registre == 0)
 1858:         {
 1859:             if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
 1860:             {
 1861:                 (*s_etat_processus).var_volatile_requete_arret = -1;
 1862:             }
 1863: 
 1864:             (*s_etat_processus).var_volatile_traitement_retarde_stop = registre;
 1865:         }
 1866:     }
 1867:     else
 1868:     {
 1869:         liberation(s_etat_processus, s_objet_argument);
 1870: 
 1871:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1872:         return;
 1873:     }
 1874: 
 1875:     liberation(s_etat_processus, s_objet_argument);
 1876: 
 1877:     return;
 1878: }
 1879: 
 1880: 
 1881: /*
 1882: ================================================================================
 1883:   Fonction 'swilock'
 1884: ================================================================================
 1885:   Entrées : structure processus
 1886: --------------------------------------------------------------------------------
 1887:   Sorties :
 1888: --------------------------------------------------------------------------------
 1889:   Effets de bord : néant
 1890: ================================================================================
 1891: */
 1892: 
 1893: void
 1894: instruction_swilock(struct_processus *s_etat_processus)
 1895: {
 1896:     integer8                    interruption;
 1897: 
 1898:     struct_liste_chainee        *l_element_courant;
 1899: 
 1900:     struct_objet                *s_objet_argument;
 1901: 
 1902:     (*s_etat_processus).erreur_execution = d_ex;
 1903: 
 1904:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1905:     {
 1906:         printf("\n  SWILOCK ");
 1907: 
 1908:         if ((*s_etat_processus).langue == 'F')
 1909:         {
 1910:             printf("(verrouillage des interruptions logicielles)\n\n");
 1911:         }
 1912:         else
 1913:         {
 1914:             printf("(software interrupt lock)\n\n");
 1915:         }
 1916: 
 1917:         printf("    1: %s, %s\n", d_INT, d_LST);
 1918: 
 1919:         return;
 1920:     }
 1921:     else if ((*s_etat_processus).test_instruction == 'Y')
 1922:     {
 1923:         (*s_etat_processus).nombre_arguments = -1;
 1924:         return;
 1925:     }
 1926: 
 1927:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1928:     {
 1929:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1930:         {
 1931:             return;
 1932:         }
 1933:     }
 1934: 
 1935:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1936:             &s_objet_argument) == d_erreur)
 1937:     {
 1938:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1939:         return;
 1940:     }
 1941: 
 1942:     if ((*s_objet_argument).type == INT)
 1943:     {
 1944:         interruption = (*((integer8 *) (*s_objet_argument).objet));
 1945: 
 1946:         if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
 1947:         {
 1948:             liberation(s_etat_processus, s_objet_argument);
 1949: 
 1950:             (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
 1951:             return;
 1952:         }
 1953: 
 1954:         (*s_etat_processus).masque_interruptions[interruption - 1] = 'I';
 1955:     }
 1956:     else if ((*s_objet_argument).type == LST)
 1957:     {
 1958:         l_element_courant = (*s_objet_argument).objet;
 1959: 
 1960:         while(l_element_courant)
 1961:         {
 1962:             if ((*(*l_element_courant).donnee).type != INT)
 1963:             {
 1964:                 liberation(s_etat_processus, s_objet_argument);
 1965: 
 1966:                 (*s_etat_processus).erreur_execution =
 1967:                         d_ex_erreur_type_argument;
 1968:                 return;
 1969:             }
 1970: 
 1971:             interruption = (*((integer8 *) (*(*l_element_courant)
 1972:                     .donnee).objet));
 1973: 
 1974:             if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
 1975:             {
 1976:                 liberation(s_etat_processus, s_objet_argument);
 1977: 
 1978:                 (*s_etat_processus).erreur_execution =
 1979:                         d_ex_interruption_invalide;
 1980:                 return;
 1981:             }
 1982: 
 1983:             (*s_etat_processus).masque_interruptions[interruption - 1] = 'I';
 1984:             l_element_courant = (*l_element_courant).suivant;
 1985:         }
 1986:     }
 1987:     else
 1988:     {
 1989:         liberation(s_etat_processus, s_objet_argument);
 1990: 
 1991:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1992:         return;
 1993:     }
 1994: 
 1995:     liberation(s_etat_processus, s_objet_argument);
 1996: 
 1997:     return;
 1998: }
 1999: 
 2000: 
 2001: /*
 2002: ================================================================================
 2003:   Fonction 'swistatus'
 2004: ================================================================================
 2005:   Entrées : structure processus
 2006: --------------------------------------------------------------------------------
 2007:   Sorties :
 2008: --------------------------------------------------------------------------------
 2009:   Effets de bord : néant
 2010: ================================================================================
 2011: */
 2012: 
 2013: void
 2014: instruction_swistatus(struct_processus *s_etat_processus)
 2015: {
 2016:     int                         i;
 2017: 
 2018:     struct_liste_chainee        *l_element_courant;
 2019:     struct_liste_chainee        *l_element_futur;
 2020:     struct_liste_chainee        *l_element_liste;
 2021: 
 2022:     struct_objet                *s_objet_resultat;
 2023: 
 2024:     (*s_etat_processus).erreur_execution = d_ex;
 2025: 
 2026:     if ((*s_etat_processus).affichage_arguments == 'Y')
 2027:     {
 2028:         printf("\n  SWISTATUS ");
 2029: 
 2030:         if ((*s_etat_processus).langue == 'F')
 2031:         {
 2032:             printf("(état des interruptions logicielles)\n\n");
 2033:         }
 2034:         else
 2035:         {
 2036:             printf("(software interrupts status)\n\n");
 2037:         }
 2038: 
 2039:         printf("->  1: %s\n\n", d_LST);
 2040: 
 2041:         if ((*s_etat_processus).langue == 'F')
 2042:         {
 2043:             printf("  Utilisation :\n\n");
 2044:         }
 2045:         else
 2046:         {
 2047:             printf("  Usage:\n\n");
 2048:         }
 2049: 
 2050:         printf("    { { initialized interrupts }\n"
 2051:                 "      { unlocked interrupts }\n"
 2052:                 "      { queued interrupts }\n"
 2053:                 "      { locked interrupts } }\n");
 2054:         return;
 2055:     }
 2056:     else if ((*s_etat_processus).test_instruction == 'Y')
 2057:     {
 2058:         (*s_etat_processus).nombre_arguments = -1;
 2059:         return;
 2060:     }
 2061: 
 2062:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 2063:     {
 2064:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 2065:         {
 2066:             return;
 2067:         }
 2068:     }
 2069: 
 2070:     if ((s_objet_resultat = allocation(s_etat_processus, LST)) == NULL)
 2071:     {
 2072:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2073:         return;
 2074:     }
 2075: 
 2076:     if (((*s_objet_resultat).objet =
 2077:             allocation_maillon(s_etat_processus)) == NULL)
 2078:     {
 2079:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2080:         return;
 2081:     }
 2082: 
 2083:     l_element_courant = (struct_liste_chainee *) (*s_objet_resultat).objet;
 2084: 
 2085:     if (((*l_element_courant).donnee = allocation(s_etat_processus, LST))
 2086:             == NULL)
 2087:     {
 2088:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2089:         return;
 2090:     }
 2091: 
 2092:     l_element_liste = NULL;
 2093:     l_element_futur = NULL;
 2094: 
 2095:     for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
 2096:     {
 2097:         if ((*s_etat_processus).corps_interruptions[i] != NULL)
 2098:         {
 2099:             if (l_element_liste == NULL)
 2100:             {
 2101:                 if ((l_element_liste =
 2102:                         allocation_maillon(s_etat_processus)) == NULL)
 2103:                 {
 2104:                     (*s_etat_processus).erreur_systeme =
 2105:                             d_es_allocation_memoire;
 2106:                     return;
 2107:                 }
 2108: 
 2109:                 l_element_futur = l_element_liste;
 2110:             }
 2111:             else
 2112:             {
 2113:                 if (((*l_element_liste).suivant =
 2114:                         allocation_maillon(s_etat_processus)) == NULL)
 2115:                 {
 2116:                     (*s_etat_processus).erreur_systeme =
 2117:                             d_es_allocation_memoire;
 2118:                     return;
 2119:                 }
 2120: 
 2121:                 l_element_liste = (*l_element_liste).suivant;
 2122:             }
 2123: 
 2124:             (*l_element_liste).suivant = NULL;
 2125: 
 2126:             if (((*l_element_liste).donnee = allocation(s_etat_processus,
 2127:                     INT)) == NULL)
 2128:             {
 2129:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2130:                 return;
 2131:             }
 2132: 
 2133:             (*((integer8 *) (*(*l_element_liste).donnee).objet)) = i + 1;
 2134:         }
 2135:     }
 2136: 
 2137:     (*(*l_element_courant).donnee).objet = l_element_futur;
 2138: 
 2139:     if (((*l_element_courant).suivant =
 2140:             allocation_maillon(s_etat_processus)) == NULL)
 2141:     {
 2142:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2143:         return;
 2144:     }
 2145: 
 2146:     l_element_courant = (*l_element_courant).suivant;
 2147: 
 2148:     if (((*l_element_courant).donnee = allocation(s_etat_processus, LST))
 2149:             == NULL)
 2150:     {
 2151:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2152:         return;
 2153:     }
 2154: 
 2155:     l_element_liste = NULL;
 2156:     l_element_futur = NULL;
 2157: 
 2158:     for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
 2159:     {
 2160:         if ((*s_etat_processus).masque_interruptions[i] == 'N')
 2161:         {
 2162:             if (l_element_liste == NULL)
 2163:             {
 2164:                 if ((l_element_liste =
 2165:                         allocation_maillon(s_etat_processus)) == NULL)
 2166:                 {
 2167:                     (*s_etat_processus).erreur_systeme =
 2168:                             d_es_allocation_memoire;
 2169:                     return;
 2170:                 }
 2171: 
 2172:                 l_element_futur = l_element_liste;
 2173:             }
 2174:             else
 2175:             {
 2176:                 if (((*l_element_liste).suivant =
 2177:                         allocation_maillon(s_etat_processus)) == NULL)
 2178:                 {
 2179:                     (*s_etat_processus).erreur_systeme =
 2180:                             d_es_allocation_memoire;
 2181:                     return;
 2182:                 }
 2183: 
 2184:                 l_element_liste = (*l_element_liste).suivant;
 2185:             }
 2186: 
 2187:             (*l_element_liste).suivant = NULL;
 2188: 
 2189:             if (((*l_element_liste).donnee = allocation(s_etat_processus,
 2190:                     INT)) == NULL)
 2191:             {
 2192:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2193:                 return;
 2194:             }
 2195: 
 2196:             (*((integer8 *) (*(*l_element_liste).donnee).objet)) = i + 1;
 2197:         }
 2198:     }
 2199: 
 2200:     (*(*l_element_courant).donnee).objet = l_element_futur;
 2201: 
 2202:     if (((*l_element_courant).suivant = allocation_maillon(s_etat_processus))
 2203:             == NULL)
 2204:     {
 2205:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2206:         return;
 2207:     }
 2208: 
 2209:     l_element_courant = (*l_element_courant).suivant;
 2210: 
 2211:     if (((*l_element_courant).donnee = allocation(s_etat_processus, LST))
 2212:             == NULL)
 2213:     {
 2214:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2215:         return;
 2216:     }
 2217: 
 2218:     l_element_liste = NULL;
 2219:     l_element_futur = NULL;
 2220: 
 2221:     for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
 2222:     {
 2223:         if ((*s_etat_processus).masque_interruptions[i] == 'Q')
 2224:         {
 2225:             if (l_element_liste == NULL)
 2226:             {
 2227:                 if ((l_element_liste =
 2228:                         allocation_maillon(s_etat_processus)) == NULL)
 2229:                 {
 2230:                     (*s_etat_processus).erreur_systeme =
 2231:                             d_es_allocation_memoire;
 2232:                     return;
 2233:                 }
 2234: 
 2235:                 l_element_futur = l_element_liste;
 2236:             }
 2237:             else
 2238:             {
 2239:                 if (((*l_element_liste).suivant =
 2240:                         allocation_maillon(s_etat_processus)) == NULL)
 2241:                 {
 2242:                     (*s_etat_processus).erreur_systeme =
 2243:                             d_es_allocation_memoire;
 2244:                     return;
 2245:                 }
 2246: 
 2247:                 l_element_liste = (*l_element_liste).suivant;
 2248:             }
 2249: 
 2250:             (*l_element_liste).suivant = NULL;
 2251: 
 2252:             if (((*l_element_liste).donnee = allocation(s_etat_processus,
 2253:                     INT)) == NULL)
 2254:             {
 2255:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2256:                 return;
 2257:             }
 2258: 
 2259:             (*((integer8 *) (*(*l_element_liste).donnee).objet)) = i + 1;
 2260:         }
 2261:     }
 2262: 
 2263:     (*(*l_element_courant).donnee).objet = l_element_futur;
 2264: 
 2265:     if (((*l_element_courant).suivant = allocation_maillon(s_etat_processus))
 2266:             == NULL)
 2267:     {
 2268:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2269:         return;
 2270:     }
 2271: 
 2272:     l_element_courant = (*l_element_courant).suivant;
 2273: 
 2274:     if (((*l_element_courant).donnee = allocation(s_etat_processus, LST))
 2275:             == NULL)
 2276:     {
 2277:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2278:         return;
 2279:     }
 2280: 
 2281:     l_element_liste = NULL;
 2282:     l_element_futur = NULL;
 2283: 
 2284:     for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
 2285:     {
 2286:         if ((*s_etat_processus).masque_interruptions[i] == 'I')
 2287:         {
 2288:             if (l_element_liste == NULL)
 2289:             {
 2290:                 if ((l_element_liste =
 2291:                         allocation_maillon(s_etat_processus)) == NULL)
 2292:                 {
 2293:                     (*s_etat_processus).erreur_systeme =
 2294:                             d_es_allocation_memoire;
 2295:                     return;
 2296:                 }
 2297: 
 2298:                 l_element_futur = l_element_liste;
 2299:             }
 2300:             else
 2301:             {
 2302:                 if (((*l_element_liste).suivant =
 2303:                         allocation_maillon(s_etat_processus)) == NULL)
 2304:                 {
 2305:                     (*s_etat_processus).erreur_systeme =
 2306:                             d_es_allocation_memoire;
 2307:                     return;
 2308:                 }
 2309: 
 2310:                 l_element_liste = (*l_element_liste).suivant;
 2311:             }
 2312: 
 2313:             (*l_element_liste).suivant = NULL;
 2314: 
 2315:             if (((*l_element_liste).donnee = allocation(s_etat_processus,
 2316:                     INT)) == NULL)
 2317:             {
 2318:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2319:                 return;
 2320:             }
 2321: 
 2322:             (*((integer8 *) (*(*l_element_liste).donnee).objet)) = i + 1;
 2323:         }
 2324:     }
 2325: 
 2326:     (*(*l_element_courant).donnee).objet = l_element_futur;
 2327: 
 2328:     (*l_element_courant).suivant = NULL;
 2329: 
 2330:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2331:             s_objet_resultat) == d_erreur)
 2332:     {
 2333:         return;
 2334:     }
 2335: 
 2336:     return;
 2337: }
 2338: 
 2339: 
 2340: /*
 2341: ================================================================================
 2342:   Fonction 'swiunlock'
 2343: ================================================================================
 2344:   Entrées : structure processus
 2345: --------------------------------------------------------------------------------
 2346:   Sorties :
 2347: --------------------------------------------------------------------------------
 2348:   Effets de bord : néant
 2349: ================================================================================
 2350: */
 2351: 
 2352: void
 2353: instruction_swiunlock(struct_processus *s_etat_processus)
 2354: {
 2355:     integer8                    interruption;
 2356: 
 2357:     struct_liste_chainee        *l_element_courant;
 2358: 
 2359:     struct_objet                *s_objet_argument;
 2360: 
 2361:     (*s_etat_processus).erreur_execution = d_ex;
 2362: 
 2363:     if ((*s_etat_processus).affichage_arguments == 'Y')
 2364:     {
 2365:         printf("\n  SWIUNLOCK ");
 2366: 
 2367:         if ((*s_etat_processus).langue == 'F')
 2368:         {
 2369:             printf("(déverrouillage des interruptions logicielles)\n\n");
 2370:         }
 2371:         else
 2372:         {
 2373:             printf("(software interrupt unlock)\n\n");
 2374:         }
 2375: 
 2376:         printf("    1: %s, %s\n", d_INT, d_LST);
 2377: 
 2378:         return;
 2379:     }
 2380:     else if ((*s_etat_processus).test_instruction == 'Y')
 2381:     {
 2382:         (*s_etat_processus).nombre_arguments = -1;
 2383:         return;
 2384:     }
 2385: 
 2386:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 2387:     {
 2388:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 2389:         {
 2390:             return;
 2391:         }
 2392:     }
 2393: 
 2394:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2395:             &s_objet_argument) == d_erreur)
 2396:     {
 2397:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 2398:         return;
 2399:     }
 2400: 
 2401:     if ((*s_objet_argument).type == INT)
 2402:     {
 2403:         interruption = (*((integer8 *) (*s_objet_argument).objet));
 2404: 
 2405:         if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
 2406:         {
 2407:             liberation(s_etat_processus, s_objet_argument);
 2408: 
 2409:             (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
 2410:             return;
 2411:         }
 2412: 
 2413:         (*s_etat_processus).masque_interruptions[interruption - 1] = 'N';
 2414:     }
 2415:     else if ((*s_objet_argument).type == LST)
 2416:     {
 2417:         l_element_courant = (*s_objet_argument).objet;
 2418: 
 2419:         while(l_element_courant)
 2420:         {
 2421:             if ((*(*l_element_courant).donnee).type != INT)
 2422:             {
 2423:                 liberation(s_etat_processus, s_objet_argument);
 2424: 
 2425:                 (*s_etat_processus).erreur_execution =
 2426:                         d_ex_erreur_type_argument;
 2427:                 return;
 2428:             }
 2429: 
 2430:             interruption = (*((integer8 *) (*(*l_element_courant)
 2431:                     .donnee).objet));
 2432: 
 2433:             if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
 2434:             {
 2435:                 liberation(s_etat_processus, s_objet_argument);
 2436: 
 2437:                 (*s_etat_processus).erreur_execution =
 2438:                         d_ex_interruption_invalide;
 2439:                 return;
 2440:             }
 2441: 
 2442:             (*s_etat_processus).masque_interruptions[interruption - 1] = 'N';
 2443:             l_element_courant = (*l_element_courant).suivant;
 2444:         }
 2445:     }
 2446:     else
 2447:     {
 2448:         liberation(s_etat_processus, s_objet_argument);
 2449: 
 2450:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2451:         return;
 2452:     }
 2453: 
 2454:     liberation(s_etat_processus, s_objet_argument);
 2455: 
 2456:     return;
 2457: }
 2458: 
 2459: 
 2460: /*
 2461: ================================================================================
 2462:   Fonction 'swiqueue'
 2463: ================================================================================
 2464:   Entrées : structure processus
 2465: --------------------------------------------------------------------------------
 2466:   Sorties :
 2467: --------------------------------------------------------------------------------
 2468:   Effets de bord : néant
 2469: ================================================================================
 2470: */
 2471: 
 2472: void
 2473: instruction_swiqueue(struct_processus *s_etat_processus)
 2474: {
 2475:     integer8                    interruption;
 2476: 
 2477:     struct_liste_chainee        *l_element_courant;
 2478: 
 2479:     struct_objet                *s_objet_argument;
 2480: 
 2481:     (*s_etat_processus).erreur_execution = d_ex;
 2482: 
 2483:     if ((*s_etat_processus).affichage_arguments == 'Y')
 2484:     {
 2485:         printf("\n  SWIQUEUE ");
 2486: 
 2487:         if ((*s_etat_processus).langue == 'F')
 2488:         {
 2489:             printf("(enregistre des interruptions logicielles)\n\n");
 2490:         }
 2491:         else
 2492:         {
 2493:             printf("(software interrupt record)\n\n");
 2494:         }
 2495: 
 2496:         printf("    1: %s, %s\n", d_INT, d_LST);
 2497: 
 2498:         return;
 2499:     }
 2500:     else if ((*s_etat_processus).test_instruction == 'Y')
 2501:     {
 2502:         (*s_etat_processus).nombre_arguments = -1;
 2503:         return;
 2504:     }
 2505: 
 2506:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 2507:     {
 2508:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 2509:         {
 2510:             return;
 2511:         }
 2512:     }
 2513: 
 2514:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2515:             &s_objet_argument) == d_erreur)
 2516:     {
 2517:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 2518:         return;
 2519:     }
 2520: 
 2521:     if ((*s_objet_argument).type == INT)
 2522:     {
 2523:         interruption = (*((integer8 *) (*s_objet_argument).objet));
 2524: 
 2525:         if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
 2526:         {
 2527:             liberation(s_etat_processus, s_objet_argument);
 2528: 
 2529:             (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
 2530:             return;
 2531:         }
 2532: 
 2533:         (*s_etat_processus).masque_interruptions[interruption - 1] = 'Q';
 2534:     }
 2535:     else if ((*s_objet_argument).type == LST)
 2536:     {
 2537:         l_element_courant = (*s_objet_argument).objet;
 2538: 
 2539:         while(l_element_courant)
 2540:         {
 2541:             if ((*(*l_element_courant).donnee).type != INT)
 2542:             {
 2543:                 liberation(s_etat_processus, s_objet_argument);
 2544: 
 2545:                 (*s_etat_processus).erreur_execution =
 2546:                         d_ex_erreur_type_argument;
 2547:                 return;
 2548:             }
 2549: 
 2550:             interruption = (*((integer8 *) (*(*l_element_courant)
 2551:                     .donnee).objet));
 2552: 
 2553:             if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
 2554:             {
 2555:                 liberation(s_etat_processus, s_objet_argument);
 2556: 
 2557:                 (*s_etat_processus).erreur_execution =
 2558:                         d_ex_interruption_invalide;
 2559:                 return;
 2560:             }
 2561: 
 2562:             (*s_etat_processus).masque_interruptions[interruption - 1] = 'Q';
 2563:             l_element_courant = (*l_element_courant).suivant;
 2564:         }
 2565:     }
 2566:     else
 2567:     {
 2568:         liberation(s_etat_processus, s_objet_argument);
 2569: 
 2570:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2571:         return;
 2572:     }
 2573: 
 2574:     liberation(s_etat_processus, s_objet_argument);
 2575: 
 2576:     return;
 2577: }
 2578: 
 2579: 
 2580: /*
 2581: ================================================================================
 2582:   Fonction 'sched'
 2583: ================================================================================
 2584:   Entrées : structure processus
 2585: --------------------------------------------------------------------------------
 2586:   Sorties :
 2587: --------------------------------------------------------------------------------
 2588:   Effets de bord : néant
 2589: ================================================================================
 2590: */
 2591: 
 2592: void
 2593: instruction_sched(struct_processus *s_etat_processus)
 2594: {
 2595:     real8                       pourcentage;
 2596: 
 2597:     struct_objet                *s_objet_argument;
 2598: 
 2599:     (*s_etat_processus).erreur_execution = d_ex;
 2600: 
 2601:     if ((*s_etat_processus).affichage_arguments == 'Y')
 2602:     {
 2603:         printf("\n  SCHED ");
 2604: 
 2605:         if ((*s_etat_processus).langue == 'F')
 2606:         {
 2607:             printf("(limitation des ressources de calcul)\n\n");
 2608:         }
 2609:         else
 2610:         {
 2611:             printf("(CPU ressources limitation)\n\n");
 2612:         }
 2613: 
 2614:         printf("    1: %s, %s\n", d_INT, d_REL);
 2615: 
 2616:         return;
 2617:     }
 2618:     else if ((*s_etat_processus).test_instruction == 'Y')
 2619:     {
 2620:         (*s_etat_processus).nombre_arguments = -1;
 2621:         return;
 2622:     }
 2623: 
 2624:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 2625:     {
 2626:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 2627:         {
 2628:             return;
 2629:         }
 2630:     }
 2631: 
 2632:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2633:             &s_objet_argument) == d_erreur)
 2634:     {
 2635:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 2636:         return;
 2637:     }
 2638: 
 2639:     if ((*s_objet_argument).type == INT)
 2640:     {
 2641:         pourcentage = (real8) (*((integer8 *) (*s_objet_argument).objet));
 2642:     }
 2643:     else if ((*s_objet_argument).type == REL)
 2644:     {
 2645:         pourcentage = (*((real8 *) (*s_objet_argument).objet));
 2646:     }
 2647:     else
 2648:     {
 2649:         liberation(s_etat_processus, s_objet_argument);
 2650: 
 2651:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2652:         return;
 2653:     }
 2654: 
 2655:     liberation(s_etat_processus, s_objet_argument);
 2656: 
 2657:     if ((pourcentage <= 0) || (pourcentage > 100))
 2658:     {
 2659:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 2660:         return;
 2661:     }
 2662: 
 2663:     (*s_etat_processus).pourcentage_maximal_cpu = pourcentage;
 2664: 
 2665:     return;
 2666: }
 2667: 
 2668: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>