File:  [local] / rpl / src / instructions_s10.c
Revision 1.7: download - view: text, annotated - select for diffs - revision graph
Sat Apr 17 18:57:36 2010 UTC (14 years ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Ajout du support pour MacOS X et Windows/Cygwin

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

CVSweb interface <joel.bertrand@systella.fr>