File:  [local] / rpl / src / instructions_s10.c
Revision 1.31: download - view: text, annotated - select for diffs - revision graph
Mon Apr 11 12:10:10 2011 UTC (13 years ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Branchement de la 4.1

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.0.prerelease.0
    4:   Copyright (C) 1989-2011 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'spawn'
   29: ================================================================================
   30:   Entrées :
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_spawn(struct_processus *s_etat_processus)
   40: {
   41:     logical1                    drapeau;
   42:     logical1                    variable_partagee;
   43: 
   44:     pthread_attr_t              attributs;
   45: 
   46:     pthread_mutexattr_t         attributs_mutex;
   47: 
   48:     pthread_t                   thread_id;
   49:     pthread_t                   thread_surveillance;
   50: 
   51:     sigset_t                    oldset;
   52:     sigset_t                    set;
   53: 
   54:     struct_descripteur_thread   *s_argument_thread;
   55: 
   56:     struct_liste_chainee        *l_element_courant;
   57: 
   58:     struct_objet                *s_copie;
   59:     struct_objet                *s_objet;
   60:     struct_objet                *s_objet_resultat;
   61:     struct_objet                *s_objet_systeme;
   62: 
   63:     struct_processus            *s_nouvel_etat_processus;
   64: 
   65:     struct timespec             attente;
   66: 
   67:     (*s_etat_processus).erreur_execution = d_ex;
   68: 
   69:     if ((*s_etat_processus).affichage_arguments == 'Y')
   70:     {
   71:         printf("\n  SPAWN ");
   72: 
   73:         if ((*s_etat_processus).langue == 'F')
   74:         {
   75:             printf("(lancement d'un thread)\n\n");
   76:         }
   77:         else
   78:         {
   79:             printf("(create thread)\n\n");
   80:         }
   81: 
   82:         printf("    1: %s, %s\n", d_NOM, d_RPN);
   83:         printf("->  1: %s\n", d_PRC);
   84: 
   85:         return;
   86:     }
   87:     else if ((*s_etat_processus).test_instruction == 'Y')
   88:     {
   89:         (*s_etat_processus).nombre_arguments = -1;
   90:         return;
   91:     }
   92: 
   93:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   94:     {
   95:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
   96:         {
   97:             return;
   98:         }
   99:     }
  100: 
  101:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  102:             &s_objet) == d_erreur)
  103:     {
  104:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  105:         return;
  106:     }
  107: 
  108:     /*
  109:      * Une routine fille doit pouvoir renvoyer des objets au processus
  110:      * père au travers de la fonction SEND. Il ne peut donc s'agir que
  111:      * d'une fonction ou d'une expression RPN.
  112:      */
  113: 
  114:     if (((*s_objet).type != NOM) && ((*s_objet).type != RPN))
  115:     {
  116:         liberation(s_etat_processus, s_objet);
  117: 
  118:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  119:         return;
  120:     }
  121: 
  122:     /*
  123:      * Si l'argument est de type NOM, il faut que la variable correspondante
  124:      * soit une variable de type RPN.
  125:      */
  126: 
  127:     variable_partagee = d_faux;
  128:     s_copie = NULL;
  129: 
  130:     if ((*s_objet).type == NOM)
  131:     {
  132:         if (recherche_variable(s_etat_processus, (*((struct_nom *)
  133:                 (*s_objet).objet)).nom) == d_vrai)
  134:         {
  135:             if ((*s_etat_processus).s_liste_variables
  136:                     [(*s_etat_processus).position_variable_courante].objet
  137:                     == NULL)
  138:             {
  139:                 if (pthread_mutex_lock(&((*(*s_etat_processus)
  140:                         .s_liste_variables_partagees).mutex)) != 0)
  141:                 {
  142:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  143:                     return;
  144:                 }
  145: 
  146:                 if (recherche_variable_partagee(s_etat_processus,
  147:                         (*s_etat_processus).s_liste_variables
  148:                         [(*s_etat_processus).position_variable_courante].nom,
  149:                         (*s_etat_processus).s_liste_variables
  150:                         [(*s_etat_processus).position_variable_courante]
  151:                         .variable_partagee, (*s_etat_processus)
  152:                         .s_liste_variables[(*s_etat_processus)
  153:                         .position_variable_courante].origine) == d_faux)
  154:                 {
  155:                     if (pthread_mutex_unlock(&((*(*s_etat_processus)
  156:                             .s_liste_variables_partagees).mutex)) != 0)
  157:                     {
  158:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  159:                         return;
  160:                     }
  161: 
  162:                     liberation(s_etat_processus, s_objet);
  163: 
  164:                     (*s_etat_processus).erreur_systeme = d_es;
  165:                     (*s_etat_processus).erreur_execution =
  166:                             d_ex_argument_invalide;
  167:                     return;
  168:                 }
  169: 
  170:                 if (((*(*(*s_etat_processus).s_liste_variables_partagees)
  171:                         .table[(*(*s_etat_processus)
  172:                         .s_liste_variables_partagees).position_variable].objet)
  173:                         .type != RPN) && ((*(*(*s_etat_processus)
  174:                         .s_liste_variables_partagees).table
  175:                         [(*(*s_etat_processus).s_liste_variables_partagees)
  176:                         .position_variable].objet).type != ADR))
  177:                 {
  178:                     if (pthread_mutex_unlock(&((*(*s_etat_processus)
  179:                             .s_liste_variables_partagees).mutex)) != 0)
  180:                     {
  181:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  182:                         return;
  183:                     }
  184: 
  185:                     liberation(s_etat_processus, s_objet);
  186: 
  187:                     (*s_etat_processus).erreur_execution =
  188:                             d_ex_argument_invalide;
  189:                     return;
  190:                 }
  191: 
  192:                 if ((s_copie = copie_objet(s_etat_processus,
  193:                         (*(*s_etat_processus)
  194:                         .s_liste_variables_partagees).table
  195:                         [(*(*s_etat_processus).s_liste_variables_partagees)
  196:                         .position_variable].objet, 'P')) == NULL)
  197:                 {
  198:                     if (pthread_mutex_unlock(&((*(*s_etat_processus)
  199:                             .s_liste_variables_partagees).mutex)) != 0)
  200:                     {
  201:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  202:                         return;
  203:                     }
  204: 
  205:                     (*s_etat_processus).erreur_systeme =
  206:                             d_es_allocation_memoire;
  207: 
  208:                     return;
  209:                 }
  210: 
  211:                 variable_partagee = d_vrai;
  212: 
  213:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  214:                         .s_liste_variables_partagees).mutex)) != 0)
  215:                 {
  216:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  217:                     return;
  218:                 }
  219:             }
  220:             else
  221:             {
  222:                 if (((*(*s_etat_processus).s_liste_variables
  223:                         [(*s_etat_processus).position_variable_courante].objet)
  224:                         .type != RPN) && ((*(*s_etat_processus)
  225:                         .s_liste_variables[(*s_etat_processus)
  226:                         .position_variable_courante].objet).type != ADR))
  227:                 {
  228:                     liberation(s_etat_processus, s_objet);
  229: 
  230:                     (*s_etat_processus).erreur_execution =
  231:                             d_ex_argument_invalide;
  232:                     return;
  233:                 }
  234:             }
  235:         }
  236:         else // Variable inexistante
  237:         {
  238:             liberation(s_etat_processus, s_objet);
  239: 
  240:             (*s_etat_processus).erreur_systeme = d_es;
  241:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  242:             return;
  243:         }
  244:     }
  245: 
  246:     if (sigemptyset(&set) != 0)
  247:     {
  248:         (*s_etat_processus).erreur_systeme = d_es_processus;
  249:         return;
  250:     }
  251: 
  252:     if (sigaddset(&set, SIGSTART) != 0)
  253:     {
  254:         (*s_etat_processus).erreur_systeme = d_es_processus;
  255:         return;
  256:     }
  257: 
  258:     /*
  259:      * Le signal SIGFSTOP doit être traité !
  260:      */
  261: 
  262:     if (sigaddset(&set, SIGFSTOP) != 0)
  263:     {
  264:         (*s_etat_processus).erreur_systeme = d_es_processus;
  265:         return;
  266:     }
  267: 
  268:     if (sigaddset(&set, SIGFABORT) != 0)
  269:     {
  270:         (*s_etat_processus).erreur_systeme = d_es_processus;
  271:         return;
  272:     }
  273: 
  274:     if (sigaddset(&set, SIGURG) != 0)
  275:     {
  276:         (*s_etat_processus).erreur_systeme = d_es_processus;
  277:         return;
  278:     }
  279: 
  280:     if (pthread_sigmask(SIG_BLOCK, &set, &oldset) != 0)
  281:     {
  282:         (*s_etat_processus).erreur_systeme = d_es_processus;
  283:         return;
  284:     }
  285: 
  286:     if ((s_argument_thread = malloc(sizeof(struct_descripteur_thread))) == NULL)
  287:     {
  288:         (*s_etat_processus).erreur_systeme = d_es_processus;
  289:         return;
  290:     }
  291: 
  292:     if (pipe((*s_argument_thread).pipe_erreurs) != 0)
  293:     {
  294:         (*s_etat_processus).erreur_systeme = d_es_processus;
  295:         return;
  296:     }
  297: 
  298:     if (pipe((*s_argument_thread).pipe_interruptions) != 0)
  299:     {
  300:         (*s_etat_processus).erreur_systeme = d_es_processus;
  301:         return;
  302:     }
  303: 
  304:     if (pipe((*s_argument_thread).pipe_nombre_interruptions_attente) != 0)
  305:     {
  306:         (*s_etat_processus).erreur_systeme = d_es_processus;
  307:         return;
  308:     }
  309: 
  310:     if (pipe((*s_argument_thread).pipe_objets) != 0)
  311:     {
  312:         (*s_etat_processus).erreur_systeme = d_es_processus;
  313:         return;
  314:     }
  315: 
  316:     if (pipe((*s_argument_thread).pipe_acquittement) != 0)
  317:     {
  318:         (*s_etat_processus).erreur_systeme = d_es_processus;
  319:         return;
  320:     }
  321: 
  322:     if (pipe((*s_argument_thread).pipe_nombre_objets_attente) != 0)
  323:     {
  324:         (*s_etat_processus).erreur_systeme = d_es_processus;
  325:         return;
  326:     }
  327: 
  328:     if (pipe((*s_argument_thread).pipe_injections) != 0)
  329:     {
  330:         (*s_etat_processus).erreur_systeme = d_es_processus;
  331:         return;
  332:     }
  333: 
  334:     if (pipe((*s_argument_thread).pipe_nombre_injections) != 0)
  335:     {
  336:         (*s_etat_processus).erreur_systeme = d_es_processus;
  337:         return;
  338:     }
  339: 
  340:     if ((s_nouvel_etat_processus = copie_etat_processus(s_etat_processus))
  341:             == NULL)
  342:     {
  343:         return;
  344:     }
  345: 
  346:     pthread_mutexattr_init(&attributs_mutex);
  347:     pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
  348:     pthread_mutex_init(&((*s_argument_thread).mutex), &attributs_mutex);
  349:     pthread_mutexattr_destroy(&attributs_mutex);
  350: 
  351:     pthread_mutexattr_init(&attributs_mutex);
  352:     pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
  353:     pthread_mutex_init(&((*s_argument_thread).mutex_nombre_references),
  354:             &attributs_mutex);
  355:     pthread_mutexattr_destroy(&attributs_mutex);
  356: 
  357:     (*s_argument_thread).processus_detache = d_faux;
  358:     (*s_argument_thread).thread_actif = d_faux;
  359:     (*s_argument_thread).thread_pere = pthread_self();
  360:     (*s_argument_thread).pid = getpid();
  361: 
  362:     (*s_nouvel_etat_processus).pipe_donnees =
  363:             (*s_argument_thread).pipe_objets[1];
  364:     (*s_nouvel_etat_processus).pipe_nombre_objets_attente =
  365:             (*s_argument_thread).pipe_nombre_objets_attente[1];
  366:     (*s_nouvel_etat_processus).pipe_interruptions =
  367:             (*s_argument_thread).pipe_interruptions[1];
  368:     (*s_nouvel_etat_processus).pipe_nombre_interruptions_attente =
  369:             (*s_argument_thread).pipe_nombre_interruptions_attente[1];
  370:     (*s_nouvel_etat_processus).pipe_injections =
  371:             (*s_argument_thread).pipe_injections[0];
  372:     (*s_nouvel_etat_processus).pipe_nombre_injections =
  373:             (*s_argument_thread).pipe_nombre_injections[0];
  374:     (*s_nouvel_etat_processus).pipe_acquittement =
  375:             (*s_argument_thread).pipe_acquittement[0];
  376:     (*s_nouvel_etat_processus).presence_pipes = d_vrai;
  377: 
  378:     (*s_nouvel_etat_processus).niveau_initial =
  379:             (*s_etat_processus).niveau_courant;
  380:     (*s_nouvel_etat_processus).debug_programme = d_faux;
  381:     (*s_nouvel_etat_processus).nombre_objets_injectes = 0;
  382:     (*s_nouvel_etat_processus).nombre_objets_envoyes_non_lus = 0;
  383:     (*s_nouvel_etat_processus).temps_maximal_cpu = 0;
  384:     (*s_nouvel_etat_processus).presence_fusible = d_faux;
  385:     (*s_nouvel_etat_processus).thread_fusible = 0;
  386: 
  387:     (*s_nouvel_etat_processus).pile_profilage = NULL;
  388:     (*s_nouvel_etat_processus).pile_profilage_fonctions = NULL;
  389: 
  390:     /*
  391:      * Lancement du thread fils et du thread de surveillance
  392:      */
  393: 
  394:     if (pthread_attr_init(&attributs) != 0)
  395:     {
  396:         (*s_etat_processus).erreur_systeme = d_es_processus;
  397:         return;
  398:     }
  399: 
  400:     if (pthread_attr_setdetachstate(&attributs, PTHREAD_CREATE_JOINABLE) != 0)
  401:     {
  402:         (*s_etat_processus).erreur_systeme = d_es_processus;
  403:         return;
  404:     }
  405: 
  406: #   ifndef OS2
  407: #   ifndef Cygwin
  408:     if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)
  409:     {
  410:         (*s_etat_processus).erreur_systeme = d_es_processus;
  411:         return;
  412:     }
  413: 
  414:     if (pthread_attr_setinheritsched(&attributs, PTHREAD_EXPLICIT_SCHED) != 0)
  415:     {
  416:         (*s_etat_processus).erreur_systeme = d_es_processus;
  417:         return;
  418:     }
  419: 
  420:     if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)
  421:     {
  422:         (*s_etat_processus).erreur_systeme = d_es_processus;
  423:         return;
  424:     }
  425: #   endif
  426: #   endif
  427: 
  428:     /*
  429:      * Création de l'objet à retourner
  430:      */
  431: 
  432:     if ((s_objet_resultat = allocation(s_etat_processus, PRC)) == NULL)
  433:     {
  434:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  435:         return;
  436:     }
  437: 
  438:     (*((struct_processus_fils *) (*s_objet_resultat).objet)).thread
  439:             = s_argument_thread;
  440: 
  441:     (*(*((struct_processus_fils *) (*s_objet_resultat).objet)).thread)
  442:             .nombre_objets_dans_pipe = 0;
  443:     (*(*((struct_processus_fils *) (*s_objet_resultat).objet)).thread)
  444:             .nombre_interruptions_dans_pipe = 0;
  445:     (*(*((struct_processus_fils *) (*s_objet_resultat).objet)).thread)
  446:             .nombre_references = 1;
  447: 
  448:     // Lancement du thread fils
  449: 
  450:     if (pthread_mutex_lock(&((*s_nouvel_etat_processus).mutex)) != 0)
  451:     {
  452:         (*s_etat_processus).erreur_systeme = d_es_processus;
  453:         return;
  454:     }
  455: 
  456:     (*s_argument_thread).s_nouvel_etat_processus = s_nouvel_etat_processus;
  457:     (*s_argument_thread).s_etat_processus = s_etat_processus;
  458: 
  459:     if (variable_partagee == d_vrai)
  460:     {
  461:         (*s_argument_thread).argument = s_copie;
  462:         (*s_argument_thread).destruction_objet = d_vrai;
  463:     }
  464:     else
  465:     {
  466:         (*s_argument_thread).argument = s_objet;
  467:         (*s_argument_thread).destruction_objet = d_faux;
  468:     }
  469: 
  470:     (*s_argument_thread).set = set;
  471:     (*s_argument_thread).oldset = oldset;
  472:     (*s_argument_thread).thread_actif = d_faux;
  473: 
  474:     if (pthread_create(&thread_id, &attributs, lancement_thread,
  475:             s_argument_thread) != 0)
  476:     {
  477:         (*s_etat_processus).erreur_systeme = d_es_processus;
  478:         return;
  479:     }
  480: 
  481:     attente.tv_sec = 0;
  482:     attente.tv_nsec = GRANULARITE_us * 1000;
  483: 
  484:     while((*s_argument_thread).thread_actif == d_faux)
  485:     {
  486:         nanosleep(&attente, NULL);
  487:         INCR_GRANULARITE(attente.tv_nsec);
  488:     }
  489: 
  490:     if (pthread_attr_destroy(&attributs) != 0)
  491:     {
  492:         (*s_etat_processus).erreur_systeme = d_es_processus;
  493:         return;
  494:     }
  495: 
  496:     if (pthread_attr_init(&attributs) != 0)
  497:     {
  498:         (*s_etat_processus).erreur_systeme = d_es_processus;
  499:         return;
  500:     }
  501: 
  502:     if (pthread_attr_setdetachstate(&attributs,
  503:             PTHREAD_CREATE_DETACHED) != 0)
  504:     {
  505:         (*s_etat_processus).erreur_systeme = d_es_processus;
  506:         return;
  507:     }
  508: 
  509: #   ifndef OS2
  510: #   ifndef Cygwin
  511:     if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)
  512:     {
  513:         (*s_etat_processus).erreur_systeme = d_es_processus;
  514:         return;
  515:     }
  516: 
  517:     if (pthread_attr_setinheritsched(&attributs,
  518:             PTHREAD_EXPLICIT_SCHED) != 0)
  519:     {
  520:         (*s_etat_processus).erreur_systeme = d_es_processus;
  521:         return;
  522:     }
  523: 
  524:     if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)
  525:     {
  526:         (*s_etat_processus).erreur_systeme = d_es_processus;
  527:         return;
  528:     }
  529: #   endif
  530: #   endif
  531: 
  532:     // Attente de l'affectation de la grandeur processus.tid par le thread fils.
  533: 
  534:     if (pthread_mutex_lock(&((*s_nouvel_etat_processus).mutex)) != 0)
  535:     {
  536:         (*s_etat_processus).erreur_systeme = d_es_processus;
  537:         return;
  538:     }
  539: 
  540:     /*
  541:      * On copie l'objet plutôt que le pointeur car cet objet peut être
  542:      * accédé depuis deux threads distincts et aboutir à un blocage lors d'une
  543:      * copie.
  544:      */
  545: 
  546:     if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet_resultat, 'O'))
  547:             == NULL)
  548:     {
  549:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  550:         return;
  551:     }
  552: 
  553:     if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
  554:     {
  555:         (*s_etat_processus).erreur_systeme = d_es_processus;
  556:         return;
  557:     }
  558: 
  559:     // Si le tid existe déjà  dans la pile des processus, il s'agit forcement
  560:     // d'un processus moribond. On attend donc qu'il soit effectivement
  561:     // libéré.
  562: 
  563:     do
  564:     {
  565:         l_element_courant = (struct_liste_chainee *)
  566:                 (*s_etat_processus).l_base_pile_processus;
  567:         drapeau = d_faux;
  568: 
  569:         attente.tv_sec = 0;
  570:         attente.tv_nsec = GRANULARITE_us * 1000;
  571: 
  572:         while(l_element_courant != NULL)
  573:         {
  574:             if (((*(*((struct_processus_fils *)
  575:                     (*(*l_element_courant).donnee).objet)).thread)
  576:                     .processus_detache == d_faux) &&
  577:                     ((*s_argument_thread).processus_detache == d_faux))
  578:             {
  579:                 if (pthread_equal((*(*((struct_processus_fils *)
  580:                         (*(*l_element_courant).donnee).objet)).thread)
  581:                         .tid, (*s_argument_thread).tid) != 0)
  582:                 {
  583:                     if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
  584:                     {
  585:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  586:                         return;
  587:                     }
  588: 
  589:                     scrutation_injection(s_etat_processus);
  590: 
  591:                     if ((*s_etat_processus).nombre_interruptions_non_affectees
  592:                             != 0)
  593:                     {
  594:                         affectation_interruptions_logicielles(s_etat_processus);
  595:                     }
  596: 
  597:                     if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
  598:                     {
  599:                         traitement_interruptions_logicielles(s_etat_processus);
  600:                     }
  601: 
  602:                     nanosleep(&attente, NULL);
  603:                     INCR_GRANULARITE(attente.tv_nsec);
  604: 
  605:                     if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
  606:                     {
  607:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  608:                         return;
  609:                     }
  610: 
  611:                     drapeau = d_vrai;
  612:                     break;
  613:                 }
  614:             }
  615: 
  616:             l_element_courant = (*l_element_courant).suivant;
  617:         }
  618:     } while(drapeau == d_vrai);
  619: 
  620:     if (empilement(s_etat_processus,
  621:             (struct_liste_chainee **) &((*s_etat_processus)
  622:             .l_base_pile_processus), s_objet_systeme) == d_erreur)
  623:     {
  624:         pthread_mutex_unlock(&((*s_etat_processus).mutex));
  625:         pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
  626:         return;
  627:     }
  628: 
  629:     if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
  630:     {
  631:         (*s_etat_processus).erreur_systeme = d_es_processus;
  632:         return;
  633:     }
  634: 
  635:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  636:             s_objet_resultat) == d_erreur)
  637:     {
  638:         pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
  639:         return;
  640:     }
  641: 
  642:     if (pthread_mutex_lock(&(*s_argument_thread).mutex) != 0)
  643:     {
  644:         pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
  645:         (*s_etat_processus).erreur_systeme = d_es_processus;
  646:         return;
  647:     }
  648: 
  649:     if ((*s_argument_thread).thread_actif == d_faux)
  650:     {
  651:         // Le thread n'existe plus.
  652: 
  653:         pthread_join((*s_argument_thread).tid, NULL);
  654:         pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
  655:         pthread_mutex_unlock(&(*s_argument_thread).mutex);
  656:         (*s_etat_processus).erreur_systeme = d_es_processus;
  657:         return;
  658:     }
  659: 
  660:     if (pthread_mutex_unlock(&(*s_argument_thread).mutex) != 0)
  661:     {
  662:         pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
  663:         (*s_etat_processus).erreur_systeme = d_es_processus;
  664:         return;
  665:     }
  666: 
  667:     if (pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex)) != 0)
  668:     {
  669:         (*s_etat_processus).erreur_systeme = d_es_processus;
  670:         return;
  671:     }
  672: 
  673:     // Lancement du thread de surveillance
  674: 
  675:     if (pthread_create(&thread_surveillance, &attributs,
  676:             surveillance_processus, s_argument_thread) != 0)
  677:     {
  678:         (*s_etat_processus).erreur_systeme = d_es_processus;
  679:         return;
  680:     }
  681: 
  682:     if (pthread_attr_destroy(&attributs) != 0)
  683:     {
  684:         (*s_etat_processus).erreur_systeme = d_es_processus;
  685:         return;
  686:     }
  687: 
  688:     // Le fils peut être présent sans être en attente du signal de départ.
  689: 
  690:     if (pthread_kill((*s_argument_thread).tid, SIGSTART) != 0)
  691:     {
  692:         (*s_etat_processus).erreur_systeme = d_es_processus;
  693:         return;
  694:     }
  695: 
  696:     if (pthread_sigmask(SIG_SETMASK, &oldset, NULL) != 0)
  697:     {
  698:         (*s_etat_processus).erreur_systeme = d_es_processus;
  699:         return;
  700:     }
  701: 
  702:     sigpending(&set);
  703: 
  704:     return;
  705: }
  706: 
  707: 
  708: /*
  709: ================================================================================
  710:   Fonction 'sqlconnect'
  711: ================================================================================
  712:   Entrées :
  713: --------------------------------------------------------------------------------
  714:   Sorties :
  715: --------------------------------------------------------------------------------
  716:   Effets de bord : néant
  717: ================================================================================
  718: */
  719: 
  720: void
  721: instruction_sqlconnect(struct_processus *s_etat_processus)
  722: {
  723:     struct_objet            *s_objet_argument;
  724:     struct_objet            *s_objet_resultat;
  725:     struct_objet            *s_objet_systeme;
  726: 
  727:     (*s_etat_processus).erreur_execution = d_ex;
  728: 
  729:     if ((*s_etat_processus).affichage_arguments == 'Y')
  730:     {
  731:         printf("\n  SQLCONNECT ");
  732: 
  733:         if ((*s_etat_processus).langue == 'F')
  734:         {
  735:             printf("(connexion à une base de données SQL)\n\n");
  736:         }
  737:         else
  738:         {
  739:             printf("(connect to SQL database)\n\n");
  740:         }
  741: 
  742:         printf("    1: %s\n", d_LST);
  743:         printf("->  1: %s\n\n", d_SQL);
  744: 
  745:         if ((*s_etat_processus).langue == 'F')
  746:         {
  747:             printf("  Utilisation :\n\n");
  748:         }
  749:         else
  750:         {
  751:             printf("  Usage:\n\n");
  752:         }
  753: 
  754:         printf("    { \"mysql\" \"server\" \"database\" "
  755:                 "\"user\" \"password\" } SQLCONNECT\n");
  756:         printf("    { \"postgresql:iso-8859-1\" \"server\" "
  757:                 "\"database\" \"user\" \"password\" port }\n");
  758:         printf("          SQLCONNECT\n");
  759: 
  760:         return;
  761:     }
  762:     else if ((*s_etat_processus).test_instruction == 'Y')
  763:     {
  764:         (*s_etat_processus).nombre_arguments = -1;
  765:         return;
  766:     }
  767:     
  768:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  769:     {
  770:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  771:         {
  772:             return;
  773:         }
  774:     }
  775: 
  776:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  777:             &s_objet_argument) == d_erreur)
  778:     {
  779:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  780:         return;
  781:     }
  782: 
  783:     if ((*s_objet_argument).type == LST)
  784:     {
  785:         if ((s_objet_resultat = parametres_sql(s_etat_processus,
  786:                 s_objet_argument)) == NULL)
  787:         {
  788:             liberation(s_etat_processus, s_objet_argument);
  789:             return;
  790:         }
  791: 
  792:         if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet_resultat,
  793:                 'O')) == NULL)
  794:         {
  795:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  796:             return;
  797:         }
  798: 
  799:         if (empilement(s_etat_processus,
  800:                 (struct_liste_chainee **) &((*s_etat_processus)
  801:                 .s_connecteurs_sql), s_objet_systeme) == d_erreur)
  802:         {
  803:             return;
  804:         }
  805: 
  806:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  807:                 s_objet_resultat) == d_erreur)
  808:         {
  809:             return;
  810:         }
  811:     }
  812:     else
  813:     {
  814:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  815: 
  816:         liberation(s_etat_processus, s_objet_argument);
  817:         return;
  818:     }
  819: 
  820:     liberation(s_etat_processus, s_objet_argument);
  821:     return;
  822: }
  823: 
  824: 
  825: /*
  826: ================================================================================
  827:   Fonction 'sqldisconnect'
  828: ================================================================================
  829:   Entrées :
  830: --------------------------------------------------------------------------------
  831:   Sorties :
  832: --------------------------------------------------------------------------------
  833:   Effets de bord : néant
  834: ================================================================================
  835: */
  836: 
  837: void
  838: instruction_sqldisconnect(struct_processus *s_etat_processus)
  839: {
  840:     logical1                drapeau;
  841: 
  842:     struct_liste_chainee    *l_element_courant;
  843:     struct_liste_chainee    *l_element_precedent;
  844: 
  845:     struct_objet            *s_objet;
  846: 
  847:     (*s_etat_processus).erreur_execution = d_ex;
  848: 
  849:     if ((*s_etat_processus).affichage_arguments == 'Y')
  850:     {
  851:         printf("\n  SQLDISCONNECT ");
  852: 
  853:         if ((*s_etat_processus).langue == 'F')
  854:         {
  855:             printf("(déconnexion d'une base de donnée SQL)\n\n");
  856:         }
  857:         else
  858:         {
  859:             printf("(disconnection from SQL database)\n\n");
  860:         }
  861: 
  862:         printf("    1: %s\n", d_SQL);
  863:         return;
  864:     }
  865:     else if ((*s_etat_processus).test_instruction == 'Y')
  866:     {
  867:         (*s_etat_processus).nombre_arguments = -1;
  868:         return;
  869:     }
  870:     
  871:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  872:     {
  873:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  874:         {
  875:             return;
  876:         }
  877:     }
  878: 
  879:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  880:             &s_objet) == d_erreur)
  881:     {
  882:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  883:         return;
  884:     }
  885: 
  886:     if ((*s_objet).type == SQL)
  887:     {
  888:         if (((*((struct_connecteur_sql *) (*s_objet).objet)).pid !=
  889:                 getpid()) || (pthread_equal((*((struct_connecteur_sql *)
  890:                 (*s_objet).objet)).tid, pthread_self()) == 0))
  891:         {
  892:             (*s_etat_processus).erreur_execution = d_ex_fichier_hors_contexte;
  893: 
  894:             liberation(s_etat_processus, s_objet);
  895:             return;
  896:         }
  897: 
  898:         l_element_courant = (*s_etat_processus).s_connecteurs_sql;
  899:         l_element_precedent = NULL;
  900: 
  901:         while(l_element_courant != NULL)
  902:         {
  903:             if (((*((struct_connecteur_sql *) (*(*l_element_courant).donnee)
  904:                     .objet)).pid == getpid()) && (pthread_equal(
  905:                     (*((struct_connecteur_sql *) (*(*l_element_courant).donnee)
  906:                     .objet)).tid, pthread_self()) != 0) &&
  907:                     (strcmp((*((struct_connecteur_sql *) (*(*l_element_courant)
  908:                     .donnee).objet)).type, (*((struct_connecteur_sql *)
  909:                     (*s_objet).objet)).type) == 0))
  910:             {
  911:                 if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet)).type,
  912:                         "MYSQL") == 0)
  913:                 {
  914: #                   ifdef MYSQL_SUPPORT
  915: 
  916:                     if ((*((struct_connecteur_sql *) (*(*l_element_courant)
  917:                             .donnee).objet)).descripteur.mysql ==
  918:                             (*((struct_connecteur_sql *) (*s_objet).objet))
  919:                             .descripteur.mysql)
  920:                     {
  921:                         drapeau = d_vrai;
  922:                     }
  923:                     else
  924:                     {
  925:                         drapeau = d_faux;
  926:                     }
  927: 
  928: #                   else
  929: 
  930:                     if ((*s_etat_processus).langue == 'F')
  931:                     {
  932:                         printf("+++Attention : Support de MySQL "
  933:                                 "non compilé !\n");
  934:                     }
  935:                     else
  936:                     {
  937:                         printf("+++Warning : MySQL support not available !\n");
  938:                     }
  939: 
  940:                     fflush(stdout);
  941: 
  942:                     drapeau = d_faux;
  943: #                   endif
  944:                 }
  945:                 else if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet))
  946:                         .type, "POSTGRESQL") == 0)
  947:                 {
  948: #                   ifdef POSTGRESQL_SUPPORT
  949: 
  950:                     if ((*((struct_connecteur_sql *) (*(*l_element_courant)
  951:                             .donnee).objet)).descripteur.postgresql ==
  952:                             (*((struct_connecteur_sql *) (*s_objet).objet))
  953:                             .descripteur.postgresql)
  954:                     {
  955:                         drapeau = d_vrai;
  956:                     }
  957:                     else
  958:                     {
  959:                         drapeau = d_faux;
  960:                     }
  961: 
  962: #                   else
  963: 
  964:                     if ((*s_etat_processus).langue == 'F')
  965:                     {
  966:                         printf("+++Attention : Support de PostgreSQL "
  967:                                 "non compilé !\n");
  968:                     }
  969:                     else
  970:                     {
  971:                         printf("+++Warning : PostgreSQL support "
  972:                                 "not available !\n");
  973:                     }
  974: 
  975:                     fflush(stdout);
  976: 
  977:                     drapeau = d_faux;
  978: #                   endif
  979:                 }
  980:                 else
  981:                 {
  982:                     BUG(1, printf("SQL type '%s' not allowed!",
  983:                             (*((struct_connecteur_sql *) (*s_objet).objet))
  984:                             .type));
  985:                     return;
  986:                 }
  987: 
  988:                 if (drapeau == d_vrai)
  989:                 {
  990:                     if (l_element_precedent == NULL)
  991:                     {
  992:                         (*s_etat_processus).s_connecteurs_sql =
  993:                                 (*l_element_courant).suivant;
  994:                     }
  995:                     else if ((*l_element_courant).suivant == NULL)
  996:                     {
  997:                         (*l_element_precedent).suivant = NULL;
  998:                     }
  999:                     else
 1000:                     {
 1001:                         (*l_element_precedent).suivant =
 1002:                                 (*l_element_courant).suivant;
 1003:                     }
 1004: 
 1005:                     liberation(s_etat_processus, (*l_element_courant).donnee);
 1006:                     free(l_element_courant);
 1007: 
 1008:                     break;
 1009:                 }
 1010:             }
 1011: 
 1012:             l_element_precedent = l_element_courant;
 1013:             l_element_courant = (*l_element_courant).suivant;
 1014:         }
 1015: 
 1016:         sqlclose(s_objet);
 1017:     }
 1018:     else
 1019:     {
 1020:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1021: 
 1022:         liberation(s_etat_processus, s_objet);
 1023:         return;
 1024:     }
 1025: 
 1026:     liberation(s_etat_processus, s_objet);
 1027:     return;
 1028: }
 1029: 
 1030: 
 1031: /*
 1032: ================================================================================
 1033:   Fonction 'smphrincr'
 1034: ================================================================================
 1035:   Entrées :
 1036: --------------------------------------------------------------------------------
 1037:   Sorties :
 1038: --------------------------------------------------------------------------------
 1039:   Effets de bord : néant
 1040: ================================================================================
 1041: */
 1042: 
 1043: void
 1044: instruction_smphrincr(struct_processus *s_etat_processus)
 1045: {
 1046:     struct_objet                *s_objet_argument;
 1047: 
 1048:     (*s_etat_processus).erreur_execution = d_ex;
 1049: 
 1050:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1051:     {
 1052:         printf("\n  SMPHRINCR ");
 1053: 
 1054:         if ((*s_etat_processus).langue == 'F')
 1055:         {
 1056:             printf("(incrémentation du sémaphore)\n\n");
 1057:         }
 1058:         else
 1059:         {
 1060:             printf("(semaphore incrementation)\n\n");
 1061:         }
 1062: 
 1063:         printf("    1: %s\n", d_SPH);
 1064:         return;
 1065:     }
 1066:     else if ((*s_etat_processus).test_instruction == 'Y')
 1067:     {
 1068:         (*s_etat_processus).nombre_arguments = -1;
 1069:         return;
 1070:     }
 1071:     
 1072:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1073:     {
 1074:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1075:         {
 1076:             return;
 1077:         }
 1078:     }
 1079: 
 1080:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1081:             &s_objet_argument) == d_erreur)
 1082:     {
 1083:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1084:         return;
 1085:     }
 1086: 
 1087:     if ((*s_objet_argument).type == SPH)
 1088:     {
 1089:         if (sem_post((*((struct_semaphore *) (*s_objet_argument).objet))
 1090:                 .semaphore) != 0)
 1091:         {
 1092:             (*s_etat_processus).erreur_execution = d_ex_semaphore;
 1093: 
 1094:             liberation(s_etat_processus, s_objet_argument);
 1095:             return;
 1096:         }
 1097: 
 1098:         liberation(s_etat_processus, s_objet_argument);
 1099:     }
 1100:     else
 1101:     {
 1102:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1103: 
 1104:         liberation(s_etat_processus, s_objet_argument);
 1105:         return;
 1106:     }
 1107: 
 1108:     return;
 1109: }
 1110: 
 1111: 
 1112: /*
 1113: ================================================================================
 1114:   Fonction 'smphrdecr'
 1115: ================================================================================
 1116:   Entrées :
 1117: --------------------------------------------------------------------------------
 1118:   Sorties :
 1119: --------------------------------------------------------------------------------
 1120:   Effets de bord : néant
 1121: ================================================================================
 1122: */
 1123: 
 1124: void
 1125: instruction_smphrdecr(struct_processus *s_etat_processus)
 1126: {
 1127:     struct_objet                *s_objet_argument;
 1128: 
 1129:     unsigned char               *tampon;
 1130: 
 1131:     (*s_etat_processus).erreur_execution = d_ex;
 1132: 
 1133:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1134:     {
 1135:         printf("\n  SMPHRDECR ");
 1136: 
 1137:         if ((*s_etat_processus).langue == 'F')
 1138:         {
 1139:             printf("(decrémentation du sémaphore)\n\n");
 1140:         }
 1141:         else
 1142:         {
 1143:             printf("(semaphore decrementation)\n\n");
 1144:         }
 1145: 
 1146:         printf("    1: %s\n", d_SPH);
 1147:         return;
 1148:     }
 1149:     else if ((*s_etat_processus).test_instruction == 'Y')
 1150:     {
 1151:         (*s_etat_processus).nombre_arguments = -1;
 1152:         return;
 1153:     }
 1154:     
 1155:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1156:     {
 1157:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1158:         {
 1159:             return;
 1160:         }
 1161:     }
 1162: 
 1163:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1164:             &s_objet_argument) == d_erreur)
 1165:     {
 1166:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1167:         return;
 1168:     }
 1169: 
 1170:     if ((*s_objet_argument).type == SPH)
 1171:     {
 1172:         if ((*s_etat_processus).profilage == d_vrai)
 1173:         {
 1174:             if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
 1175:                     == NULL)
 1176:             {
 1177:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1178:                 return;
 1179:             }
 1180: 
 1181:             profilage(s_etat_processus, tampon);
 1182:             free(tampon);
 1183: 
 1184:             if ((*s_etat_processus).erreur_systeme != d_es)
 1185:             {
 1186:                 return;
 1187:             }
 1188:         }
 1189: 
 1190: #       ifndef SEMAPHORES_NOMMES
 1191:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1192:         {
 1193:             (*s_etat_processus).erreur_systeme = d_es_processus;
 1194:             return;
 1195:         }
 1196: #       else
 1197:         if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1198:         {
 1199:             (*s_etat_processus).erreur_systeme = d_es_processus;
 1200:             return;
 1201:         }
 1202: #       endif
 1203: 
 1204:         while(sem_wait((*((struct_semaphore *) (*s_objet_argument).objet))
 1205:                 .semaphore) == -1)
 1206:         {
 1207:             if (errno != EINTR)
 1208:             {
 1209:                 (*s_etat_processus).erreur_execution = d_ex_semaphore;
 1210: 
 1211:                 if ((*s_etat_processus).profilage == d_vrai)
 1212:                 {
 1213:                     profilage(s_etat_processus, NULL);
 1214:                 }
 1215: 
 1216:                 liberation(s_etat_processus, s_objet_argument);
 1217:                 return;
 1218:             }
 1219:         }
 1220: 
 1221: #       ifndef SEMAPHORES_NOMMES
 1222:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1223: #       else
 1224:         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1225: #       endif
 1226:         {
 1227:             if (errno != EINTR)
 1228:             {
 1229:                 if ((*s_etat_processus).profilage == d_vrai)
 1230:                 {
 1231:                     profilage(s_etat_processus, NULL);
 1232:                 }
 1233: 
 1234:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1235:                 return;
 1236:             }
 1237:         }
 1238: 
 1239:         if ((*s_etat_processus).profilage == d_vrai)
 1240:         {
 1241:             profilage(s_etat_processus, NULL);
 1242:         }
 1243: 
 1244:         liberation(s_etat_processus, s_objet_argument);
 1245:     }
 1246:     else
 1247:     {
 1248:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1249: 
 1250:         liberation(s_etat_processus, s_objet_argument);
 1251:         return;
 1252:     }
 1253: 
 1254:     return;
 1255: }
 1256: 
 1257: 
 1258: /*
 1259: ================================================================================
 1260:   Fonction 'smphrtrydecr'
 1261: ================================================================================
 1262:   Entrées :
 1263: --------------------------------------------------------------------------------
 1264:   Sorties :
 1265: --------------------------------------------------------------------------------
 1266:   Effets de bord : néant
 1267: ================================================================================
 1268: */
 1269: 
 1270: void
 1271: instruction_smphrtrydecr(struct_processus *s_etat_processus)
 1272: {
 1273:     struct_objet                *s_objet_argument;
 1274:     struct_objet                *s_objet_resultat;
 1275: 
 1276:     unsigned char               *tampon;
 1277: 
 1278:     (*s_etat_processus).erreur_execution = d_ex;
 1279: 
 1280:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1281:     {
 1282:         printf("\n  SMPHRTRYDECR ");
 1283: 
 1284:         if ((*s_etat_processus).langue == 'F')
 1285:         {
 1286:             printf("(essai de decrémentation du sémaphore)\n\n");
 1287:         }
 1288:         else
 1289:         {
 1290:             printf("(try to decremente semaphore)\n\n");
 1291:         }
 1292: 
 1293:         printf("    1: %s\n", d_SPH);
 1294:         printf("->  1: %s\n", d_INT);
 1295:         return;
 1296:     }
 1297:     else if ((*s_etat_processus).test_instruction == 'Y')
 1298:     {
 1299:         (*s_etat_processus).nombre_arguments = -1;
 1300:         return;
 1301:     }
 1302:     
 1303:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1304:     {
 1305:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1306:         {
 1307:             return;
 1308:         }
 1309:     }
 1310: 
 1311:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1312:             &s_objet_argument) == d_erreur)
 1313:     {
 1314:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1315:         return;
 1316:     }
 1317: 
 1318:     if ((*s_objet_argument).type == SPH)
 1319:     {
 1320:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1321:         {
 1322:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1323:             return;
 1324:         }
 1325: 
 1326:         if ((*s_etat_processus).profilage == d_vrai)
 1327:         {
 1328:             if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
 1329:                     == NULL)
 1330:             {
 1331:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1332:                 return;
 1333:             }
 1334: 
 1335:             profilage(s_etat_processus, tampon);
 1336:             free(tampon);
 1337: 
 1338:             if ((*s_etat_processus).erreur_systeme != d_es)
 1339:             {
 1340:                 return;
 1341:             }
 1342:         }
 1343: 
 1344: #       ifndef SEMAPHORES_NOMMES
 1345:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1346:         {
 1347:             (*s_etat_processus).erreur_systeme = d_es_processus;
 1348:             return;
 1349:         }
 1350: #       else
 1351:         if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1352:         {
 1353:             (*s_etat_processus).erreur_systeme = d_es_processus;
 1354:             return;
 1355:         }
 1356: #       endif
 1357: 
 1358:         (*((integer8 *) (*s_objet_resultat).objet)) = 0;
 1359: 
 1360:         while(sem_trywait((*((struct_semaphore *) (*s_objet_argument).objet))
 1361:                 .semaphore) == -1)
 1362:         {
 1363:             switch(errno)
 1364:             {
 1365:                 case EINTR :
 1366:                 {
 1367:                     break;
 1368:                 }
 1369: 
 1370:                 case EINVAL :
 1371:                 {
 1372:                     (*s_etat_processus).erreur_execution = d_ex_semaphore;
 1373: 
 1374:                     if ((*s_etat_processus).profilage == d_vrai)
 1375:                     {
 1376:                         profilage(s_etat_processus, NULL);
 1377:                     }
 1378: 
 1379:                     liberation(s_etat_processus, s_objet_argument);
 1380:                     return;
 1381:                 }
 1382: 
 1383:                 case EAGAIN :
 1384:                 {
 1385:                     (*((integer8 *) (*s_objet_resultat).objet)) = -1;
 1386:                     break;
 1387:                 }
 1388:             }
 1389: 
 1390:             if ((*((integer8 *) (*s_objet_resultat).objet)) != 0)
 1391:             {
 1392:                 break;
 1393:             }
 1394:         }
 1395: 
 1396: #       ifndef SEMAPHORES_NOMMES
 1397:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1398: #       else
 1399:         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
 1400: #       endif
 1401:         {
 1402:             if (errno != EINTR)
 1403:             {
 1404:                 if ((*s_etat_processus).profilage == d_vrai)
 1405:                 {
 1406:                     profilage(s_etat_processus, NULL);
 1407:                 }
 1408: 
 1409:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1410:                 return;
 1411:             }
 1412:         }
 1413: 
 1414:         if ((*s_etat_processus).profilage == d_vrai)
 1415:         {
 1416:             profilage(s_etat_processus, NULL);
 1417:         }
 1418: 
 1419:         liberation(s_etat_processus, s_objet_argument);
 1420:     }
 1421:     else
 1422:     {
 1423:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1424: 
 1425:         liberation(s_etat_processus, s_objet_argument);
 1426:         return;
 1427:     }
 1428: 
 1429:     return;
 1430: }
 1431: 
 1432: 
 1433: /*
 1434: ================================================================================
 1435:   Fonction 'smphrgetv'
 1436: ================================================================================
 1437:   Entrées :
 1438: --------------------------------------------------------------------------------
 1439:   Sorties :
 1440: --------------------------------------------------------------------------------
 1441:   Effets de bord : néant
 1442: ================================================================================
 1443: */
 1444: 
 1445: void
 1446: instruction_smphrgetv(struct_processus *s_etat_processus)
 1447: {
 1448:     int                         valeur;
 1449: 
 1450:     struct_objet                *s_objet_argument;
 1451:     struct_objet                *s_objet_resultat;
 1452: 
 1453:     (*s_etat_processus).erreur_execution = d_ex;
 1454: 
 1455:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1456:     {
 1457:         printf("\n  SMPHRGETV ");
 1458: 
 1459:         if ((*s_etat_processus).langue == 'F')
 1460:         {
 1461:             printf("(valeur du sémaphore)\n\n");
 1462:         }
 1463:         else
 1464:         {
 1465:             printf("(semaphore value)\n\n");
 1466:         }
 1467: 
 1468:         printf("    1: %s\n", d_SPH);
 1469:         return;
 1470:     }
 1471:     else if ((*s_etat_processus).test_instruction == 'Y')
 1472:     {
 1473:         (*s_etat_processus).nombre_arguments = -1;
 1474:         return;
 1475:     }
 1476:     
 1477:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1478:     {
 1479:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1480:         {
 1481:             return;
 1482:         }
 1483:     }
 1484: 
 1485:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1486:             &s_objet_argument) == d_erreur)
 1487:     {
 1488:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1489:         return;
 1490:     }
 1491: 
 1492:     if ((*s_objet_argument).type == SPH)
 1493:     {
 1494:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1495:         {
 1496:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1497: 
 1498:             liberation(s_etat_processus, s_objet_argument);
 1499:             return;
 1500:         }
 1501: 
 1502:         if (sem_getvalue((*((struct_semaphore *) (*s_objet_argument).objet))
 1503:                 .semaphore, &valeur) != 0)
 1504:         {
 1505:             (*s_etat_processus).erreur_execution = d_ex_semaphore;
 1506: 
 1507:             liberation(s_etat_processus, s_objet_argument);
 1508:             return;
 1509:         }
 1510: 
 1511:         (*((integer8 *) (*s_objet_resultat).objet)) = valeur;
 1512: 
 1513:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1514:                 s_objet_resultat) == d_erreur)
 1515:         {
 1516:             return;
 1517:         }
 1518: 
 1519:         liberation(s_etat_processus, s_objet_argument);
 1520:     }
 1521:     else
 1522:     {
 1523:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1524: 
 1525:         liberation(s_etat_processus, s_objet_argument);
 1526:         return;
 1527:     }
 1528: 
 1529:     return;
 1530: }
 1531: 
 1532: 
 1533: /*
 1534: ================================================================================
 1535:   Fonction 'svl'
 1536: ================================================================================
 1537:   Entrées :
 1538: --------------------------------------------------------------------------------
 1539:   Sorties :
 1540: --------------------------------------------------------------------------------
 1541:   Effets de bord : néant
 1542: ================================================================================
 1543: */
 1544: 
 1545: void
 1546: instruction_svl(struct_processus *s_etat_processus)
 1547: {
 1548:     struct_objet                *s_objet_argument;
 1549:     struct_objet                *s_objet_resultat;
 1550: 
 1551:     (*s_etat_processus).erreur_execution = d_ex;
 1552: 
 1553:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1554:     {
 1555:         printf("\n  SVL ");
 1556: 
 1557:         if ((*s_etat_processus).langue == 'F')
 1558:         {
 1559:             printf("(valeurs singulières)\n\n");
 1560:         }
 1561:         else
 1562:         {
 1563:             printf("(singular values)\n\n");
 1564:         }
 1565: 
 1566:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
 1567:         printf("->  1: %s\n", d_VRL);
 1568:         return;
 1569:     }
 1570:     else if ((*s_etat_processus).test_instruction == 'Y')
 1571:     {
 1572:         (*s_etat_processus).nombre_arguments = -1;
 1573:         return;
 1574:     }
 1575:     
 1576:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1577:     {
 1578:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1579:         {
 1580:             return;
 1581:         }
 1582:     }
 1583: 
 1584:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1585:             &s_objet_argument) == d_erreur)
 1586:     {
 1587:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1588:         return;
 1589:     }
 1590: 
 1591:     if (((*s_objet_argument).type == MIN) ||
 1592:             ((*s_objet_argument).type == MRL) ||
 1593:             ((*s_objet_argument).type == MCX))
 1594:     {
 1595:         if ((s_objet_resultat = allocation(s_etat_processus, VRL)) == NULL)
 1596:         {
 1597:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1598:             return;
 1599:         }
 1600: 
 1601:         valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
 1602:                 NULL, (*s_objet_resultat).objet, NULL);
 1603: 
 1604:         if ((*s_etat_processus).erreur_systeme != d_es)
 1605:         {
 1606:             return;
 1607:         }
 1608: 
 1609:         if (((*s_etat_processus).erreur_execution != d_ex) ||
 1610:                 ((*s_etat_processus).exception != d_ep))
 1611:         {
 1612:             liberation(s_etat_processus, s_objet_resultat);
 1613:             liberation(s_etat_processus, s_objet_argument);
 1614:             return;
 1615:         }
 1616: 
 1617:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1618:                 s_objet_resultat) == d_erreur)
 1619:         {
 1620:             return;
 1621:         }
 1622:     }
 1623:     else
 1624:     {
 1625:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1626: 
 1627:         liberation(s_etat_processus, s_objet_argument);
 1628:         return;
 1629:     }
 1630: 
 1631:     liberation(s_etat_processus, s_objet_argument);
 1632: 
 1633:     return;
 1634: }
 1635: 
 1636: 
 1637: /*
 1638: ================================================================================
 1639:   Fonction 'svd'
 1640: ================================================================================
 1641:   Entrées :
 1642: --------------------------------------------------------------------------------
 1643:   Sorties :
 1644: --------------------------------------------------------------------------------
 1645:   Effets de bord : néant
 1646: ================================================================================
 1647: */
 1648: 
 1649: void
 1650: instruction_svd(struct_processus *s_etat_processus)
 1651: {
 1652:     struct_objet                *s_objet_argument;
 1653:     struct_objet                *s_objet_resultat_1;
 1654:     struct_objet                *s_objet_resultat_2;
 1655:     struct_objet                *s_objet_resultat_3;
 1656: 
 1657:     struct_vecteur              s_vecteur;
 1658: 
 1659:     unsigned long               i;
 1660:     unsigned long               j;
 1661: 
 1662:     (*s_etat_processus).erreur_execution = d_ex;
 1663: 
 1664:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1665:     {
 1666:         printf("\n  SVD ");
 1667: 
 1668:         if ((*s_etat_processus).langue == 'F')
 1669:         {
 1670:             printf("(décomposition en valeurs singulières)\n\n");
 1671:         }
 1672:         else
 1673:         {
 1674:             printf("(singular value decomposition)\n\n");
 1675:         }
 1676: 
 1677:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
 1678:         printf("->  3: %s, %s\n", d_MRL, d_MCX);
 1679:         printf("    2: %s, %s\n", d_MRL, d_MCX);
 1680:         printf("    1: %s\n", d_VRL);
 1681:         return;
 1682:     }
 1683:     else if ((*s_etat_processus).test_instruction == 'Y')
 1684:     {
 1685:         (*s_etat_processus).nombre_arguments = -1;
 1686:         return;
 1687:     }
 1688:     
 1689:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1690:     {
 1691:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1692:         {
 1693:             return;
 1694:         }
 1695:     }
 1696: 
 1697:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1698:             &s_objet_argument) == d_erreur)
 1699:     {
 1700:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1701:         return;
 1702:     }
 1703: 
 1704:     if (((*s_objet_argument).type == MIN) ||
 1705:             ((*s_objet_argument).type == MRL))
 1706:     {
 1707:         if ((s_objet_resultat_1 = allocation(s_etat_processus, MRL)) == NULL)
 1708:         {
 1709:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1710:             return;
 1711:         }
 1712: 
 1713:         if ((s_objet_resultat_2 = allocation(s_etat_processus, MRL)) == NULL)
 1714:         {
 1715:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1716:             return;
 1717:         }
 1718: 
 1719:         if ((s_objet_resultat_3 = allocation(s_etat_processus, MRL)) == NULL)
 1720:         {
 1721:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1722:             return;
 1723:         }
 1724: 
 1725:         valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
 1726:                 (*s_objet_resultat_3).objet, &s_vecteur,
 1727:                 (*s_objet_resultat_1).objet);
 1728: 
 1729:         if ((*s_etat_processus).erreur_systeme != d_es)
 1730:         {
 1731:             return;
 1732:         }
 1733: 
 1734:         if (((*s_etat_processus).erreur_execution != d_ex) ||
 1735:                 ((*s_etat_processus).exception != d_ep))
 1736:         {
 1737:             liberation(s_etat_processus, s_objet_resultat_1);
 1738:             liberation(s_etat_processus, s_objet_resultat_2);
 1739:             liberation(s_etat_processus, s_objet_resultat_3);
 1740:             liberation(s_etat_processus, s_objet_argument);
 1741:             return;
 1742:         }
 1743: 
 1744:         (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_colonnes =
 1745:                 (*((struct_matrice *) (*s_objet_argument).objet))
 1746:                 .nombre_colonnes;
 1747:         (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_lignes =
 1748:                 (*((struct_matrice *) (*s_objet_argument).objet))
 1749:                 .nombre_lignes;
 1750: 
 1751:         if (((*((struct_matrice *) (*s_objet_resultat_2).objet)).tableau =
 1752:                 malloc((*((struct_matrice *) (*s_objet_resultat_2).objet))
 1753:                 .nombre_lignes * sizeof(real8 *))) == NULL)
 1754:         {
 1755:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1756:             return;
 1757:         }
 1758: 
 1759:         for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat_2).objet))
 1760:                 .nombre_lignes; i++)
 1761:         {
 1762:             if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
 1763:                     .objet)).tableau)[i] = malloc((*((struct_matrice *)
 1764:                     (*s_objet_resultat_2).objet)).nombre_colonnes *
 1765:                     sizeof(real8 *))) == NULL)
 1766:             {
 1767:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1768:                 return;
 1769:             }
 1770: 
 1771:             for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat_2).objet))
 1772:                     .nombre_colonnes; j++)
 1773:             {
 1774:                 ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
 1775:                         .objet)).tableau)[i][j] = 0;
 1776:             }
 1777:         }
 1778: 
 1779:         for(i = 0; i < s_vecteur.taille; i++)
 1780:         {
 1781:             ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2).objet))
 1782:                     .tableau)[i][i] = ((real8 *) (s_vecteur.tableau))[i];
 1783:         }
 1784: 
 1785:         free(s_vecteur.tableau);
 1786: 
 1787:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1788:                 s_objet_resultat_3) == d_erreur)
 1789:         {
 1790:             return;
 1791:         }
 1792: 
 1793:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1794:                 s_objet_resultat_2) == d_erreur)
 1795:         {
 1796:             return;
 1797:         }
 1798: 
 1799:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1800:                 s_objet_resultat_1) == d_erreur)
 1801:         {
 1802:             return;
 1803:         }
 1804:     }
 1805:     else if ((*s_objet_argument).type == MCX)
 1806:     {
 1807:         if ((s_objet_resultat_1 = allocation(s_etat_processus, MCX)) == NULL)
 1808:         {
 1809:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1810:             return;
 1811:         }
 1812: 
 1813:         if ((s_objet_resultat_2 = allocation(s_etat_processus, MRL)) == NULL)
 1814:         {
 1815:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1816:             return;
 1817:         }
 1818: 
 1819:         if ((s_objet_resultat_3 = allocation(s_etat_processus, MCX)) == NULL)
 1820:         {
 1821:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1822:             return;
 1823:         }
 1824: 
 1825:         valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
 1826:                 (*s_objet_resultat_3).objet, &s_vecteur,
 1827:                 (*s_objet_resultat_1).objet);
 1828: 
 1829:         if ((*s_etat_processus).erreur_systeme != d_es)
 1830:         {
 1831:             return;
 1832:         }
 1833: 
 1834:         if (((*s_etat_processus).erreur_execution != d_ex) ||
 1835:                 ((*s_etat_processus).exception != d_ep))
 1836:         {
 1837:             liberation(s_etat_processus, s_objet_resultat_1);
 1838:             liberation(s_etat_processus, s_objet_resultat_2);
 1839:             liberation(s_etat_processus, s_objet_resultat_3);
 1840:             liberation(s_etat_processus, s_objet_argument);
 1841:             return;
 1842:         }
 1843: 
 1844:         (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_colonnes =
 1845:                 (*((struct_matrice *) (*s_objet_argument).objet))
 1846:                 .nombre_colonnes;
 1847:         (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_lignes =
 1848:                 (*((struct_matrice *) (*s_objet_argument).objet))
 1849:                 .nombre_lignes;
 1850: 
 1851:         if (((*((struct_matrice *) (*s_objet_resultat_2).objet)).tableau =
 1852:                 malloc((*((struct_matrice *) (*s_objet_resultat_2).objet))
 1853:                 .nombre_lignes * sizeof(real8 *))) == NULL)
 1854:         {
 1855:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1856:             return;
 1857:         }
 1858: 
 1859:         for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat_2).objet))
 1860:                 .nombre_lignes; i++)
 1861:         {
 1862:             if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
 1863:                     .objet)).tableau)[i] = malloc((*((struct_matrice *)
 1864:                     (*s_objet_resultat_2).objet)).nombre_colonnes *
 1865:                     sizeof(real8 *))) == NULL)
 1866:             {
 1867:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1868:                 return;
 1869:             }
 1870: 
 1871:             for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat_2).objet))
 1872:                     .nombre_colonnes; j++)
 1873:             {
 1874:                 ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
 1875:                         .objet)).tableau)[i][j] = 0;
 1876:             }
 1877:         }
 1878: 
 1879:         for(i = 0; i < s_vecteur.taille; i++)
 1880:         {
 1881:             ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2).objet))
 1882:                     .tableau)[i][i] = ((real8 *) (s_vecteur.tableau))[i];
 1883:         }
 1884: 
 1885:         free(s_vecteur.tableau);
 1886: 
 1887:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1888:                 s_objet_resultat_3) == d_erreur)
 1889:         {
 1890:             return;
 1891:         }
 1892: 
 1893:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1894:                 s_objet_resultat_2) == d_erreur)
 1895:         {
 1896:             return;
 1897:         }
 1898: 
 1899:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1900:                 s_objet_resultat_1) == d_erreur)
 1901:         {
 1902:             return;
 1903:         }
 1904:     }
 1905:     else
 1906:     {
 1907:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1908: 
 1909:         liberation(s_etat_processus, s_objet_argument);
 1910:         return;
 1911:     }
 1912: 
 1913:     liberation(s_etat_processus, s_objet_argument);
 1914:     return;
 1915: }
 1916: 
 1917: 
 1918: /*
 1919: ================================================================================
 1920:   Fonction 'swapcntxt'
 1921: ================================================================================
 1922:   Entrées :
 1923: --------------------------------------------------------------------------------
 1924:   Sorties :
 1925: --------------------------------------------------------------------------------
 1926:   Effets de bord : néant
 1927: ================================================================================
 1928: */
 1929: 
 1930: void
 1931: instruction_swapcntxt(struct_processus *s_etat_processus)
 1932: {
 1933:     integer8                    i;
 1934:     integer8                    registre_taille;
 1935: 
 1936:     struct_liste_chainee        *l_element_courant;
 1937:     struct_liste_chainee        *l_element_courant_taille;
 1938:     struct_liste_chainee        *registre;
 1939: 
 1940:     struct_objet                *s_objet_argument;
 1941: 
 1942:     (*s_etat_processus).erreur_execution = d_ex;
 1943: 
 1944:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1945:     {
 1946:         printf("\n  SWAPCNTXT ");
 1947: 
 1948:         if ((*s_etat_processus).langue == 'F')
 1949:         {
 1950:             printf("(échange de contextes)\n\n");
 1951:         }
 1952:         else
 1953:         {
 1954:             printf("(swap contexts)\n\n");
 1955:         }
 1956: 
 1957:         printf("    1: %s\n", d_INT);
 1958:         return;
 1959:     }
 1960:     else if ((*s_etat_processus).test_instruction == 'Y')
 1961:     {
 1962:         (*s_etat_processus).nombre_arguments = -1;
 1963:         return;
 1964:     }
 1965:     
 1966:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1967:     {
 1968:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1969:         {
 1970:             return;
 1971:         }
 1972:     }
 1973: 
 1974:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1975:             &s_objet_argument) == d_erreur)
 1976:     {
 1977:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1978:         return;
 1979:     }
 1980: 
 1981:     if ((*s_objet_argument).type == INT)
 1982:     {
 1983:         l_element_courant = (*s_etat_processus).l_base_pile_contextes;
 1984:         l_element_courant_taille = (*s_etat_processus)
 1985:                 .l_base_pile_taille_contextes;
 1986: 
 1987:         i = (*((integer8 *) (*s_objet_argument).objet));
 1988: 
 1989:         while((l_element_courant != NULL) && (l_element_courant_taille != NULL))
 1990:         {
 1991:             i--;
 1992: 
 1993:             if (i == 0)
 1994:             {
 1995:                 break;
 1996:             }
 1997: 
 1998:             l_element_courant = (*l_element_courant).suivant;
 1999:             l_element_courant_taille = (*l_element_courant_taille).suivant;
 2000:         }
 2001: 
 2002:         if ((l_element_courant == NULL) || (l_element_courant_taille == NULL))
 2003:         {
 2004:             liberation(s_etat_processus, s_objet_argument);
 2005: 
 2006:             (*s_etat_processus).erreur_execution = d_ex_contexte;
 2007:             return;
 2008:         }
 2009: 
 2010:         if ((*(*l_element_courant).donnee).type != LST)
 2011:         {
 2012:             (*s_etat_processus).erreur_systeme = d_es_contexte;
 2013:             return;
 2014:         }
 2015: 
 2016:         if ((*(*l_element_courant_taille).donnee).type != INT)
 2017:         {
 2018:             (*s_etat_processus).erreur_systeme = d_es_contexte;
 2019:             return;
 2020:         }
 2021: 
 2022:         registre = (*s_etat_processus).l_base_pile;
 2023:         registre_taille = (*s_etat_processus).hauteur_pile_operationnelle;
 2024: 
 2025:         (*s_etat_processus).l_base_pile = (*(*l_element_courant).donnee).objet;
 2026:         (*s_etat_processus).hauteur_pile_operationnelle =
 2027:                 (*((integer8 *) (*(*l_element_courant_taille).donnee).objet));
 2028: 
 2029:         (*(*l_element_courant).donnee).objet = registre;
 2030:         (*((integer8 *) (*(*l_element_courant_taille).donnee).objet)) =
 2031:                 registre_taille;
 2032:     }
 2033:     else
 2034:     {
 2035:         liberation(s_etat_processus, s_objet_argument);
 2036: 
 2037:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2038:         return;
 2039:     }
 2040: 
 2041:     liberation(s_etat_processus, s_objet_argument);
 2042: }
 2043: 
 2044: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>