File:  [local] / rpl / src / instructions_s9.c
Revision 1.56: download - view: text, annotated - select for diffs - revision graph
Tue Dec 18 13:19:38 2012 UTC (11 years, 4 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
En route pour la 4.1.12 !

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

CVSweb interface <joel.bertrand@systella.fr>