File:  [local] / rpl / src / instructions_s8.c
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Wed Feb 10 10:14:24 2010 UTC (14 years, 2 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_11, HEAD
Branchement vers 4.0.11

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.11
    4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl.conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'splash'
   29: ================================================================================
   30:   Entrées :
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_splash(struct_processus *s_etat_processus)
   40: {
   41:     real8                       attente;
   42: 
   43:     struct_objet                *s_objet;
   44: 
   45:     (*s_etat_processus).erreur_execution = d_ex;
   46: 
   47:     if ((*s_etat_processus).affichage_arguments == 'Y')
   48:     {
   49:         printf("\n  SPLASH ");
   50: 
   51:         if ((*s_etat_processus).langue == 'F')
   52:         {
   53:             printf("(écran RPL/2)\n\n");
   54:         }
   55:         else
   56:         {
   57:             printf("(RPL/2 splash screen)\n\n");
   58:         }
   59: 
   60:         printf("    1: %s, %s\n", d_INT, d_REL);
   61: 
   62:         return;
   63:     }
   64:     else if ((*s_etat_processus).test_instruction == 'Y')
   65:     {
   66:         (*s_etat_processus).nombre_arguments = -1;
   67:         return;
   68:     }
   69:     
   70:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   71:     {
   72:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
   73:         {
   74:             return;
   75:         }
   76:     }
   77: 
   78:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
   79:             &s_objet) == d_erreur)
   80:     {
   81:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
   82:         return;
   83:     }
   84: 
   85:     if (((*s_objet).type == INT) ||
   86:             ((*s_objet).type == REL))
   87:     {
   88:         if ((*s_objet).type == INT)
   89:         {
   90:             attente = (real8) (*((integer8 *) (*s_objet).objet));
   91:         }
   92:         else
   93:         {
   94:             attente = (*((real8 *) (*s_objet).objet));
   95:         }
   96: 
   97:         if (attente < 0)
   98:         {
   99:             liberation(s_etat_processus, s_objet);
  100: 
  101:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  102:             return;
  103:         }
  104: 
  105:         encart(s_etat_processus, (unsigned long) (attente * 1E6));
  106:     }
  107:     else
  108:     {
  109:         liberation(s_etat_processus, s_objet);
  110: 
  111:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  112:         return;
  113:     }
  114: 
  115:     liberation(s_etat_processus, s_objet);
  116: 
  117:     return;
  118: }
  119: 
  120: 
  121: /*
  122: ================================================================================
  123:   Fonction 'send'
  124: ================================================================================
  125:   Entrées :
  126: --------------------------------------------------------------------------------
  127:   Sorties :
  128: --------------------------------------------------------------------------------
  129:   Effets de bord : néant
  130: ================================================================================
  131: */
  132: 
  133: void
  134: instruction_send(struct_processus *s_etat_processus)
  135: {
  136:     pid_t                       pid;
  137: 
  138:     pthread_t                   tid;
  139: 
  140:     sig_atomic_t                registre;
  141: 
  142:     ssize_t                     longueur_ecriture;
  143: 
  144:     struct_objet                *s_objet;
  145: 
  146:     struct timespec             attente;
  147: 
  148:     unsigned char               tampon;
  149: 
  150:     (*s_etat_processus).erreur_execution = d_ex;
  151: 
  152:     if ((*s_etat_processus).affichage_arguments == 'Y')
  153:     {
  154:         printf("\n  SEND ");
  155: 
  156:         if ((*s_etat_processus).langue == 'F')
  157:         {
  158:             printf("(envoi de données au processus père)\n\n");
  159:         }
  160:         else
  161:         {
  162:             printf("(send data to parent process)\n\n");
  163:         }
  164: 
  165:         printf("    1: %s, %s, %s, %s, %s, %s,\n"
  166:                 "       %s, %s, %s, %s, %s,\n"
  167:                 "       %s, %s, %s, %s, %s\n",
  168:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
  169:                 d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_TAB);
  170: 
  171:         return;
  172:     }
  173:     else if ((*s_etat_processus).test_instruction == 'Y')
  174:     {
  175:         (*s_etat_processus).nombre_arguments = -1;
  176:         return;
  177:     }
  178:     
  179:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  180:     {
  181:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  182:         {
  183:             return;
  184:         }
  185:     }
  186: 
  187:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  188:             &s_objet) == d_erreur)
  189:     {
  190:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  191:         return;
  192:     }
  193: 
  194:     if ((*s_etat_processus).presence_pipes == d_faux)
  195:     {
  196:         liberation(s_etat_processus, s_objet);
  197: 
  198:         (*s_etat_processus).erreur_execution = d_ex_absence_processus_pere;
  199:         return;
  200:     }
  201: 
  202:     if (((*s_objet).type != INT) &&
  203:             ((*s_objet).type != REL) &&
  204:             ((*s_objet).type != CPL) &&
  205:             ((*s_objet).type != VIN) &&
  206:             ((*s_objet).type != VRL) &&
  207:             ((*s_objet).type != VCX) &&
  208:             ((*s_objet).type != MIN) &&
  209:             ((*s_objet).type != MRL) &&
  210:             ((*s_objet).type != MCX) &&
  211:             ((*s_objet).type != BIN) &&
  212:             ((*s_objet).type != NOM) &&
  213:             ((*s_objet).type != CHN) &&
  214:             ((*s_objet).type != LST) &&
  215:             ((*s_objet).type != ALG) &&
  216:             ((*s_objet).type != RPN) &&
  217:             ((*s_objet).type != TBL))
  218:     {
  219:         liberation(s_etat_processus, s_objet);
  220: 
  221:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  222:         return;
  223:     }
  224: 
  225:     /*
  226:      * On signale au processus père qu'il y a un objet de plus
  227:      * dans le pipe de données.
  228:      */
  229: 
  230:     registre = (*s_etat_processus).var_volatile_traitement_retarde_stop;
  231:     (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
  232: 
  233:     if ((*s_etat_processus).processus_detache == d_vrai)
  234:     {
  235:         if ((*s_etat_processus).profilage == d_vrai)
  236:         {
  237:             profilage(s_etat_processus, "Interprocess communications (SEND)");
  238: 
  239:             if ((*s_etat_processus).erreur_systeme != d_es)
  240:             {
  241:                 return;
  242:             }
  243:         }
  244: 
  245:         pid = -3;
  246: 
  247:         attente.tv_sec = 0;
  248:         attente.tv_nsec = GRANULARITE_us * 1000;
  249: 
  250:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  251:         {
  252:             (*s_etat_processus).erreur_systeme = d_es_processus;
  253:             return;
  254:         }
  255: 
  256:         while((longueur_ecriture = write_atomic(s_etat_processus,
  257:                 (*s_etat_processus).pipe_nombre_objets_attente,
  258:                 &pid, sizeof(pid))) != sizeof(pid))
  259:         {
  260:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  261:             {
  262:                 if (errno != EINTR)
  263:                 {
  264:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  265:                     return;
  266:                 }
  267:             }
  268: 
  269:             if (longueur_ecriture == -1)
  270:             {
  271:                 if ((*s_etat_processus).profilage == d_vrai)
  272:                 {
  273:                     profilage(s_etat_processus, NULL);
  274:                 }
  275: 
  276:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  277:                 return;
  278:             }
  279: 
  280:             nanosleep(&attente, NULL);
  281:             INCR_GRANULARITE(attente.tv_nsec);
  282: 
  283:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  284:             {
  285:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  286:                 return;
  287:             }
  288:         }
  289: 
  290:         pid = getpid();
  291: 
  292:         attente.tv_sec = 0;
  293:         attente.tv_nsec = GRANULARITE_us * 1000;
  294: 
  295:         while((longueur_ecriture = write_atomic(s_etat_processus,
  296:                 (*s_etat_processus).pipe_nombre_objets_attente,
  297:                 &pid, sizeof(pid))) != sizeof(pid))
  298:         {
  299:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  300:             {
  301:                 if (errno != EINTR)
  302:                 {
  303:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  304:                     return;
  305:                 }
  306:             }
  307: 
  308:             if (longueur_ecriture == -1)
  309:             {
  310:                 if ((*s_etat_processus).profilage == d_vrai)
  311:                 {
  312:                     profilage(s_etat_processus, NULL);
  313:                 }
  314: 
  315:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  316:                 return;
  317:             }
  318: 
  319:             nanosleep(&attente, NULL);
  320:             INCR_GRANULARITE(attente.tv_nsec);
  321: 
  322:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  323:             {
  324:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  325:                 return;
  326:             }
  327:         }
  328: 
  329:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  330:         {
  331:             if (errno != EINTR)
  332:             {
  333:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  334:                 return;
  335:             }
  336:         }
  337:     }
  338:     else
  339:     {
  340:         if ((*s_etat_processus).profilage == d_vrai)
  341:         {
  342:             profilage(s_etat_processus, "Interthread communications (SEND)");
  343: 
  344:             if ((*s_etat_processus).erreur_systeme != d_es)
  345:             {
  346:                 return;
  347:             }
  348:         }
  349: 
  350:         tid = -3;
  351: 
  352:         attente.tv_sec = 0;
  353:         attente.tv_nsec = GRANULARITE_us * 1000;
  354: 
  355:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  356:         {
  357:             (*s_etat_processus).erreur_systeme = d_es_processus;
  358:             return;
  359:         }
  360: 
  361:         while((longueur_ecriture = write_atomic(s_etat_processus,
  362:                 (*s_etat_processus).pipe_nombre_objets_attente,
  363:                 &tid, sizeof(tid))) != sizeof(tid))
  364:         {
  365:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  366:             {
  367:                 if (errno != EINTR)
  368:                 {
  369:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  370:                     return;
  371:                 }
  372:             }
  373: 
  374:             if (longueur_ecriture == -1)
  375:             {
  376:                 if ((*s_etat_processus).profilage == d_vrai)
  377:                 {
  378:                     profilage(s_etat_processus, NULL);
  379:                 }
  380: 
  381:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  382:                 return;
  383:             }
  384: 
  385:             nanosleep(&attente, NULL);
  386:             INCR_GRANULARITE(attente.tv_nsec);
  387: 
  388:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  389:             {
  390:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  391:                 return;
  392:             }
  393:         }
  394: 
  395:         tid = pthread_self();
  396: 
  397:         attente.tv_sec = 0;
  398:         attente.tv_nsec = GRANULARITE_us * 1000;
  399: 
  400:         while((longueur_ecriture = write_atomic(s_etat_processus,
  401:                 (*s_etat_processus).pipe_nombre_objets_attente,
  402:                 &tid, sizeof(tid))) != sizeof(tid))
  403:         {
  404:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  405:             {
  406:                 if (errno != EINTR)
  407:                 {
  408:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  409:                     return;
  410:                 }
  411:             }
  412: 
  413:             if (longueur_ecriture == -1)
  414:             {
  415:                 if ((*s_etat_processus).profilage == d_vrai)
  416:                 {
  417:                     profilage(s_etat_processus, NULL);
  418:                 }
  419: 
  420:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  421:                 return;
  422:             }
  423: 
  424:             nanosleep(&attente, NULL);
  425:             INCR_GRANULARITE(attente.tv_nsec);
  426: 
  427:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  428:             {
  429:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  430:                 return;
  431:             }
  432:         }
  433: 
  434:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  435:         {
  436:             if (errno != EINTR)
  437:             {
  438:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  439:                 return;
  440:             }
  441:         }
  442:     }
  443: 
  444:     (*s_etat_processus).nombre_objets_envoyes_non_lus++;
  445: 
  446:     attente.tv_sec = 0;
  447:     attente.tv_nsec = GRANULARITE_us * 1000;
  448: 
  449:     if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  450:     {
  451:         (*s_etat_processus).erreur_systeme = d_es_processus;
  452:         return;
  453:     }
  454: 
  455:     while(read_atomic(s_etat_processus, (*s_etat_processus).pipe_acquittement,
  456:             &tampon, sizeof(unsigned char)) != sizeof(unsigned char))
  457:     {
  458:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  459:         {
  460:             if (errno != EINTR)
  461:             {
  462:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  463:                 return;
  464:             }
  465:         }
  466: 
  467:         nanosleep(&attente, NULL);
  468:         INCR_GRANULARITE(attente.tv_nsec);
  469: 
  470:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  471:         {
  472:             (*s_etat_processus).erreur_systeme = d_es_processus;
  473:             return;
  474:         }
  475:     }
  476: 
  477:     while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  478:     {
  479:         if (errno != EINTR)
  480:         {
  481:             (*s_etat_processus).erreur_systeme = d_es_processus;
  482:             return;
  483:         }
  484:     }
  485: 
  486:     // Envoi d'un PID invalide (-1) pour ne pas bloquer le thread
  487:     // de surveillance.
  488: 
  489:     if ((*s_etat_processus).processus_detache == d_vrai)
  490:     {
  491:         pid = -1;
  492: 
  493:         attente.tv_sec = 0;
  494:         attente.tv_nsec = GRANULARITE_us * 1000;
  495: 
  496:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  497:         {
  498:             (*s_etat_processus).erreur_systeme = d_es_processus;
  499:             return;
  500:         }
  501: 
  502:         while((longueur_ecriture = write_atomic(s_etat_processus,
  503:                 (*s_etat_processus).pipe_nombre_interruptions_attente,
  504:                 &pid, sizeof(pid))) != sizeof(pid))
  505:         {
  506:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  507:             {
  508:                 if (errno != EINTR)
  509:                 {
  510:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  511:                     return;
  512:                 }
  513:             }
  514: 
  515:             if (longueur_ecriture == -1)
  516:             {
  517:                 if ((*s_etat_processus).profilage == d_vrai)
  518:                 {
  519:                     profilage(s_etat_processus, NULL);
  520:                 }
  521: 
  522:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  523:                 return;
  524:             }
  525: 
  526:             nanosleep(&attente, NULL);
  527:             INCR_GRANULARITE(attente.tv_nsec);
  528: 
  529:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  530:             {
  531:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  532:                 return;
  533:             }
  534:         }
  535: 
  536:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  537:         {
  538:             if (errno != EINTR)
  539:             {
  540:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  541:                 return;
  542:             }
  543:         }
  544:     }
  545:     else
  546:     {
  547:         tid = -1;
  548: 
  549:         attente.tv_sec = 0;
  550:         attente.tv_nsec = GRANULARITE_us * 1000;
  551: 
  552:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  553:         {
  554:             (*s_etat_processus).erreur_systeme = d_es_processus;
  555:             return;
  556:         }
  557: 
  558:         while((longueur_ecriture = write_atomic(s_etat_processus,
  559:                 (*s_etat_processus).pipe_nombre_interruptions_attente,
  560:                 &tid, sizeof(tid))) != sizeof(tid))
  561:         {
  562:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  563:             {
  564:                 if (errno != EINTR)
  565:                 {
  566:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  567:                     return;
  568:                 }
  569:             }
  570: 
  571:             if (longueur_ecriture == -1)
  572:             {
  573:                 if ((*s_etat_processus).profilage == d_vrai)
  574:                 {
  575:                     profilage(s_etat_processus, NULL);
  576:                 }
  577: 
  578:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  579:                 return;
  580:             }
  581: 
  582:             nanosleep(&attente, NULL);
  583:             INCR_GRANULARITE(attente.tv_nsec);
  584: 
  585:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  586:             {
  587:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  588:                 return;
  589:             }
  590:         }
  591: 
  592:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  593:         {
  594:             if (errno != EINTR)
  595:             {
  596:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  597:                 return;
  598:             }
  599:         }
  600:     }
  601: 
  602:     // ecriture_pipe() ne peut être interrompu par un signal.
  603: 
  604:     if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  605:     {
  606:         (*s_etat_processus).erreur_systeme = d_es_processus;
  607:         return;
  608:     }
  609: 
  610:     if (ecriture_pipe(s_etat_processus, (*s_etat_processus).pipe_donnees,
  611:             s_objet) == d_erreur)
  612:     {
  613:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  614:         {
  615:             if (errno != EINTR)
  616:             {
  617:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  618:                 return;
  619:             }
  620:         }
  621: 
  622:         if ((*s_etat_processus).profilage == d_vrai)
  623:         {
  624:             profilage(s_etat_processus, NULL);
  625:         }
  626: 
  627:         liberation(s_etat_processus, s_objet);
  628:         return;
  629:     }
  630: 
  631:     while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  632:     {
  633:         if (errno != EINTR)
  634:         {
  635:             (*s_etat_processus).erreur_systeme = d_es_processus;
  636:             return;
  637:         }
  638:     }
  639: 
  640:     if ((*s_etat_processus).profilage == d_vrai)
  641:     {
  642:         profilage(s_etat_processus, NULL);
  643:     }
  644: 
  645:     if (registre == 0)
  646:     {
  647:         if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
  648:         {
  649:             (*s_etat_processus).var_volatile_requete_arret = -1;
  650:         }
  651: 
  652:         (*s_etat_processus).var_volatile_traitement_retarde_stop = registre;
  653:     }
  654: 
  655:     liberation(s_etat_processus, s_objet);
  656:     return;
  657: }
  658: 
  659: 
  660: /*
  661: ================================================================================
  662:   Fonction 'sqlquery'
  663: ================================================================================
  664:   Entrées :
  665: --------------------------------------------------------------------------------
  666:   Sorties :
  667: --------------------------------------------------------------------------------
  668:   Effets de bord : néant
  669: ================================================================================
  670: */
  671: 
  672: void
  673: instruction_sqlquery(struct_processus *s_etat_processus)
  674: {
  675: #   define                          d_LONGUEUR  1024
  676: 
  677:     logical1                        connexion_permanente;
  678:     logical1                        presence_resultat;
  679: 
  680:     struct_objet                    *s_copie_1;
  681:     struct_objet                    *s_objet_1;
  682:     struct_objet                    *s_copie_2;
  683:     struct_objet                    *s_objet_2;
  684:     struct_objet                    *s_objet_resultat;
  685: 
  686:     struct_liste_chainee            *l_element_courant;
  687:     struct_liste_chainee            *l_element_courant_ligne;
  688: 
  689:     unsigned char                   *tampon;
  690: 
  691:     unsigned int                    i;
  692:     unsigned int                    j;
  693:     unsigned int                    nombre_colonnes;
  694:     unsigned int                    nombre_lignes;
  695: 
  696:     (*s_etat_processus).erreur_execution = d_ex;
  697: 
  698:     if ((*s_etat_processus).affichage_arguments == 'Y')
  699:     {
  700:         printf("\n  SQLQUERY ");
  701: 
  702:         if ((*s_etat_processus).langue == 'F')
  703:         {
  704:             printf("(requête SQL)\n\n");
  705:         }
  706:         else
  707:         {
  708:             printf("(SQL query)\n\n");
  709:         }
  710: 
  711:         printf("    2: %s\n", d_CHN);
  712:         printf("    1: %s\n", d_LST);
  713:         printf("->  1: %s\n\n", d_LST);
  714: 
  715:         printf("    2: %s\n", d_CHN);
  716:         printf("    1: %s\n", d_SQL);
  717:         printf("->  1: %s\n\n", d_LST);
  718: 
  719:         if ((*s_etat_processus).langue == 'F')
  720:         {
  721:             printf("  Utilisation :\n\n");
  722:         }
  723:         else
  724:         {
  725:             printf("  Usage:\n\n");
  726:         }
  727: 
  728:         printf("    \"select * from table\"\n");
  729:         printf("          { \"mysql\" \"server\" \"database\" "
  730:                 "\"user\" \"password\" } SQLQUERY\n");
  731:         printf("    \"select field from table\"\n");
  732:         printf("          { \"postgresql:iso-8859-1\" \"server\" "
  733:                 "\"database\" \"user\" \"password\" port }\n");
  734:         printf("          SQLQUERY\n");
  735: 
  736:         return;
  737:     }
  738:     else if ((*s_etat_processus).test_instruction == 'Y')
  739:     {
  740:         (*s_etat_processus).nombre_arguments = -1;
  741:         return;
  742:     }
  743:     
  744:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  745:     {
  746:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  747:         {
  748:             return;
  749:         }
  750:     }
  751: 
  752:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  753:             &s_objet_1) == d_erreur)
  754:     {
  755:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  756:         return;
  757:     }
  758: 
  759:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  760:             &s_objet_2) == d_erreur)
  761:     {
  762:         liberation(s_etat_processus, s_objet_1);
  763: 
  764:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  765:         return;
  766:     }
  767: 
  768:     if ((*s_objet_1).type == LST)
  769:     {
  770:         connexion_permanente = d_faux;
  771: 
  772:         s_copie_1 = s_objet_1;
  773: 
  774:         if ((s_objet_1 = parametres_sql(s_etat_processus, s_copie_1)) == NULL)
  775:         {
  776:             liberation(s_etat_processus, s_copie_1);
  777:             liberation(s_etat_processus, s_objet_2);
  778:             return;
  779:         }
  780: 
  781:         liberation(s_etat_processus, s_copie_1);
  782:     }
  783:     else
  784:     {
  785:         if ((*s_objet_1).type == SQL)
  786:         {
  787:             if (((*((struct_connecteur_sql *) (*s_objet_1).objet)).pid !=
  788:                     getpid()) || (pthread_equal((*((struct_connecteur_sql *)
  789:                     (*s_objet_1).objet)).tid, pthread_self()) == 0))
  790:             {
  791:                 (*s_etat_processus).erreur_execution =
  792:                         d_ex_fichier_hors_contexte;
  793: 
  794:                 liberation(s_etat_processus, s_objet_1);
  795:                 liberation(s_etat_processus, s_objet_2);
  796:                 return;
  797:             }
  798:         }
  799: 
  800:         connexion_permanente = d_vrai;
  801:     }
  802: 
  803:     if (((*s_objet_1).type == SQL) && ((*s_objet_2).type == CHN))
  804:     {
  805:         if ((*((struct_connecteur_sql *) (*s_objet_1).objet)).locale != NULL)
  806:         {
  807:             /*
  808:              * Transcodage de la commande SQL
  809:              */
  810: 
  811:             if ((s_copie_2 = copie_objet(s_etat_processus, s_objet_2, 'O'))
  812:                     == NULL)
  813:             {
  814:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  815:                 return;
  816:             }
  817: 
  818:             liberation(s_etat_processus, s_objet_2);
  819:             s_objet_2 = s_copie_2;
  820: 
  821:             tampon = (*s_objet_2).objet;
  822: 
  823:             if (((*s_objet_2).objet = transliteration(s_etat_processus, tampon,
  824:                     (*((struct_connecteur_sql *) (*s_objet_1).objet)).locale,
  825:                     d_locale)) == NULL)
  826:             {
  827:                 return;
  828:             }
  829: 
  830:             free(tampon);
  831:         }
  832: 
  833:         /*
  834:          * Pilote MySQL
  835:          */
  836: 
  837:         if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
  838:                 "MYSQL") == 0)
  839:         {
  840: #           ifdef MYSQL_SUPPORT
  841: 
  842:             MYSQL_RES       *resultat_mysql;
  843:             MYSQL_ROW       ligne;
  844: 
  845:             if (mysql_real_query((*((struct_connecteur_sql *) (*s_objet_1)
  846:                     .objet)).descripteur.mysql, (unsigned char *) (*s_objet_2)
  847:                     .objet, strlen((unsigned char *) (*s_objet_2).objet)) != 0)
  848:             {
  849:                 if (connexion_permanente == d_faux)
  850:                 {
  851:                     mysql_close((*((struct_connecteur_sql *) (*s_objet_1)
  852:                             .objet)).descripteur.mysql);
  853:                 }
  854: 
  855:                 liberation(s_etat_processus, s_objet_1);
  856:                 liberation(s_etat_processus, s_objet_2);
  857: 
  858:                 (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
  859:                 return;
  860:             }
  861: 
  862:             if ((resultat_mysql = mysql_store_result(
  863:                     (*((struct_connecteur_sql *) (*s_objet_1).objet))
  864:                     .descripteur.mysql)) == NULL)
  865:             {
  866:                 // La requête ne renvoie rien (exemple : INSERT)
  867:                 presence_resultat = d_faux;
  868:                 nombre_colonnes = 0;
  869:             }
  870:             else
  871:             {
  872:                 // La requête renvoie une ou plusieurs valeurs.
  873:                 presence_resultat = d_vrai;
  874:                 nombre_colonnes = mysql_field_count((*((struct_connecteur_sql *)
  875:                         (*s_objet_1).objet)).descripteur.mysql);
  876:             }
  877: 
  878:             if ((s_objet_resultat = allocation(s_etat_processus, LST))
  879:                     == NULL)
  880:             {
  881:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  882:                 return;
  883:             }
  884: 
  885:             (*s_objet_resultat).objet = NULL;
  886:             l_element_courant = (*s_objet_resultat).objet;
  887: 
  888:             while(((presence_resultat == d_vrai) ?
  889:                     (ligne = mysql_fetch_row(resultat_mysql)) : NULL) != NULL)
  890:             {
  891:                 unsigned long           *longueurs;
  892: 
  893:                 longueurs = mysql_fetch_lengths(resultat_mysql);
  894: 
  895:                 if (l_element_courant == NULL)
  896:                 {
  897:                     if (((*s_objet_resultat).objet =
  898:                             allocation_maillon(s_etat_processus)) == NULL)
  899:                     {
  900:                         (*s_etat_processus).erreur_systeme =
  901:                                 d_es_allocation_memoire;
  902:                         return;
  903:                     }
  904: 
  905:                     l_element_courant = (struct_liste_chainee *)
  906:                             (*s_objet_resultat).objet;
  907:                 }
  908:                 else
  909:                 {
  910:                     if (((*l_element_courant).suivant =
  911:                             allocation_maillon(s_etat_processus)) == NULL)
  912:                     {
  913:                         (*s_etat_processus).erreur_systeme =
  914:                                 d_es_allocation_memoire;
  915:                         return;
  916:                     }
  917: 
  918:                     l_element_courant = (*l_element_courant).suivant;
  919:                 }
  920: 
  921:                 (*l_element_courant).suivant = NULL;
  922: 
  923:                 if (((*l_element_courant).donnee = allocation(s_etat_processus,
  924:                         LST)) == NULL)
  925:                 {
  926:                     (*s_etat_processus).erreur_systeme =
  927:                             d_es_allocation_memoire;
  928:                     return;
  929:                 }
  930: 
  931:                 (*(*l_element_courant).donnee).objet = NULL;
  932:                 l_element_courant_ligne = NULL;
  933: 
  934:                 for(i = 0; i < nombre_colonnes; i++)
  935:                 {
  936:                     if (l_element_courant_ligne == NULL)
  937:                     {
  938:                         if (((*(*l_element_courant).donnee).objet =
  939:                                 allocation_maillon(s_etat_processus)) == NULL)
  940:                         {
  941:                             (*s_etat_processus).erreur_systeme =
  942:                                     d_es_allocation_memoire;
  943:                             return;
  944:                         }
  945: 
  946:                         l_element_courant_ligne = (struct_liste_chainee *)
  947:                                 (*(*l_element_courant).donnee).objet;
  948:                     }
  949:                     else
  950:                     {
  951:                         if (((*l_element_courant_ligne).suivant =
  952:                                 allocation_maillon(s_etat_processus)) == NULL)
  953:                         {
  954:                             (*s_etat_processus).erreur_systeme =
  955:                                     d_es_allocation_memoire;
  956:                             return;
  957:                         }
  958: 
  959:                         l_element_courant_ligne =
  960:                                 (*l_element_courant_ligne).suivant;
  961:                     }
  962: 
  963:                     (*l_element_courant_ligne).suivant = NULL;
  964: 
  965:                     if (((*l_element_courant_ligne).donnee =
  966:                             allocation(s_etat_processus, CHN)) == NULL)
  967:                     {
  968:                         (*s_etat_processus).erreur_systeme =
  969:                                 d_es_allocation_memoire;
  970:                         return;
  971:                     }
  972: 
  973:                     if (ligne[i] == NULL)
  974:                     {
  975:                         if (((*(*l_element_courant_ligne).donnee).objet =
  976:                                 malloc(5 * sizeof(unsigned char))) == NULL)
  977:                         {
  978:                             (*s_etat_processus).erreur_systeme =
  979:                                     d_es_allocation_memoire;
  980:                             return;
  981:                         }
  982: 
  983:                         strcpy((unsigned char *) (*(*l_element_courant_ligne)
  984:                                 .donnee).objet, "NULL");
  985:                     }
  986:                     else
  987:                     {
  988:                         if (((*(*l_element_courant_ligne).donnee).objet =
  989:                                 malloc((longueurs[i] + 1) *
  990:                                 sizeof(unsigned char))) == NULL)
  991:                         {
  992:                             (*s_etat_processus).erreur_systeme =
  993:                                     d_es_allocation_memoire;
  994:                             return;
  995:                         }
  996: 
  997:                         strcpy((unsigned char *) (*(*l_element_courant_ligne)
  998:                                 .donnee).objet, ligne[i]);
  999:                     }
 1000:                 }
 1001:             }
 1002: 
 1003:             mysql_free_result(resultat_mysql);
 1004: 
 1005:             if (connexion_permanente == d_faux)
 1006:             {
 1007:                 mysql_close((*((struct_connecteur_sql *) (*s_objet_1).objet))
 1008:                         .descripteur.mysql);
 1009:             }
 1010: 
 1011:             if (presence_resultat == d_vrai)
 1012:             {
 1013:                 if (empilement(s_etat_processus,
 1014:                         &((*s_etat_processus).l_base_pile),
 1015:                         s_objet_resultat) == d_erreur)
 1016:                 {
 1017:                     return;
 1018:                 }
 1019:             }
 1020: 
 1021: #           else
 1022: 
 1023:             if ((*s_etat_processus).langue == 'F')
 1024:             {
 1025:                 printf("+++Attention : Support de MySQL non compilé !\n");
 1026:             }
 1027:             else
 1028:             {
 1029:                 printf("+++Warning : MySQL support not available !\n");
 1030:             }
 1031: 
 1032:             fflush(stdout);
 1033: #           endif
 1034:         }
 1035: 
 1036:         /*
 1037:          * Pilote PostgreSQL
 1038:          */
 1039: 
 1040:         else if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
 1041:                 "POSTGRESQL") == 0)
 1042:         {
 1043: #           ifdef POSTGRESQL_SUPPORT
 1044: 
 1045:             PGresult        *resultat_postgresql;
 1046: 
 1047:             if (PQstatus((*((struct_connecteur_sql *) (*s_objet_1).objet))
 1048:                     .descripteur.postgresql) != CONNECTION_OK)
 1049:             {
 1050:                 if (connexion_permanente == d_faux)
 1051:                 {
 1052:                     PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet))
 1053:                             .descripteur.postgresql);
 1054:                 }
 1055: 
 1056:                 liberation(s_etat_processus, s_objet_1);
 1057:                 liberation(s_etat_processus, s_objet_2);
 1058: 
 1059:                 (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
 1060:                 return;
 1061:             }
 1062: 
 1063:             resultat_postgresql = PQexec((*((struct_connecteur_sql *)
 1064:                     (*s_objet_1).objet)).descripteur.postgresql,
 1065:                     (unsigned char *) (*s_objet_2).objet);
 1066:             presence_resultat = d_faux;
 1067: 
 1068:             switch(PQresultStatus(resultat_postgresql))
 1069:             {
 1070:                 case PGRES_COMMAND_OK :
 1071:                 { // Commande qui ne renvoit rien
 1072:                     if ((s_objet_resultat = allocation(s_etat_processus, LST))
 1073:                             == NULL)
 1074:                     {
 1075:                         (*s_etat_processus).erreur_systeme =
 1076:                                 d_es_allocation_memoire;
 1077:                         return;
 1078:                     }
 1079: 
 1080:                     (*s_objet_resultat).objet = NULL;
 1081:                     l_element_courant = (*s_objet_resultat).objet;
 1082:                     presence_resultat = d_vrai;
 1083: 
 1084:                     break;
 1085:                 }
 1086: 
 1087:                 case PGRES_TUPLES_OK :
 1088:                 { // Commande renvoyant des données
 1089:                     if ((s_objet_resultat = allocation(s_etat_processus, LST))
 1090:                             == NULL)
 1091:                     {
 1092:                         (*s_etat_processus).erreur_systeme =
 1093:                                 d_es_allocation_memoire;
 1094:                         return;
 1095:                     }
 1096: 
 1097:                     (*s_objet_resultat).objet = NULL;
 1098:                     l_element_courant = (*s_objet_resultat).objet;
 1099:                     presence_resultat = d_vrai;
 1100: 
 1101:                     nombre_colonnes = PQnfields(resultat_postgresql);
 1102:                     nombre_lignes = PQntuples(resultat_postgresql);
 1103: 
 1104:                     for(i = 0; i < nombre_lignes; i++)
 1105:                     {
 1106:                         // Chaînage d'un nouveau maillon de la liste résultat
 1107: 
 1108:                         if (l_element_courant == NULL)
 1109:                         {
 1110:                             if (((*s_objet_resultat).objet =
 1111:                                     allocation_maillon(s_etat_processus))
 1112:                                     == NULL)
 1113:                             {
 1114:                                 (*s_etat_processus).erreur_systeme =
 1115:                                         d_es_allocation_memoire;
 1116:                                 return;
 1117:                             }
 1118: 
 1119:                             l_element_courant = (struct_liste_chainee *)
 1120:                                     (*s_objet_resultat).objet;
 1121:                         }
 1122:                         else
 1123:                         {
 1124:                             if (((*l_element_courant).suivant =
 1125:                                     allocation_maillon(s_etat_processus))
 1126:                                     == NULL)
 1127:                             {
 1128:                                 (*s_etat_processus).erreur_systeme =
 1129:                                         d_es_allocation_memoire;
 1130:                                 return;
 1131:                             }
 1132: 
 1133:                             l_element_courant = (*l_element_courant).suivant;
 1134:                         }
 1135: 
 1136:                         (*l_element_courant).suivant = NULL;
 1137: 
 1138:                         // Création de la liste fille
 1139: 
 1140:                         if (((*l_element_courant).donnee =
 1141:                                 allocation(s_etat_processus, LST)) == NULL)
 1142:                         {
 1143:                             (*s_etat_processus).erreur_systeme =
 1144:                                     d_es_allocation_memoire;
 1145:                             return;
 1146:                         }
 1147: 
 1148:                         (*(*l_element_courant).donnee).objet = NULL;
 1149:                         l_element_courant_ligne = NULL;
 1150: 
 1151:                         for(j = 0; j < nombre_colonnes; j++)
 1152:                         {
 1153:                             if (l_element_courant_ligne == NULL)
 1154:                             {
 1155:                                 if (((*(*l_element_courant).donnee).objet =
 1156:                                         allocation_maillon(s_etat_processus))
 1157:                                         == NULL)
 1158:                                 {
 1159:                                     (*s_etat_processus).erreur_systeme =
 1160:                                             d_es_allocation_memoire;
 1161:                                     return;
 1162:                                 }
 1163: 
 1164:                                 l_element_courant_ligne =
 1165:                                         (struct_liste_chainee *)
 1166:                                         (*(*l_element_courant).donnee).objet;
 1167:                             }
 1168:                             else
 1169:                             {
 1170:                                 if (((*l_element_courant_ligne).suivant =
 1171:                                         allocation_maillon(s_etat_processus))
 1172:                                         == NULL)
 1173:                                 {
 1174:                                     l_element_courant_ligne =
 1175:                                             (*l_element_courant_ligne).suivant;
 1176:                                 }
 1177: 
 1178:                                 l_element_courant_ligne =
 1179:                                         (*l_element_courant_ligne).suivant;
 1180:                             }
 1181: 
 1182:                             (*l_element_courant_ligne).suivant = NULL;
 1183: 
 1184:                             if (((*l_element_courant_ligne).donnee =
 1185:                                     allocation(s_etat_processus, CHN))
 1186:                                     == NULL)
 1187:                             {
 1188:                                 (*s_etat_processus).erreur_systeme =
 1189:                                         d_es_allocation_memoire;
 1190:                                 return;
 1191:                             }
 1192: 
 1193:                             if (PQgetisnull(resultat_postgresql, i, j) != 0)
 1194:                             {
 1195:                                 if (((*(*l_element_courant_ligne).donnee).objet
 1196:                                         = malloc(5 * sizeof(unsigned char)))
 1197:                                         == NULL)
 1198:                                 {
 1199:                                     (*s_etat_processus).erreur_systeme =
 1200:                                             d_es_allocation_memoire;
 1201:                                     return;
 1202:                                 }
 1203: 
 1204:                                 strcpy((unsigned char *)
 1205:                                         (*(*l_element_courant_ligne).donnee)
 1206:                                         .objet, "NULL");
 1207:                             }
 1208:                             else
 1209:                             {
 1210:                                 if (((*(*l_element_courant_ligne).donnee).objet
 1211:                                         = malloc((PQgetlength(
 1212:                                         resultat_postgresql, i, j) + 1) *
 1213:                                         sizeof(unsigned char))) == NULL)
 1214:                                 {
 1215:                                     (*s_etat_processus).erreur_systeme =
 1216:                                             d_es_allocation_memoire;
 1217:                                     return;
 1218:                                 }
 1219: 
 1220:                                 strcpy((unsigned char *)
 1221:                                         (*(*l_element_courant_ligne).donnee)
 1222:                                         .objet, PQgetvalue(resultat_postgresql,
 1223:                                         i, j));
 1224:                             }
 1225:                         }
 1226:                     }
 1227: 
 1228:                     break;
 1229:                 }
 1230: 
 1231:                 case PGRES_EMPTY_QUERY :
 1232:                 case PGRES_COPY_OUT :
 1233:                 case PGRES_COPY_IN :
 1234:                 case PGRES_BAD_RESPONSE :
 1235:                 case PGRES_NONFATAL_ERROR :
 1236:                 case PGRES_FATAL_ERROR :
 1237:                 default :
 1238:                 {
 1239:                     printf("%s\n", PQresultErrorMessage(resultat_postgresql));
 1240:                     PQclear(resultat_postgresql);
 1241: 
 1242:                     if (connexion_permanente == d_faux)
 1243:                     {
 1244:                         PQfinish((*((struct_connecteur_sql *) (*s_objet_1)
 1245:                                 .objet)).descripteur.postgresql);
 1246:                     }
 1247: 
 1248:                     liberation(s_etat_processus, s_objet_1);
 1249:                     liberation(s_etat_processus, s_objet_2);
 1250:  
 1251:                     (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
 1252: 
 1253:                     return;
 1254:                     break;
 1255:                 }
 1256:             }
 1257: 
 1258:             PQclear(resultat_postgresql);
 1259: 
 1260:             if (connexion_permanente == d_faux)
 1261:             {
 1262:                 PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet))
 1263:                         .descripteur.postgresql);
 1264:             }
 1265: 
 1266:             if (presence_resultat == d_vrai)
 1267:             {
 1268:                 if (empilement(s_etat_processus, &((*s_etat_processus)
 1269:                         .l_base_pile), s_objet_resultat) == d_erreur)
 1270:                 {
 1271:                     return;
 1272:                 }
 1273:             }
 1274: 
 1275: #           else
 1276: 
 1277:             if ((*s_etat_processus).langue == 'F')
 1278:             {
 1279:                 printf("+++Attention : Support de PostgreSQL non compilé !\n");
 1280:             }
 1281:             else
 1282:             {
 1283:                 printf("+++Warning : PostgreSQL support not available !\n");
 1284:             }
 1285: 
 1286:             fflush(stdout);
 1287: #           endif
 1288:         }
 1289:         else
 1290:         {
 1291:             liberation(s_etat_processus, s_objet_1);
 1292:             liberation(s_etat_processus, s_objet_2);
 1293: 
 1294:             (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
 1295:             return;
 1296:         }
 1297:     }
 1298:     else
 1299:     {
 1300:         liberation(s_etat_processus, s_objet_1);
 1301:         liberation(s_etat_processus, s_objet_2);
 1302: 
 1303:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1304:         return;
 1305:     }
 1306: 
 1307:     liberation(s_etat_processus, s_objet_1);
 1308:     liberation(s_etat_processus, s_objet_2);
 1309: 
 1310:     return;
 1311: }
 1312: 
 1313: 
 1314: /*
 1315: ================================================================================
 1316:   Fonction 'stop'
 1317: ================================================================================
 1318:   Entrées :
 1319: --------------------------------------------------------------------------------
 1320:   Sorties :
 1321: --------------------------------------------------------------------------------
 1322:   Effets de bord : néant
 1323: ================================================================================
 1324: */
 1325: 
 1326: void
 1327: instruction_stop(struct_processus *s_etat_processus)
 1328: {
 1329:     struct_liste_chainee        *l_element_courant;
 1330: 
 1331:     struct_objet                *s_objet;
 1332: 
 1333:     struct timespec             attente;
 1334: 
 1335:     attente.tv_sec = 0;
 1336:     attente.tv_nsec = GRANULARITE_us * 1000;
 1337: 
 1338:     (*s_etat_processus).erreur_execution = d_ex;
 1339: 
 1340:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1341:     {
 1342:         printf("\n  STOP ");
 1343: 
 1344:         if ((*s_etat_processus).langue == 'F')
 1345:         {
 1346:             printf("(arrêt d'un processus)\n\n");
 1347:         }
 1348:         else
 1349:         {
 1350:             printf("(kill process)\n\n");
 1351:         }
 1352: 
 1353:         printf("    1: %s\n", d_PRC);
 1354: 
 1355:         return;
 1356:     }
 1357:     else if ((*s_etat_processus).test_instruction == 'Y')
 1358:     {
 1359:         (*s_etat_processus).nombre_arguments = -1;
 1360:         return;
 1361:     }
 1362:     
 1363:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1364:     {
 1365:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1366:         {
 1367:             return;
 1368:         }
 1369:     }
 1370: 
 1371:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1372:             &s_objet) == d_erreur)
 1373:     {
 1374:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1375:         return;
 1376:     }
 1377: 
 1378:     if ((*s_objet).type == PRC)
 1379:     {
 1380:         if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
 1381:                 .processus_detache == d_vrai)
 1382:         {
 1383:             kill((*(*((struct_processus_fils *) (*s_objet).objet)).thread).pid,
 1384:                     SIGFSTOP);
 1385:         }
 1386:         else
 1387:         {
 1388:             if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
 1389:             {
 1390:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1391:                 return;
 1392:             }
 1393: 
 1394:             l_element_courant = (struct_liste_chainee *)
 1395:                     (*s_etat_processus).l_base_pile_processus;
 1396: 
 1397:             while(l_element_courant != NULL)
 1398:             {
 1399:                 if ((*(*((struct_processus_fils *) (*(*l_element_courant)
 1400:                         .donnee).objet)).thread).processus_detache == d_faux)
 1401:                 {
 1402:                     if ((pthread_equal((*(*((struct_processus_fils *)
 1403:                             (*(*l_element_courant).donnee).objet)).thread).pid,
 1404:                             (*(*((struct_processus_fils *)
 1405:                             (*s_objet).objet)).thread).tid) != 0) &&
 1406:                             ((*(*((struct_processus_fils *)
 1407:                             (*(*l_element_courant).donnee).objet)).thread).pid
 1408:                             == (*(*((struct_processus_fils *)
 1409:                             (*s_objet).objet)).thread).pid))
 1410:                     {
 1411:                         break;
 1412:                     }
 1413:                 }
 1414: 
 1415:                 l_element_courant = (*l_element_courant).suivant;
 1416:             }
 1417: 
 1418:             if (l_element_courant != NULL)
 1419:             {
 1420:                 // Le champ thread_actif est un pointeur sur un champ de la
 1421:                 // structure s_argument_thread libéré par la fonction
 1422:                 // retrait_thread_surveillance().
 1423: 
 1424:                 if ((*(*((struct_processus_fils *)
 1425:                         (*s_objet).objet)).thread).thread_actif == d_vrai)
 1426:                 {
 1427:                     if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
 1428:                             (*s_objet).objet)).thread).mutex)) != 0)
 1429:                     {
 1430:                         if (pthread_mutex_unlock(&((*s_etat_processus).mutex))
 1431:                                 != 0)
 1432:                         {
 1433:                             (*s_etat_processus).erreur_systeme = d_es_processus;
 1434:                             return;
 1435:                         }
 1436: 
 1437:                         (*s_etat_processus).erreur_systeme = d_es_processus;
 1438:                         return;
 1439:                     }
 1440: 
 1441:                     if ((*(*((struct_processus_fils *)
 1442:                             (*s_objet).objet)).thread).thread_actif == d_vrai)
 1443:                     {
 1444:                         pthread_kill((*(*((struct_processus_fils *)
 1445:                                 (*s_objet).objet)).thread).tid, SIGFSTOP);
 1446:                     }
 1447: 
 1448:                     if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
 1449:                             (*s_objet).objet)).thread).mutex)) != 0)
 1450:                     {
 1451:                         if (pthread_mutex_unlock(&((*s_etat_processus).mutex))
 1452:                                 != 0)
 1453:                         {
 1454:                             (*s_etat_processus).erreur_systeme = d_es_processus;
 1455:                             return;
 1456:                         }
 1457: 
 1458:                         (*s_etat_processus).erreur_systeme = d_es_processus;
 1459:                         return;
 1460:                     }
 1461:                 }
 1462:             }
 1463: 
 1464:             if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
 1465:             {
 1466:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1467:                 return;
 1468:             }
 1469:         }
 1470:     }
 1471:     else
 1472:     {
 1473:         liberation(s_etat_processus, s_objet);
 1474: 
 1475:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1476:         return;
 1477:     }
 1478: 
 1479:     liberation(s_etat_processus, s_objet);
 1480: 
 1481:     return;
 1482: }
 1483: 
 1484: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>