File:  [local] / rpl / src / instructions_s9.c
Revision 1.87: download - view: text, annotated - select for diffs - revision graph
Fri Jan 10 11:15:48 2020 UTC (4 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_32, HEAD
Modification du copyright.

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

CVSweb interface <joel.bertrand@systella.fr>