Annotation of rpl/src/instructions_s10.c, revision 1.21

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

CVSweb interface <joel.bertrand@systella.fr>