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

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

CVSweb interface <joel.bertrand@systella.fr>