Annotation of rpl/src/instructions_s8.c, revision 1.37

1.1       bertrand    1: /*
                      2: ================================================================================
1.32      bertrand    3:   RPL/2 (R) version 4.1.3
1.20      bertrand    4:   Copyright (C) 1989-2011 Dr. BERTRAND Joël
1.1       bertrand    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: 
1.15      bertrand   23: #include "rpl-conv.h"
1.1       bertrand   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: 
1.36      bertrand  250:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  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:        {
1.37    ! bertrand  260:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  261:            {
1.37    ! bertrand  262:                if (errno != EINTR)
        !           263:                {
        !           264:                    (*s_etat_processus).erreur_systeme = d_es_processus;
        !           265:                    return;
        !           266:                }
1.1       bertrand  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: 
1.36      bertrand  283:            if (sem_post(&((*s_etat_processus).semaphore_fork))
1.34      bertrand  284:                    != 0)
1.7       bertrand  285:            {
                    286:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    287:                return;
                    288:            }
1.35      bertrand  289: 
                    290:            scrutation_interruptions(s_etat_processus);
1.1       bertrand  291:        }
                    292: 
                    293:        pid = getpid();
                    294: 
                    295:        attente.tv_sec = 0;
                    296:        attente.tv_nsec = GRANULARITE_us * 1000;
                    297: 
                    298:        while((longueur_ecriture = write_atomic(s_etat_processus,
                    299:                (*s_etat_processus).pipe_nombre_objets_attente,
                    300:                &pid, sizeof(pid))) != sizeof(pid))
                    301:        {
1.37    ! bertrand  302:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  303:            {
1.37    ! bertrand  304:                if (errno != EINTR)
        !           305:                {
        !           306:                    (*s_etat_processus).erreur_systeme = d_es_processus;
        !           307:                    return;
        !           308:                }
1.1       bertrand  309:            }
                    310: 
                    311:            if (longueur_ecriture == -1)
                    312:            {
                    313:                if ((*s_etat_processus).profilage == d_vrai)
                    314:                {
                    315:                    profilage(s_etat_processus, NULL);
                    316:                }
                    317: 
                    318:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    319:                return;
                    320:            }
                    321: 
                    322:            nanosleep(&attente, NULL);
                    323:            INCR_GRANULARITE(attente.tv_nsec);
                    324: 
1.36      bertrand  325:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  326:            {
                    327:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    328:                return;
                    329:            }
1.35      bertrand  330: 
                    331:            scrutation_interruptions(s_etat_processus);
1.1       bertrand  332:        }
                    333: 
1.37    ! bertrand  334:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  335:        {
1.37    ! bertrand  336:            if (errno != EINTR)
        !           337:            {
        !           338:                (*s_etat_processus).erreur_systeme = d_es_processus;
        !           339:                return;
        !           340:            }
1.1       bertrand  341:        }
                    342:    }
                    343:    else
                    344:    {
                    345:        if ((*s_etat_processus).profilage == d_vrai)
                    346:        {
                    347:            profilage(s_etat_processus, "Interthread communications (SEND)");
                    348: 
                    349:            if ((*s_etat_processus).erreur_systeme != d_es)
                    350:            {
                    351:                return;
                    352:            }
                    353:        }
                    354: 
                    355:        tid = -3;
                    356: 
                    357:        attente.tv_sec = 0;
                    358:        attente.tv_nsec = GRANULARITE_us * 1000;
                    359: 
1.36      bertrand  360:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  361:        {
                    362:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    363:            return;
                    364:        }
                    365: 
                    366:        while((longueur_ecriture = write_atomic(s_etat_processus,
                    367:                (*s_etat_processus).pipe_nombre_objets_attente,
                    368:                &tid, sizeof(tid))) != sizeof(tid))
                    369:        {
1.36      bertrand  370:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  371:            {
1.34      bertrand  372:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    373:                return;
1.1       bertrand  374:            }
                    375: 
                    376:            if (longueur_ecriture == -1)
                    377:            {
                    378:                if ((*s_etat_processus).profilage == d_vrai)
                    379:                {
                    380:                    profilage(s_etat_processus, NULL);
                    381:                }
                    382: 
                    383:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    384:                return;
                    385:            }
                    386: 
                    387:            nanosleep(&attente, NULL);
                    388:            INCR_GRANULARITE(attente.tv_nsec);
                    389: 
1.36      bertrand  390:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  391:            {
                    392:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    393:                return;
                    394:            }
1.35      bertrand  395: 
                    396:            scrutation_interruptions(s_etat_processus);
1.1       bertrand  397:        }
                    398: 
                    399:        tid = pthread_self();
                    400: 
                    401:        attente.tv_sec = 0;
                    402:        attente.tv_nsec = GRANULARITE_us * 1000;
                    403: 
                    404:        while((longueur_ecriture = write_atomic(s_etat_processus,
                    405:                (*s_etat_processus).pipe_nombre_objets_attente,
                    406:                &tid, sizeof(tid))) != sizeof(tid))
                    407:        {
1.37    ! bertrand  408:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  409:            {
1.37    ! bertrand  410:                if (errno != EINTR)
        !           411:                {
        !           412:                    (*s_etat_processus).erreur_systeme = d_es_processus;
        !           413:                    return;
        !           414:                }
1.1       bertrand  415:            }
                    416: 
                    417:            if (longueur_ecriture == -1)
                    418:            {
                    419:                if ((*s_etat_processus).profilage == d_vrai)
                    420:                {
                    421:                    profilage(s_etat_processus, NULL);
                    422:                }
                    423: 
                    424:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    425:                return;
                    426:            }
                    427: 
                    428:            nanosleep(&attente, NULL);
                    429:            INCR_GRANULARITE(attente.tv_nsec);
                    430: 
1.36      bertrand  431:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.7       bertrand  432:            {
                    433:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    434:                return;
                    435:            }
1.35      bertrand  436: 
                    437:            scrutation_interruptions(s_etat_processus);
1.1       bertrand  438:        }
                    439: 
1.36      bertrand  440:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  441:        {
1.34      bertrand  442:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    443:            return;
1.1       bertrand  444:        }
                    445:    }
                    446: 
                    447:    (*s_etat_processus).nombre_objets_envoyes_non_lus++;
                    448: 
                    449:    attente.tv_sec = 0;
                    450:    attente.tv_nsec = GRANULARITE_us * 1000;
                    451: 
1.36      bertrand  452:    if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.7       bertrand  453:    {
                    454:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    455:        return;
                    456:    }
1.1       bertrand  457: 
                    458:    while(read_atomic(s_etat_processus, (*s_etat_processus).pipe_acquittement,
                    459:            &tampon, sizeof(unsigned char)) != sizeof(unsigned char))
                    460:    {
1.37    ! bertrand  461:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  462:        {
1.37    ! bertrand  463:            if (errno != EINTR)
        !           464:            {
        !           465:                (*s_etat_processus).erreur_systeme = d_es_processus;
        !           466:                return;
        !           467:            }
1.1       bertrand  468:        }
                    469: 
                    470:        nanosleep(&attente, NULL);
                    471:        INCR_GRANULARITE(attente.tv_nsec);
                    472: 
1.36      bertrand  473:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  474:        {
                    475:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    476:            return;
                    477:        }
1.35      bertrand  478: 
                    479:        scrutation_interruptions(s_etat_processus);
1.1       bertrand  480:    }
                    481: 
1.37    ! bertrand  482:    while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  483:    {
1.37    ! bertrand  484:        if (errno != EINTR)
        !           485:        {
        !           486:            (*s_etat_processus).erreur_systeme = d_es_processus;
        !           487:            return;
        !           488:        }
1.1       bertrand  489:    }
                    490: 
                    491:    // Envoi d'un PID invalide (-1) pour ne pas bloquer le thread
                    492:    // de surveillance.
                    493: 
                    494:    if ((*s_etat_processus).processus_detache == d_vrai)
                    495:    {
                    496:        pid = -1;
                    497: 
                    498:        attente.tv_sec = 0;
                    499:        attente.tv_nsec = GRANULARITE_us * 1000;
                    500: 
1.36      bertrand  501:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  502:        {
                    503:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    504:            return;
                    505:        }
                    506: 
                    507:        while((longueur_ecriture = write_atomic(s_etat_processus,
                    508:                (*s_etat_processus).pipe_nombre_interruptions_attente,
                    509:                &pid, sizeof(pid))) != sizeof(pid))
                    510:        {
1.36      bertrand  511:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  512:            {
1.34      bertrand  513:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    514:                return;
1.1       bertrand  515:            }
                    516: 
                    517:            if (longueur_ecriture == -1)
                    518:            {
                    519:                if ((*s_etat_processus).profilage == d_vrai)
                    520:                {
                    521:                    profilage(s_etat_processus, NULL);
                    522:                }
                    523: 
                    524:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    525:                return;
                    526:            }
                    527: 
                    528:            nanosleep(&attente, NULL);
                    529:            INCR_GRANULARITE(attente.tv_nsec);
                    530: 
1.36      bertrand  531:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  532:            {
                    533:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    534:                return;
                    535:            }
                    536:        }
                    537: 
1.37    ! bertrand  538:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  539:        {
1.37    ! bertrand  540:            if (errno != EINTR)
        !           541:            {
        !           542:                (*s_etat_processus).erreur_systeme = d_es_processus;
        !           543:                return;
        !           544:            }
1.1       bertrand  545:        }
1.35      bertrand  546: 
                    547:        scrutation_interruptions(s_etat_processus);
1.1       bertrand  548:    }
                    549:    else
                    550:    {
                    551:        tid = -1;
                    552: 
                    553:        attente.tv_sec = 0;
                    554:        attente.tv_nsec = GRANULARITE_us * 1000;
                    555: 
1.36      bertrand  556:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  557:        {
                    558:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    559:            return;
                    560:        }
                    561: 
                    562:        while((longueur_ecriture = write_atomic(s_etat_processus,
                    563:                (*s_etat_processus).pipe_nombre_interruptions_attente,
                    564:                &tid, sizeof(tid))) != sizeof(tid))
                    565:        {
1.37    ! bertrand  566:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  567:            {
1.37    ! bertrand  568:                if (errno != EINTR)
        !           569:                {
        !           570:                    (*s_etat_processus).erreur_systeme = d_es_processus;
        !           571:                    return;
        !           572:                }
1.1       bertrand  573:            }
                    574: 
                    575:            if (longueur_ecriture == -1)
                    576:            {
                    577:                if ((*s_etat_processus).profilage == d_vrai)
                    578:                {
                    579:                    profilage(s_etat_processus, NULL);
                    580:                }
                    581: 
                    582:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    583:                return;
                    584:            }
                    585: 
                    586:            nanosleep(&attente, NULL);
                    587:            INCR_GRANULARITE(attente.tv_nsec);
                    588: 
1.36      bertrand  589:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  590:            {
                    591:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    592:                return;
                    593:            }
1.35      bertrand  594: 
                    595:            scrutation_interruptions(s_etat_processus);
1.1       bertrand  596:        }
                    597: 
1.37    ! bertrand  598:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  599:        {
1.37    ! bertrand  600:            if (errno != EINTR)
        !           601:            {
        !           602:                (*s_etat_processus).erreur_systeme = d_es_processus;
        !           603:                return;
        !           604:            }
1.1       bertrand  605:        }
                    606:    }
                    607: 
                    608:    // ecriture_pipe() ne peut être interrompu par un signal.
                    609: 
1.36      bertrand  610:    if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  611:    {
                    612:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    613:        return;
                    614:    }
                    615: 
                    616:    if (ecriture_pipe(s_etat_processus, (*s_etat_processus).pipe_donnees,
                    617:            s_objet) == d_erreur)
                    618:    {
1.37    ! bertrand  619:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  620:        {
1.37    ! bertrand  621:            if (errno != EINTR)
        !           622:            {
        !           623:                (*s_etat_processus).erreur_systeme = d_es_processus;
        !           624:                return;
        !           625:            }
1.1       bertrand  626:        }
                    627: 
                    628:        if ((*s_etat_processus).profilage == d_vrai)
                    629:        {
                    630:            profilage(s_etat_processus, NULL);
                    631:        }
                    632: 
                    633:        liberation(s_etat_processus, s_objet);
                    634:        return;
                    635:    }
                    636: 
1.37    ! bertrand  637:    while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
1.1       bertrand  638:    {
1.37    ! bertrand  639:        if (errno != EINTR)
        !           640:        {
        !           641:            (*s_etat_processus).erreur_systeme = d_es_processus;
        !           642:            return;
        !           643:        }
1.1       bertrand  644:    }
                    645: 
                    646:    if ((*s_etat_processus).profilage == d_vrai)
                    647:    {
                    648:        profilage(s_etat_processus, NULL);
                    649:    }
                    650: 
                    651:    if (registre == 0)
                    652:    {
                    653:        if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
                    654:        {
                    655:            (*s_etat_processus).var_volatile_requete_arret = -1;
                    656:        }
                    657: 
                    658:        (*s_etat_processus).var_volatile_traitement_retarde_stop = registre;
                    659:    }
                    660: 
                    661:    liberation(s_etat_processus, s_objet);
                    662:    return;
                    663: }
                    664: 
                    665: 
                    666: /*
                    667: ================================================================================
                    668:   Fonction 'sqlquery'
                    669: ================================================================================
                    670:   Entrées :
                    671: --------------------------------------------------------------------------------
                    672:   Sorties :
                    673: --------------------------------------------------------------------------------
                    674:   Effets de bord : néant
                    675: ================================================================================
                    676: */
                    677: 
                    678: void
                    679: instruction_sqlquery(struct_processus *s_etat_processus)
                    680: {
                    681: #  define                          d_LONGUEUR  1024
                    682: 
                    683:    logical1                        connexion_permanente;
                    684:    logical1                        presence_resultat;
                    685: 
                    686:    struct_objet                    *s_copie_1;
                    687:    struct_objet                    *s_objet_1;
                    688:    struct_objet                    *s_copie_2;
                    689:    struct_objet                    *s_objet_2;
                    690:    struct_objet                    *s_objet_resultat;
                    691: 
                    692:    struct_liste_chainee            *l_element_courant;
                    693:    struct_liste_chainee            *l_element_courant_ligne;
                    694: 
                    695:    unsigned char                   *tampon;
                    696: 
                    697:    unsigned int                    i;
                    698:    unsigned int                    j;
                    699:    unsigned int                    nombre_colonnes;
                    700:    unsigned int                    nombre_lignes;
                    701: 
                    702:    (*s_etat_processus).erreur_execution = d_ex;
                    703: 
                    704:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    705:    {
                    706:        printf("\n  SQLQUERY ");
                    707: 
                    708:        if ((*s_etat_processus).langue == 'F')
                    709:        {
                    710:            printf("(requête SQL)\n\n");
                    711:        }
                    712:        else
                    713:        {
                    714:            printf("(SQL query)\n\n");
                    715:        }
                    716: 
                    717:        printf("    2: %s\n", d_CHN);
                    718:        printf("    1: %s\n", d_LST);
                    719:        printf("->  1: %s\n\n", d_LST);
                    720: 
                    721:        printf("    2: %s\n", d_CHN);
                    722:        printf("    1: %s\n", d_SQL);
                    723:        printf("->  1: %s\n\n", d_LST);
                    724: 
                    725:        if ((*s_etat_processus).langue == 'F')
                    726:        {
                    727:            printf("  Utilisation :\n\n");
                    728:        }
                    729:        else
                    730:        {
                    731:            printf("  Usage:\n\n");
                    732:        }
                    733: 
                    734:        printf("    \"select * from table\"\n");
                    735:        printf("          { \"mysql\" \"server\" \"database\" "
                    736:                "\"user\" \"password\" } SQLQUERY\n");
                    737:        printf("    \"select field from table\"\n");
                    738:        printf("          { \"postgresql:iso-8859-1\" \"server\" "
                    739:                "\"database\" \"user\" \"password\" port }\n");
                    740:        printf("          SQLQUERY\n");
                    741: 
                    742:        return;
                    743:    }
                    744:    else if ((*s_etat_processus).test_instruction == 'Y')
                    745:    {
                    746:        (*s_etat_processus).nombre_arguments = -1;
                    747:        return;
                    748:    }
                    749:    
                    750:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    751:    {
                    752:        if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
                    753:        {
                    754:            return;
                    755:        }
                    756:    }
                    757: 
                    758:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    759:            &s_objet_1) == d_erreur)
                    760:    {
                    761:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    762:        return;
                    763:    }
                    764: 
                    765:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    766:            &s_objet_2) == d_erreur)
                    767:    {
                    768:        liberation(s_etat_processus, s_objet_1);
                    769: 
                    770:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    771:        return;
                    772:    }
                    773: 
                    774:    if ((*s_objet_1).type == LST)
                    775:    {
                    776:        connexion_permanente = d_faux;
                    777: 
                    778:        s_copie_1 = s_objet_1;
                    779: 
                    780:        if ((s_objet_1 = parametres_sql(s_etat_processus, s_copie_1)) == NULL)
                    781:        {
                    782:            liberation(s_etat_processus, s_copie_1);
                    783:            liberation(s_etat_processus, s_objet_2);
                    784:            return;
                    785:        }
                    786: 
                    787:        liberation(s_etat_processus, s_copie_1);
                    788:    }
                    789:    else
                    790:    {
                    791:        if ((*s_objet_1).type == SQL)
                    792:        {
                    793:            if (((*((struct_connecteur_sql *) (*s_objet_1).objet)).pid !=
                    794:                    getpid()) || (pthread_equal((*((struct_connecteur_sql *)
                    795:                    (*s_objet_1).objet)).tid, pthread_self()) == 0))
                    796:            {
                    797:                (*s_etat_processus).erreur_execution =
                    798:                        d_ex_fichier_hors_contexte;
                    799: 
                    800:                liberation(s_etat_processus, s_objet_1);
                    801:                liberation(s_etat_processus, s_objet_2);
                    802:                return;
                    803:            }
                    804:        }
                    805: 
                    806:        connexion_permanente = d_vrai;
                    807:    }
                    808: 
                    809:    if (((*s_objet_1).type == SQL) && ((*s_objet_2).type == CHN))
                    810:    {
                    811:        if ((*((struct_connecteur_sql *) (*s_objet_1).objet)).locale != NULL)
                    812:        {
                    813:            /*
                    814:             * Transcodage de la commande SQL
                    815:             */
                    816: 
                    817:            if ((s_copie_2 = copie_objet(s_etat_processus, s_objet_2, 'O'))
                    818:                    == NULL)
                    819:            {
                    820:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    821:                return;
                    822:            }
                    823: 
                    824:            liberation(s_etat_processus, s_objet_2);
                    825:            s_objet_2 = s_copie_2;
                    826: 
                    827:            tampon = (*s_objet_2).objet;
                    828: 
                    829:            if (((*s_objet_2).objet = transliteration(s_etat_processus, tampon,
                    830:                    (*((struct_connecteur_sql *) (*s_objet_1).objet)).locale,
                    831:                    d_locale)) == NULL)
                    832:            {
                    833:                return;
                    834:            }
                    835: 
                    836:            free(tampon);
                    837:        }
                    838: 
                    839:        /*
                    840:         * Pilote MySQL
                    841:         */
                    842: 
                    843:        if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
                    844:                "MYSQL") == 0)
                    845:        {
                    846: #          ifdef MYSQL_SUPPORT
                    847: 
                    848:            MYSQL_RES       *resultat_mysql;
                    849:            MYSQL_ROW       ligne;
                    850: 
                    851:            if (mysql_real_query((*((struct_connecteur_sql *) (*s_objet_1)
                    852:                    .objet)).descripteur.mysql, (unsigned char *) (*s_objet_2)
                    853:                    .objet, strlen((unsigned char *) (*s_objet_2).objet)) != 0)
                    854:            {
                    855:                if (connexion_permanente == d_faux)
                    856:                {
                    857:                    mysql_close((*((struct_connecteur_sql *) (*s_objet_1)
                    858:                            .objet)).descripteur.mysql);
                    859:                }
                    860: 
                    861:                liberation(s_etat_processus, s_objet_1);
                    862:                liberation(s_etat_processus, s_objet_2);
                    863: 
                    864:                (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
                    865:                return;
                    866:            }
                    867: 
                    868:            if ((resultat_mysql = mysql_store_result(
                    869:                    (*((struct_connecteur_sql *) (*s_objet_1).objet))
                    870:                    .descripteur.mysql)) == NULL)
                    871:            {
                    872:                // La requête ne renvoie rien (exemple : INSERT)
                    873:                presence_resultat = d_faux;
                    874:                nombre_colonnes = 0;
                    875:            }
                    876:            else
                    877:            {
                    878:                // La requête renvoie une ou plusieurs valeurs.
                    879:                presence_resultat = d_vrai;
                    880:                nombre_colonnes = mysql_field_count((*((struct_connecteur_sql *)
                    881:                        (*s_objet_1).objet)).descripteur.mysql);
                    882:            }
                    883: 
                    884:            if ((s_objet_resultat = allocation(s_etat_processus, LST))
                    885:                    == NULL)
                    886:            {
                    887:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    888:                return;
                    889:            }
                    890: 
                    891:            (*s_objet_resultat).objet = NULL;
                    892:            l_element_courant = (*s_objet_resultat).objet;
                    893: 
                    894:            while(((presence_resultat == d_vrai) ?
                    895:                    (ligne = mysql_fetch_row(resultat_mysql)) : NULL) != NULL)
                    896:            {
                    897:                unsigned long           *longueurs;
                    898: 
                    899:                longueurs = mysql_fetch_lengths(resultat_mysql);
                    900: 
                    901:                if (l_element_courant == NULL)
                    902:                {
                    903:                    if (((*s_objet_resultat).objet =
                    904:                            allocation_maillon(s_etat_processus)) == NULL)
                    905:                    {
                    906:                        (*s_etat_processus).erreur_systeme =
                    907:                                d_es_allocation_memoire;
                    908:                        return;
                    909:                    }
                    910: 
                    911:                    l_element_courant = (struct_liste_chainee *)
                    912:                            (*s_objet_resultat).objet;
                    913:                }
                    914:                else
                    915:                {
                    916:                    if (((*l_element_courant).suivant =
                    917:                            allocation_maillon(s_etat_processus)) == NULL)
                    918:                    {
                    919:                        (*s_etat_processus).erreur_systeme =
                    920:                                d_es_allocation_memoire;
                    921:                        return;
                    922:                    }
                    923: 
                    924:                    l_element_courant = (*l_element_courant).suivant;
                    925:                }
                    926: 
                    927:                (*l_element_courant).suivant = NULL;
                    928: 
                    929:                if (((*l_element_courant).donnee = allocation(s_etat_processus,
                    930:                        LST)) == NULL)
                    931:                {
                    932:                    (*s_etat_processus).erreur_systeme =
                    933:                            d_es_allocation_memoire;
                    934:                    return;
                    935:                }
                    936: 
                    937:                (*(*l_element_courant).donnee).objet = NULL;
                    938:                l_element_courant_ligne = NULL;
                    939: 
                    940:                for(i = 0; i < nombre_colonnes; i++)
                    941:                {
                    942:                    if (l_element_courant_ligne == NULL)
                    943:                    {
                    944:                        if (((*(*l_element_courant).donnee).objet =
                    945:                                allocation_maillon(s_etat_processus)) == NULL)
                    946:                        {
                    947:                            (*s_etat_processus).erreur_systeme =
                    948:                                    d_es_allocation_memoire;
                    949:                            return;
                    950:                        }
                    951: 
                    952:                        l_element_courant_ligne = (struct_liste_chainee *)
                    953:                                (*(*l_element_courant).donnee).objet;
                    954:                    }
                    955:                    else
                    956:                    {
                    957:                        if (((*l_element_courant_ligne).suivant =
                    958:                                allocation_maillon(s_etat_processus)) == NULL)
                    959:                        {
                    960:                            (*s_etat_processus).erreur_systeme =
                    961:                                    d_es_allocation_memoire;
                    962:                            return;
                    963:                        }
                    964: 
                    965:                        l_element_courant_ligne =
                    966:                                (*l_element_courant_ligne).suivant;
                    967:                    }
                    968: 
                    969:                    (*l_element_courant_ligne).suivant = NULL;
                    970: 
                    971:                    if (((*l_element_courant_ligne).donnee =
                    972:                            allocation(s_etat_processus, CHN)) == NULL)
                    973:                    {
                    974:                        (*s_etat_processus).erreur_systeme =
                    975:                                d_es_allocation_memoire;
                    976:                        return;
                    977:                    }
                    978: 
                    979:                    if (ligne[i] == NULL)
                    980:                    {
                    981:                        if (((*(*l_element_courant_ligne).donnee).objet =
                    982:                                malloc(5 * sizeof(unsigned char))) == NULL)
                    983:                        {
                    984:                            (*s_etat_processus).erreur_systeme =
                    985:                                    d_es_allocation_memoire;
                    986:                            return;
                    987:                        }
                    988: 
                    989:                        strcpy((unsigned char *) (*(*l_element_courant_ligne)
                    990:                                .donnee).objet, "NULL");
                    991:                    }
                    992:                    else
                    993:                    {
                    994:                        if (((*(*l_element_courant_ligne).donnee).objet =
                    995:                                malloc((longueurs[i] + 1) *
                    996:                                sizeof(unsigned char))) == NULL)
                    997:                        {
                    998:                            (*s_etat_processus).erreur_systeme =
                    999:                                    d_es_allocation_memoire;
                   1000:                            return;
                   1001:                        }
                   1002: 
                   1003:                        strcpy((unsigned char *) (*(*l_element_courant_ligne)
                   1004:                                .donnee).objet, ligne[i]);
                   1005:                    }
                   1006:                }
                   1007:            }
                   1008: 
                   1009:            mysql_free_result(resultat_mysql);
                   1010: 
                   1011:            if (connexion_permanente == d_faux)
                   1012:            {
                   1013:                mysql_close((*((struct_connecteur_sql *) (*s_objet_1).objet))
                   1014:                        .descripteur.mysql);
                   1015:            }
                   1016: 
                   1017:            if (presence_resultat == d_vrai)
                   1018:            {
                   1019:                if (empilement(s_etat_processus,
                   1020:                        &((*s_etat_processus).l_base_pile),
                   1021:                        s_objet_resultat) == d_erreur)
                   1022:                {
                   1023:                    return;
                   1024:                }
                   1025:            }
                   1026: 
                   1027: #          else
                   1028: 
                   1029:            if ((*s_etat_processus).langue == 'F')
                   1030:            {
                   1031:                printf("+++Attention : Support de MySQL non compilé !\n");
                   1032:            }
                   1033:            else
                   1034:            {
                   1035:                printf("+++Warning : MySQL support not available !\n");
                   1036:            }
                   1037: 
                   1038:            fflush(stdout);
                   1039: #          endif
                   1040:        }
                   1041: 
                   1042:        /*
                   1043:         * Pilote PostgreSQL
                   1044:         */
                   1045: 
                   1046:        else if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
                   1047:                "POSTGRESQL") == 0)
                   1048:        {
                   1049: #          ifdef POSTGRESQL_SUPPORT
                   1050: 
                   1051:            PGresult        *resultat_postgresql;
                   1052: 
                   1053:            if (PQstatus((*((struct_connecteur_sql *) (*s_objet_1).objet))
                   1054:                    .descripteur.postgresql) != CONNECTION_OK)
                   1055:            {
                   1056:                if (connexion_permanente == d_faux)
                   1057:                {
                   1058:                    PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet))
                   1059:                            .descripteur.postgresql);
                   1060:                }
                   1061: 
                   1062:                liberation(s_etat_processus, s_objet_1);
                   1063:                liberation(s_etat_processus, s_objet_2);
                   1064: 
                   1065:                (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
                   1066:                return;
                   1067:            }
                   1068: 
                   1069:            resultat_postgresql = PQexec((*((struct_connecteur_sql *)
                   1070:                    (*s_objet_1).objet)).descripteur.postgresql,
                   1071:                    (unsigned char *) (*s_objet_2).objet);
                   1072:            presence_resultat = d_faux;
                   1073: 
                   1074:            switch(PQresultStatus(resultat_postgresql))
                   1075:            {
                   1076:                case PGRES_COMMAND_OK :
                   1077:                { // Commande qui ne renvoit rien
                   1078:                    if ((s_objet_resultat = allocation(s_etat_processus, LST))
                   1079:                            == NULL)
                   1080:                    {
                   1081:                        (*s_etat_processus).erreur_systeme =
                   1082:                                d_es_allocation_memoire;
                   1083:                        return;
                   1084:                    }
                   1085: 
                   1086:                    (*s_objet_resultat).objet = NULL;
                   1087:                    l_element_courant = (*s_objet_resultat).objet;
                   1088:                    presence_resultat = d_vrai;
                   1089: 
                   1090:                    break;
                   1091:                }
                   1092: 
                   1093:                case PGRES_TUPLES_OK :
                   1094:                { // Commande renvoyant des données
                   1095:                    if ((s_objet_resultat = allocation(s_etat_processus, LST))
                   1096:                            == NULL)
                   1097:                    {
                   1098:                        (*s_etat_processus).erreur_systeme =
                   1099:                                d_es_allocation_memoire;
                   1100:                        return;
                   1101:                    }
                   1102: 
                   1103:                    (*s_objet_resultat).objet = NULL;
                   1104:                    l_element_courant = (*s_objet_resultat).objet;
                   1105:                    presence_resultat = d_vrai;
                   1106: 
                   1107:                    nombre_colonnes = PQnfields(resultat_postgresql);
                   1108:                    nombre_lignes = PQntuples(resultat_postgresql);
                   1109: 
                   1110:                    for(i = 0; i < nombre_lignes; i++)
                   1111:                    {
                   1112:                        // Chaînage d'un nouveau maillon de la liste résultat
                   1113: 
                   1114:                        if (l_element_courant == NULL)
                   1115:                        {
                   1116:                            if (((*s_objet_resultat).objet =
                   1117:                                    allocation_maillon(s_etat_processus))
                   1118:                                    == NULL)
                   1119:                            {
                   1120:                                (*s_etat_processus).erreur_systeme =
                   1121:                                        d_es_allocation_memoire;
                   1122:                                return;
                   1123:                            }
                   1124: 
                   1125:                            l_element_courant = (struct_liste_chainee *)
                   1126:                                    (*s_objet_resultat).objet;
                   1127:                        }
                   1128:                        else
                   1129:                        {
                   1130:                            if (((*l_element_courant).suivant =
                   1131:                                    allocation_maillon(s_etat_processus))
                   1132:                                    == NULL)
                   1133:                            {
                   1134:                                (*s_etat_processus).erreur_systeme =
                   1135:                                        d_es_allocation_memoire;
                   1136:                                return;
                   1137:                            }
                   1138: 
                   1139:                            l_element_courant = (*l_element_courant).suivant;
                   1140:                        }
                   1141: 
                   1142:                        (*l_element_courant).suivant = NULL;
                   1143: 
                   1144:                        // Création de la liste fille
                   1145: 
                   1146:                        if (((*l_element_courant).donnee =
                   1147:                                allocation(s_etat_processus, LST)) == NULL)
                   1148:                        {
                   1149:                            (*s_etat_processus).erreur_systeme =
                   1150:                                    d_es_allocation_memoire;
                   1151:                            return;
                   1152:                        }
                   1153: 
                   1154:                        (*(*l_element_courant).donnee).objet = NULL;
                   1155:                        l_element_courant_ligne = NULL;
                   1156: 
                   1157:                        for(j = 0; j < nombre_colonnes; j++)
                   1158:                        {
                   1159:                            if (l_element_courant_ligne == NULL)
                   1160:                            {
                   1161:                                if (((*(*l_element_courant).donnee).objet =
                   1162:                                        allocation_maillon(s_etat_processus))
                   1163:                                        == NULL)
                   1164:                                {
                   1165:                                    (*s_etat_processus).erreur_systeme =
                   1166:                                            d_es_allocation_memoire;
                   1167:                                    return;
                   1168:                                }
                   1169: 
                   1170:                                l_element_courant_ligne =
                   1171:                                        (struct_liste_chainee *)
                   1172:                                        (*(*l_element_courant).donnee).objet;
                   1173:                            }
                   1174:                            else
                   1175:                            {
                   1176:                                if (((*l_element_courant_ligne).suivant =
                   1177:                                        allocation_maillon(s_etat_processus))
                   1178:                                        == NULL)
                   1179:                                {
                   1180:                                    l_element_courant_ligne =
                   1181:                                            (*l_element_courant_ligne).suivant;
                   1182:                                }
                   1183: 
                   1184:                                l_element_courant_ligne =
                   1185:                                        (*l_element_courant_ligne).suivant;
                   1186:                            }
                   1187: 
                   1188:                            (*l_element_courant_ligne).suivant = NULL;
                   1189: 
                   1190:                            if (((*l_element_courant_ligne).donnee =
                   1191:                                    allocation(s_etat_processus, CHN))
                   1192:                                    == NULL)
                   1193:                            {
                   1194:                                (*s_etat_processus).erreur_systeme =
                   1195:                                        d_es_allocation_memoire;
                   1196:                                return;
                   1197:                            }
                   1198: 
                   1199:                            if (PQgetisnull(resultat_postgresql, i, j) != 0)
                   1200:                            {
                   1201:                                if (((*(*l_element_courant_ligne).donnee).objet
                   1202:                                        = malloc(5 * sizeof(unsigned char)))
                   1203:                                        == NULL)
                   1204:                                {
                   1205:                                    (*s_etat_processus).erreur_systeme =
                   1206:                                            d_es_allocation_memoire;
                   1207:                                    return;
                   1208:                                }
                   1209: 
                   1210:                                strcpy((unsigned char *)
                   1211:                                        (*(*l_element_courant_ligne).donnee)
                   1212:                                        .objet, "NULL");
                   1213:                            }
                   1214:                            else
                   1215:                            {
                   1216:                                if (((*(*l_element_courant_ligne).donnee).objet
                   1217:                                        = malloc((PQgetlength(
                   1218:                                        resultat_postgresql, i, j) + 1) *
                   1219:                                        sizeof(unsigned char))) == NULL)
                   1220:                                {
                   1221:                                    (*s_etat_processus).erreur_systeme =
                   1222:                                            d_es_allocation_memoire;
                   1223:                                    return;
                   1224:                                }
                   1225: 
                   1226:                                strcpy((unsigned char *)
                   1227:                                        (*(*l_element_courant_ligne).donnee)
                   1228:                                        .objet, PQgetvalue(resultat_postgresql,
                   1229:                                        i, j));
                   1230:                            }
                   1231:                        }
                   1232:                    }
                   1233: 
                   1234:                    break;
                   1235:                }
                   1236: 
                   1237:                case PGRES_EMPTY_QUERY :
                   1238:                case PGRES_COPY_OUT :
                   1239:                case PGRES_COPY_IN :
                   1240:                case PGRES_BAD_RESPONSE :
                   1241:                case PGRES_NONFATAL_ERROR :
                   1242:                case PGRES_FATAL_ERROR :
                   1243:                default :
                   1244:                {
                   1245:                    printf("%s\n", PQresultErrorMessage(resultat_postgresql));
                   1246:                    PQclear(resultat_postgresql);
                   1247: 
                   1248:                    if (connexion_permanente == d_faux)
                   1249:                    {
                   1250:                        PQfinish((*((struct_connecteur_sql *) (*s_objet_1)
                   1251:                                .objet)).descripteur.postgresql);
                   1252:                    }
                   1253: 
                   1254:                    liberation(s_etat_processus, s_objet_1);
                   1255:                    liberation(s_etat_processus, s_objet_2);
                   1256:  
                   1257:                    (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
                   1258: 
                   1259:                    return;
                   1260:                    break;
                   1261:                }
                   1262:            }
                   1263: 
                   1264:            PQclear(resultat_postgresql);
                   1265: 
                   1266:            if (connexion_permanente == d_faux)
                   1267:            {
                   1268:                PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet))
                   1269:                        .descripteur.postgresql);
                   1270:            }
                   1271: 
                   1272:            if (presence_resultat == d_vrai)
                   1273:            {
                   1274:                if (empilement(s_etat_processus, &((*s_etat_processus)
                   1275:                        .l_base_pile), s_objet_resultat) == d_erreur)
                   1276:                {
                   1277:                    return;
                   1278:                }
                   1279:            }
                   1280: 
                   1281: #          else
                   1282: 
                   1283:            if ((*s_etat_processus).langue == 'F')
                   1284:            {
                   1285:                printf("+++Attention : Support de PostgreSQL non compilé !\n");
                   1286:            }
                   1287:            else
                   1288:            {
                   1289:                printf("+++Warning : PostgreSQL support not available !\n");
                   1290:            }
                   1291: 
                   1292:            fflush(stdout);
                   1293: #          endif
                   1294:        }
                   1295:        else
                   1296:        {
                   1297:            liberation(s_etat_processus, s_objet_1);
                   1298:            liberation(s_etat_processus, s_objet_2);
                   1299: 
                   1300:            (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
                   1301:            return;
                   1302:        }
                   1303:    }
                   1304:    else
                   1305:    {
                   1306:        liberation(s_etat_processus, s_objet_1);
                   1307:        liberation(s_etat_processus, s_objet_2);
                   1308: 
                   1309:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1310:        return;
                   1311:    }
                   1312: 
                   1313:    liberation(s_etat_processus, s_objet_1);
                   1314:    liberation(s_etat_processus, s_objet_2);
                   1315: 
                   1316:    return;
                   1317: }
                   1318: 
                   1319: 
                   1320: /*
                   1321: ================================================================================
                   1322:   Fonction 'stop'
                   1323: ================================================================================
                   1324:   Entrées :
                   1325: --------------------------------------------------------------------------------
                   1326:   Sorties :
                   1327: --------------------------------------------------------------------------------
                   1328:   Effets de bord : néant
                   1329: ================================================================================
                   1330: */
                   1331: 
                   1332: void
                   1333: instruction_stop(struct_processus *s_etat_processus)
                   1334: {
                   1335:    struct_liste_chainee        *l_element_courant;
                   1336: 
                   1337:    struct_objet                *s_objet;
                   1338: 
                   1339:    (*s_etat_processus).erreur_execution = d_ex;
                   1340: 
                   1341:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1342:    {
                   1343:        printf("\n  STOP ");
                   1344: 
                   1345:        if ((*s_etat_processus).langue == 'F')
                   1346:        {
                   1347:            printf("(arrêt d'un processus)\n\n");
                   1348:        }
                   1349:        else
                   1350:        {
                   1351:            printf("(kill process)\n\n");
                   1352:        }
                   1353: 
                   1354:        printf("    1: %s\n", d_PRC);
                   1355: 
                   1356:        return;
                   1357:    }
                   1358:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1359:    {
                   1360:        (*s_etat_processus).nombre_arguments = -1;
                   1361:        return;
                   1362:    }
                   1363:    
                   1364:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1365:    {
                   1366:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1367:        {
                   1368:            return;
                   1369:        }
                   1370:    }
                   1371: 
                   1372:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1373:            &s_objet) == d_erreur)
                   1374:    {
                   1375:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1376:        return;
                   1377:    }
                   1378: 
                   1379:    if ((*s_objet).type == PRC)
                   1380:    {
                   1381:        if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
                   1382:                .processus_detache == d_vrai)
                   1383:        {
1.33      bertrand 1384:            envoi_signal_processus((*(*((struct_processus_fils *)
                   1385:                    (*s_objet).objet)).thread).pid, rpl_sigstop);
1.1       bertrand 1386:        }
                   1387:        else
                   1388:        {
                   1389:            if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
                   1390:            {
                   1391:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   1392:                return;
                   1393:            }
                   1394: 
                   1395:            l_element_courant = (struct_liste_chainee *)
                   1396:                    (*s_etat_processus).l_base_pile_processus;
                   1397: 
                   1398:            while(l_element_courant != NULL)
                   1399:            {
                   1400:                if ((*(*((struct_processus_fils *) (*(*l_element_courant)
                   1401:                        .donnee).objet)).thread).processus_detache == d_faux)
                   1402:                {
                   1403:                    if ((pthread_equal((*(*((struct_processus_fils *)
1.9       bertrand 1404:                            (*(*l_element_courant).donnee).objet)).thread).tid,
1.1       bertrand 1405:                            (*(*((struct_processus_fils *)
                   1406:                            (*s_objet).objet)).thread).tid) != 0) &&
                   1407:                            ((*(*((struct_processus_fils *)
                   1408:                            (*(*l_element_courant).donnee).objet)).thread).pid
                   1409:                            == (*(*((struct_processus_fils *)
                   1410:                            (*s_objet).objet)).thread).pid))
                   1411:                    {
                   1412:                        break;
                   1413:                    }
                   1414:                }
                   1415: 
                   1416:                l_element_courant = (*l_element_courant).suivant;
                   1417:            }
                   1418: 
                   1419:            if (l_element_courant != NULL)
                   1420:            {
                   1421:                // Le champ thread_actif est un pointeur sur un champ de la
                   1422:                // structure s_argument_thread libéré par la fonction
                   1423:                // retrait_thread_surveillance().
                   1424: 
                   1425:                if ((*(*((struct_processus_fils *)
                   1426:                        (*s_objet).objet)).thread).thread_actif == d_vrai)
                   1427:                {
                   1428:                    if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
                   1429:                            (*s_objet).objet)).thread).mutex)) != 0)
                   1430:                    {
                   1431:                        if (pthread_mutex_unlock(&((*s_etat_processus).mutex))
                   1432:                                != 0)
                   1433:                        {
                   1434:                            (*s_etat_processus).erreur_systeme = d_es_processus;
                   1435:                            return;
                   1436:                        }
                   1437: 
                   1438:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   1439:                        return;
                   1440:                    }
                   1441: 
                   1442:                    if ((*(*((struct_processus_fils *)
                   1443:                            (*s_objet).objet)).thread).thread_actif == d_vrai)
                   1444:                    {
1.33      bertrand 1445:                        envoi_signal_thread((*(*((struct_processus_fils *)
                   1446:                                (*s_objet).objet)).thread).tid, rpl_sigstop);
1.1       bertrand 1447:                    }
                   1448: 
                   1449:                    if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
                   1450:                            (*s_objet).objet)).thread).mutex)) != 0)
                   1451:                    {
                   1452:                        if (pthread_mutex_unlock(&((*s_etat_processus).mutex))
                   1453:                                != 0)
                   1454:                        {
                   1455:                            (*s_etat_processus).erreur_systeme = d_es_processus;
                   1456:                            return;
                   1457:                        }
                   1458: 
                   1459:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   1460:                        return;
                   1461:                    }
                   1462:                }
                   1463:            }
                   1464: 
                   1465:            if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
                   1466:            {
                   1467:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   1468:                return;
                   1469:            }
                   1470:        }
                   1471:    }
                   1472:    else
                   1473:    {
                   1474:        liberation(s_etat_processus, s_objet);
                   1475: 
                   1476:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1477:        return;
                   1478:    }
                   1479: 
                   1480:    liberation(s_etat_processus, s_objet);
                   1481: 
                   1482:    return;
                   1483: }
                   1484: 
                   1485: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>