File:  [local] / rpl / src / instructions_s10.c
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Wed Jan 27 22:22:15 2010 UTC (14 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_10, HEAD


Changement de version pour la 4.0.10.
Correction d'un dysfonctionnement dans le retour des erreurs des fonctions
RPL/C lorsque le programme est compilé (routine evaluation()).

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.10
    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:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1159:         {
 1160:             (*s_etat_processus).erreur_systeme = d_es_processus;
 1161:             return;
 1162:         }
 1163: 
 1164:         while(sem_wait((*((struct_semaphore *) (*s_objet_argument).objet))
 1165:                 .semaphore) == -1)
 1166:         {
 1167:             if (errno != EINTR)
 1168:             {
 1169:                 (*s_etat_processus).erreur_execution = d_ex_semaphore;
 1170: 
 1171:                 if ((*s_etat_processus).profilage == d_vrai)
 1172:                 {
 1173:                     profilage(s_etat_processus, NULL);
 1174:                 }
 1175: 
 1176:                 liberation(s_etat_processus, s_objet_argument);
 1177:                 return;
 1178:             }
 1179:         }
 1180: 
 1181:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1182:         {
 1183:             if (errno != EINTR)
 1184:             {
 1185:                 if ((*s_etat_processus).profilage == d_vrai)
 1186:                 {
 1187:                     profilage(s_etat_processus, NULL);
 1188:                 }
 1189: 
 1190:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1191:                 return;
 1192:             }
 1193:         }
 1194: 
 1195:         if ((*s_etat_processus).profilage == d_vrai)
 1196:         {
 1197:             profilage(s_etat_processus, NULL);
 1198:         }
 1199: 
 1200:         liberation(s_etat_processus, s_objet_argument);
 1201:     }
 1202:     else
 1203:     {
 1204:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1205: 
 1206:         liberation(s_etat_processus, s_objet_argument);
 1207:         return;
 1208:     }
 1209: 
 1210:     return;
 1211: }
 1212: 
 1213: 
 1214: /*
 1215: ================================================================================
 1216:   Fonction 'smphrtrydecr'
 1217: ================================================================================
 1218:   Entrées :
 1219: --------------------------------------------------------------------------------
 1220:   Sorties :
 1221: --------------------------------------------------------------------------------
 1222:   Effets de bord : néant
 1223: ================================================================================
 1224: */
 1225: 
 1226: void
 1227: instruction_smphrtrydecr(struct_processus *s_etat_processus)
 1228: {
 1229:     struct_objet                *s_objet_argument;
 1230:     struct_objet                *s_objet_resultat;
 1231: 
 1232:     unsigned char               *tampon;
 1233: 
 1234:     (*s_etat_processus).erreur_execution = d_ex;
 1235: 
 1236:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1237:     {
 1238:         printf("\n  SMPHRTRYDECR ");
 1239: 
 1240:         if ((*s_etat_processus).langue == 'F')
 1241:         {
 1242:             printf("(essai de decrémentation du sémaphore)\n\n");
 1243:         }
 1244:         else
 1245:         {
 1246:             printf("(try to decremente semaphore)\n\n");
 1247:         }
 1248: 
 1249:         printf("    1: %s\n", d_SPH);
 1250:         printf("->  1: %s\n", d_INT);
 1251:         return;
 1252:     }
 1253:     else if ((*s_etat_processus).test_instruction == 'Y')
 1254:     {
 1255:         (*s_etat_processus).nombre_arguments = -1;
 1256:         return;
 1257:     }
 1258:     
 1259:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1260:     {
 1261:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1262:         {
 1263:             return;
 1264:         }
 1265:     }
 1266: 
 1267:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1268:             &s_objet_argument) == d_erreur)
 1269:     {
 1270:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1271:         return;
 1272:     }
 1273: 
 1274:     if ((*s_objet_argument).type == SPH)
 1275:     {
 1276:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1277:         {
 1278:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1279:             return;
 1280:         }
 1281: 
 1282:         if ((*s_etat_processus).profilage == d_vrai)
 1283:         {
 1284:             if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
 1285:                     == NULL)
 1286:             {
 1287:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1288:                 return;
 1289:             }
 1290: 
 1291:             profilage(s_etat_processus, tampon);
 1292:             free(tampon);
 1293: 
 1294:             if ((*s_etat_processus).erreur_systeme != d_es)
 1295:             {
 1296:                 return;
 1297:             }
 1298:         }
 1299: 
 1300:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1301:         {
 1302:             (*s_etat_processus).erreur_systeme = d_es_processus;
 1303:             return;
 1304:         }
 1305: 
 1306:         (*((integer8 *) (*s_objet_resultat).objet)) = 0;
 1307: 
 1308:         while(sem_trywait((*((struct_semaphore *) (*s_objet_argument).objet))
 1309:                 .semaphore) == -1)
 1310:         {
 1311:             switch(errno)
 1312:             {
 1313:                 case EINTR :
 1314:                 {
 1315:                     break;
 1316:                 }
 1317: 
 1318:                 case EINVAL :
 1319:                 {
 1320:                     (*s_etat_processus).erreur_execution = d_ex_semaphore;
 1321: 
 1322:                     if ((*s_etat_processus).profilage == d_vrai)
 1323:                     {
 1324:                         profilage(s_etat_processus, NULL);
 1325:                     }
 1326: 
 1327:                     liberation(s_etat_processus, s_objet_argument);
 1328:                     return;
 1329:                 }
 1330: 
 1331:                 case EAGAIN :
 1332:                 {
 1333:                     (*((integer8 *) (*s_objet_resultat).objet)) = -1;
 1334:                     break;
 1335:                 }
 1336:             }
 1337: 
 1338:             if ((*((integer8 *) (*s_objet_resultat).objet)) != 0)
 1339:             {
 1340:                 break;
 1341:             }
 1342:         }
 1343: 
 1344:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
 1345:         {
 1346:             if (errno != EINTR)
 1347:             {
 1348:                 if ((*s_etat_processus).profilage == d_vrai)
 1349:                 {
 1350:                     profilage(s_etat_processus, NULL);
 1351:                 }
 1352: 
 1353:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1354:                 return;
 1355:             }
 1356:         }
 1357: 
 1358:         if ((*s_etat_processus).profilage == d_vrai)
 1359:         {
 1360:             profilage(s_etat_processus, NULL);
 1361:         }
 1362: 
 1363:         liberation(s_etat_processus, s_objet_argument);
 1364:     }
 1365:     else
 1366:     {
 1367:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1368: 
 1369:         liberation(s_etat_processus, s_objet_argument);
 1370:         return;
 1371:     }
 1372: 
 1373:     return;
 1374: }
 1375: 
 1376: 
 1377: /*
 1378: ================================================================================
 1379:   Fonction 'smphrgetv'
 1380: ================================================================================
 1381:   Entrées :
 1382: --------------------------------------------------------------------------------
 1383:   Sorties :
 1384: --------------------------------------------------------------------------------
 1385:   Effets de bord : néant
 1386: ================================================================================
 1387: */
 1388: 
 1389: void
 1390: instruction_smphrgetv(struct_processus *s_etat_processus)
 1391: {
 1392:     int                         valeur;
 1393: 
 1394:     struct_objet                *s_objet_argument;
 1395:     struct_objet                *s_objet_resultat;
 1396: 
 1397:     (*s_etat_processus).erreur_execution = d_ex;
 1398: 
 1399:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1400:     {
 1401:         printf("\n  SMPHRGETV ");
 1402: 
 1403:         if ((*s_etat_processus).langue == 'F')
 1404:         {
 1405:             printf("(valeur du sémaphore)\n\n");
 1406:         }
 1407:         else
 1408:         {
 1409:             printf("(semaphore value)\n\n");
 1410:         }
 1411: 
 1412:         printf("    1: %s\n", d_SPH);
 1413:         return;
 1414:     }
 1415:     else if ((*s_etat_processus).test_instruction == 'Y')
 1416:     {
 1417:         (*s_etat_processus).nombre_arguments = -1;
 1418:         return;
 1419:     }
 1420:     
 1421:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1422:     {
 1423:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1424:         {
 1425:             return;
 1426:         }
 1427:     }
 1428: 
 1429:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1430:             &s_objet_argument) == d_erreur)
 1431:     {
 1432:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1433:         return;
 1434:     }
 1435: 
 1436:     if ((*s_objet_argument).type == SPH)
 1437:     {
 1438:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1439:         {
 1440:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1441: 
 1442:             liberation(s_etat_processus, s_objet_argument);
 1443:             return;
 1444:         }
 1445: 
 1446:         if (sem_getvalue((*((struct_semaphore *) (*s_objet_argument).objet))
 1447:                 .semaphore, &valeur) != 0)
 1448:         {
 1449:             (*s_etat_processus).erreur_execution = d_ex_semaphore;
 1450: 
 1451:             liberation(s_etat_processus, s_objet_argument);
 1452:             return;
 1453:         }
 1454: 
 1455:         (*((integer8 *) (*s_objet_resultat).objet)) = valeur;
 1456: 
 1457:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1458:                 s_objet_resultat) == d_erreur)
 1459:         {
 1460:             return;
 1461:         }
 1462: 
 1463:         liberation(s_etat_processus, s_objet_argument);
 1464:     }
 1465:     else
 1466:     {
 1467:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1468: 
 1469:         liberation(s_etat_processus, s_objet_argument);
 1470:         return;
 1471:     }
 1472: 
 1473:     return;
 1474: }
 1475: 
 1476: 
 1477: /*
 1478: ================================================================================
 1479:   Fonction 'svl'
 1480: ================================================================================
 1481:   Entrées :
 1482: --------------------------------------------------------------------------------
 1483:   Sorties :
 1484: --------------------------------------------------------------------------------
 1485:   Effets de bord : néant
 1486: ================================================================================
 1487: */
 1488: 
 1489: void
 1490: instruction_svl(struct_processus *s_etat_processus)
 1491: {
 1492:     struct_objet                *s_objet_argument;
 1493:     struct_objet                *s_objet_resultat;
 1494: 
 1495:     (*s_etat_processus).erreur_execution = d_ex;
 1496: 
 1497:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1498:     {
 1499:         printf("\n  SVL ");
 1500: 
 1501:         if ((*s_etat_processus).langue == 'F')
 1502:         {
 1503:             printf("(valeurs singulières)\n\n");
 1504:         }
 1505:         else
 1506:         {
 1507:             printf("(singular values)\n\n");
 1508:         }
 1509: 
 1510:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
 1511:         printf("->  1: %s\n", d_VRL);
 1512:         return;
 1513:     }
 1514:     else if ((*s_etat_processus).test_instruction == 'Y')
 1515:     {
 1516:         (*s_etat_processus).nombre_arguments = -1;
 1517:         return;
 1518:     }
 1519:     
 1520:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1521:     {
 1522:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1523:         {
 1524:             return;
 1525:         }
 1526:     }
 1527: 
 1528:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1529:             &s_objet_argument) == d_erreur)
 1530:     {
 1531:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1532:         return;
 1533:     }
 1534: 
 1535:     if (((*s_objet_argument).type == MIN) ||
 1536:             ((*s_objet_argument).type == MRL) ||
 1537:             ((*s_objet_argument).type == MCX))
 1538:     {
 1539:         if ((s_objet_resultat = allocation(s_etat_processus, VRL)) == NULL)
 1540:         {
 1541:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1542:             return;
 1543:         }
 1544: 
 1545:         valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
 1546:                 NULL, (*s_objet_resultat).objet, NULL);
 1547: 
 1548:         if ((*s_etat_processus).erreur_systeme != d_es)
 1549:         {
 1550:             return;
 1551:         }
 1552: 
 1553:         if (((*s_etat_processus).erreur_execution != d_ex) ||
 1554:                 ((*s_etat_processus).exception != d_ep))
 1555:         {
 1556:             liberation(s_etat_processus, s_objet_resultat);
 1557:             liberation(s_etat_processus, s_objet_argument);
 1558:             return;
 1559:         }
 1560: 
 1561:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1562:                 s_objet_resultat) == d_erreur)
 1563:         {
 1564:             return;
 1565:         }
 1566:     }
 1567:     else
 1568:     {
 1569:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1570: 
 1571:         liberation(s_etat_processus, s_objet_argument);
 1572:         return;
 1573:     }
 1574: 
 1575:     liberation(s_etat_processus, s_objet_argument);
 1576: 
 1577:     return;
 1578: }
 1579: 
 1580: 
 1581: /*
 1582: ================================================================================
 1583:   Fonction 'svd'
 1584: ================================================================================
 1585:   Entrées :
 1586: --------------------------------------------------------------------------------
 1587:   Sorties :
 1588: --------------------------------------------------------------------------------
 1589:   Effets de bord : néant
 1590: ================================================================================
 1591: */
 1592: 
 1593: void
 1594: instruction_svd(struct_processus *s_etat_processus)
 1595: {
 1596:     struct_objet                *s_objet_argument;
 1597:     struct_objet                *s_objet_resultat_1;
 1598:     struct_objet                *s_objet_resultat_2;
 1599:     struct_objet                *s_objet_resultat_3;
 1600: 
 1601:     struct_vecteur              s_vecteur;
 1602: 
 1603:     unsigned long               i;
 1604:     unsigned long               j;
 1605: 
 1606:     (*s_etat_processus).erreur_execution = d_ex;
 1607: 
 1608:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1609:     {
 1610:         printf("\n  SVD ");
 1611: 
 1612:         if ((*s_etat_processus).langue == 'F')
 1613:         {
 1614:             printf("(décomposition en valeurs singulières)\n\n");
 1615:         }
 1616:         else
 1617:         {
 1618:             printf("(singular value decomposition)\n\n");
 1619:         }
 1620: 
 1621:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
 1622:         printf("->  3: %s, %s\n", d_MRL, d_MCX);
 1623:         printf("    2: %s, %s\n", d_MRL, d_MCX);
 1624:         printf("    1: %s\n", d_VRL);
 1625:         return;
 1626:     }
 1627:     else if ((*s_etat_processus).test_instruction == 'Y')
 1628:     {
 1629:         (*s_etat_processus).nombre_arguments = -1;
 1630:         return;
 1631:     }
 1632:     
 1633:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1634:     {
 1635:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1636:         {
 1637:             return;
 1638:         }
 1639:     }
 1640: 
 1641:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1642:             &s_objet_argument) == d_erreur)
 1643:     {
 1644:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1645:         return;
 1646:     }
 1647: 
 1648:     if (((*s_objet_argument).type == MIN) ||
 1649:             ((*s_objet_argument).type == MRL))
 1650:     {
 1651:         if ((s_objet_resultat_1 = allocation(s_etat_processus, MRL)) == NULL)
 1652:         {
 1653:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1654:             return;
 1655:         }
 1656: 
 1657:         if ((s_objet_resultat_2 = allocation(s_etat_processus, MRL)) == NULL)
 1658:         {
 1659:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1660:             return;
 1661:         }
 1662: 
 1663:         if ((s_objet_resultat_3 = allocation(s_etat_processus, MRL)) == NULL)
 1664:         {
 1665:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1666:             return;
 1667:         }
 1668: 
 1669:         valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
 1670:                 (*s_objet_resultat_3).objet, &s_vecteur,
 1671:                 (*s_objet_resultat_1).objet);
 1672: 
 1673:         if ((*s_etat_processus).erreur_systeme != d_es)
 1674:         {
 1675:             return;
 1676:         }
 1677: 
 1678:         if (((*s_etat_processus).erreur_execution != d_ex) ||
 1679:                 ((*s_etat_processus).exception != d_ep))
 1680:         {
 1681:             liberation(s_etat_processus, s_objet_resultat_1);
 1682:             liberation(s_etat_processus, s_objet_resultat_2);
 1683:             liberation(s_etat_processus, s_objet_resultat_3);
 1684:             liberation(s_etat_processus, s_objet_argument);
 1685:             return;
 1686:         }
 1687: 
 1688:         (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_colonnes =
 1689:                 (*((struct_matrice *) (*s_objet_argument).objet))
 1690:                 .nombre_colonnes;
 1691:         (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_lignes =
 1692:                 (*((struct_matrice *) (*s_objet_argument).objet))
 1693:                 .nombre_lignes;
 1694: 
 1695:         if (((*((struct_matrice *) (*s_objet_resultat_2).objet)).tableau =
 1696:                 malloc((*((struct_matrice *) (*s_objet_resultat_2).objet))
 1697:                 .nombre_lignes * sizeof(real8 *))) == NULL)
 1698:         {
 1699:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1700:             return;
 1701:         }
 1702: 
 1703:         for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat_2).objet))
 1704:                 .nombre_lignes; i++)
 1705:         {
 1706:             if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
 1707:                     .objet)).tableau)[i] = malloc((*((struct_matrice *)
 1708:                     (*s_objet_resultat_2).objet)).nombre_colonnes *
 1709:                     sizeof(real8 *))) == NULL)
 1710:             {
 1711:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1712:                 return;
 1713:             }
 1714: 
 1715:             for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat_2).objet))
 1716:                     .nombre_colonnes; j++)
 1717:             {
 1718:                 ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
 1719:                         .objet)).tableau)[i][j] = 0;
 1720:             }
 1721:         }
 1722: 
 1723:         for(i = 0; i < s_vecteur.taille; i++)
 1724:         {
 1725:             ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2).objet))
 1726:                     .tableau)[i][i] = ((real8 *) (s_vecteur.tableau))[i];
 1727:         }
 1728: 
 1729:         free(s_vecteur.tableau);
 1730: 
 1731:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1732:                 s_objet_resultat_3) == d_erreur)
 1733:         {
 1734:             return;
 1735:         }
 1736: 
 1737:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1738:                 s_objet_resultat_2) == d_erreur)
 1739:         {
 1740:             return;
 1741:         }
 1742: 
 1743:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1744:                 s_objet_resultat_1) == d_erreur)
 1745:         {
 1746:             return;
 1747:         }
 1748:     }
 1749:     else if ((*s_objet_argument).type == MCX)
 1750:     {
 1751:         if ((s_objet_resultat_1 = allocation(s_etat_processus, MCX)) == NULL)
 1752:         {
 1753:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1754:             return;
 1755:         }
 1756: 
 1757:         if ((s_objet_resultat_2 = allocation(s_etat_processus, MRL)) == NULL)
 1758:         {
 1759:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1760:             return;
 1761:         }
 1762: 
 1763:         if ((s_objet_resultat_3 = allocation(s_etat_processus, MCX)) == NULL)
 1764:         {
 1765:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1766:             return;
 1767:         }
 1768: 
 1769:         valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
 1770:                 (*s_objet_resultat_3).objet, &s_vecteur,
 1771:                 (*s_objet_resultat_1).objet);
 1772: 
 1773:         if ((*s_etat_processus).erreur_systeme != d_es)
 1774:         {
 1775:             return;
 1776:         }
 1777: 
 1778:         if (((*s_etat_processus).erreur_execution != d_ex) ||
 1779:                 ((*s_etat_processus).exception != d_ep))
 1780:         {
 1781:             liberation(s_etat_processus, s_objet_resultat_1);
 1782:             liberation(s_etat_processus, s_objet_resultat_2);
 1783:             liberation(s_etat_processus, s_objet_resultat_3);
 1784:             liberation(s_etat_processus, s_objet_argument);
 1785:             return;
 1786:         }
 1787: 
 1788:         (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_colonnes =
 1789:                 (*((struct_matrice *) (*s_objet_argument).objet))
 1790:                 .nombre_colonnes;
 1791:         (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_lignes =
 1792:                 (*((struct_matrice *) (*s_objet_argument).objet))
 1793:                 .nombre_lignes;
 1794: 
 1795:         if (((*((struct_matrice *) (*s_objet_resultat_2).objet)).tableau =
 1796:                 malloc((*((struct_matrice *) (*s_objet_resultat_2).objet))
 1797:                 .nombre_lignes * sizeof(real8 *))) == NULL)
 1798:         {
 1799:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1800:             return;
 1801:         }
 1802: 
 1803:         for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat_2).objet))
 1804:                 .nombre_lignes; i++)
 1805:         {
 1806:             if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
 1807:                     .objet)).tableau)[i] = malloc((*((struct_matrice *)
 1808:                     (*s_objet_resultat_2).objet)).nombre_colonnes *
 1809:                     sizeof(real8 *))) == NULL)
 1810:             {
 1811:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1812:                 return;
 1813:             }
 1814: 
 1815:             for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat_2).objet))
 1816:                     .nombre_colonnes; j++)
 1817:             {
 1818:                 ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
 1819:                         .objet)).tableau)[i][j] = 0;
 1820:             }
 1821:         }
 1822: 
 1823:         for(i = 0; i < s_vecteur.taille; i++)
 1824:         {
 1825:             ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2).objet))
 1826:                     .tableau)[i][i] = ((real8 *) (s_vecteur.tableau))[i];
 1827:         }
 1828: 
 1829:         free(s_vecteur.tableau);
 1830: 
 1831:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1832:                 s_objet_resultat_3) == d_erreur)
 1833:         {
 1834:             return;
 1835:         }
 1836: 
 1837:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1838:                 s_objet_resultat_2) == d_erreur)
 1839:         {
 1840:             return;
 1841:         }
 1842: 
 1843:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1844:                 s_objet_resultat_1) == d_erreur)
 1845:         {
 1846:             return;
 1847:         }
 1848:     }
 1849:     else
 1850:     {
 1851:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1852: 
 1853:         liberation(s_etat_processus, s_objet_argument);
 1854:         return;
 1855:     }
 1856: 
 1857:     liberation(s_etat_processus, s_objet_argument);
 1858:     return;
 1859: }
 1860: 
 1861: 
 1862: /*
 1863: ================================================================================
 1864:   Fonction 'swapcntxt'
 1865: ================================================================================
 1866:   Entrées :
 1867: --------------------------------------------------------------------------------
 1868:   Sorties :
 1869: --------------------------------------------------------------------------------
 1870:   Effets de bord : néant
 1871: ================================================================================
 1872: */
 1873: 
 1874: void
 1875: instruction_swapcntxt(struct_processus *s_etat_processus)
 1876: {
 1877:     integer8                    i;
 1878:     integer8                    registre_taille;
 1879: 
 1880:     struct_liste_chainee        *l_element_courant;
 1881:     struct_liste_chainee        *l_element_courant_taille;
 1882:     struct_liste_chainee        *registre;
 1883: 
 1884:     struct_objet                *s_objet_argument;
 1885: 
 1886:     (*s_etat_processus).erreur_execution = d_ex;
 1887: 
 1888:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1889:     {
 1890:         printf("\n  SWAPCNTXT ");
 1891: 
 1892:         if ((*s_etat_processus).langue == 'F')
 1893:         {
 1894:             printf("(échange de contextes)\n\n");
 1895:         }
 1896:         else
 1897:         {
 1898:             printf("(swap contexts)\n\n");
 1899:         }
 1900: 
 1901:         printf("    1: %s\n", d_INT);
 1902:         return;
 1903:     }
 1904:     else if ((*s_etat_processus).test_instruction == 'Y')
 1905:     {
 1906:         (*s_etat_processus).nombre_arguments = -1;
 1907:         return;
 1908:     }
 1909:     
 1910:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1911:     {
 1912:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1913:         {
 1914:             return;
 1915:         }
 1916:     }
 1917: 
 1918:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1919:             &s_objet_argument) == d_erreur)
 1920:     {
 1921:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1922:         return;
 1923:     }
 1924: 
 1925:     if ((*s_objet_argument).type == INT)
 1926:     {
 1927:         l_element_courant = (*s_etat_processus).l_base_pile_contextes;
 1928:         l_element_courant_taille = (*s_etat_processus)
 1929:                 .l_base_pile_taille_contextes;
 1930: 
 1931:         i = (*((integer8 *) (*s_objet_argument).objet));
 1932: 
 1933:         while((l_element_courant != NULL) && (l_element_courant_taille != NULL))
 1934:         {
 1935:             i--;
 1936: 
 1937:             if (i == 0)
 1938:             {
 1939:                 break;
 1940:             }
 1941: 
 1942:             l_element_courant = (*l_element_courant).suivant;
 1943:             l_element_courant_taille = (*l_element_courant_taille).suivant;
 1944:         }
 1945: 
 1946:         if ((l_element_courant == NULL) || (l_element_courant_taille == NULL))
 1947:         {
 1948:             liberation(s_etat_processus, s_objet_argument);
 1949: 
 1950:             (*s_etat_processus).erreur_execution = d_ex_contexte;
 1951:             return;
 1952:         }
 1953: 
 1954:         if ((*(*l_element_courant).donnee).type != LST)
 1955:         {
 1956:             (*s_etat_processus).erreur_systeme = d_es_contexte;
 1957:             return;
 1958:         }
 1959: 
 1960:         if ((*(*l_element_courant_taille).donnee).type != INT)
 1961:         {
 1962:             (*s_etat_processus).erreur_systeme = d_es_contexte;
 1963:             return;
 1964:         }
 1965: 
 1966:         registre = (*s_etat_processus).l_base_pile;
 1967:         registre_taille = (*s_etat_processus).hauteur_pile_operationnelle;
 1968: 
 1969:         (*s_etat_processus).l_base_pile = (*(*l_element_courant).donnee).objet;
 1970:         (*s_etat_processus).hauteur_pile_operationnelle =
 1971:                 (*((integer8 *) (*(*l_element_courant_taille).donnee).objet));
 1972: 
 1973:         (*(*l_element_courant).donnee).objet = registre;
 1974:         (*((integer8 *) (*(*l_element_courant_taille).donnee).objet)) =
 1975:                 registre_taille;
 1976:     }
 1977:     else
 1978:     {
 1979:         liberation(s_etat_processus, s_objet_argument);
 1980: 
 1981:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1982:         return;
 1983:     }
 1984: 
 1985:     liberation(s_etat_processus, s_objet_argument);
 1986: }
 1987: 
 1988: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>