File:  [local] / rpl / src / instructions_s10.c
Revision 1.49: download - view: text, annotated - select for diffs - revision graph
Mon Sep 26 15:57:15 2011 UTC (12 years, 7 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
En route pour la 4.1.4.

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

CVSweb interface <joel.bertrand@systella.fr>