File:  [local] / rpl / src / instructions_s10.c
Revision 1.61: download - view: text, annotated - select for diffs - revision graph
Wed Aug 22 10:47:17 2012 UTC (11 years, 8 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_10, HEAD
En route pour la 4.1.10.

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

CVSweb interface <joel.bertrand@systella.fr>