File:  [local] / rpl / src / instructions_s10.c
Revision 1.19: download - view: text, annotated - select for diffs - revision graph
Fri Aug 6 15:26:49 2010 UTC (13 years, 9 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Ajout du support pour OS/2.

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

CVSweb interface <joel.bertrand@systella.fr>