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

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

CVSweb interface <joel.bertrand@systella.fr>