File:  [local] / rpl / src / instructions_s9.c
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Wed Feb 10 10:14:25 2010 UTC (14 years, 2 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_11, HEAD
Branchement vers 4.0.11

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

CVSweb interface <joel.bertrand@systella.fr>