Annotation of rpl/src/instructions_c6.c, revision 1.35

1.1       bertrand    1: /*
                      2: ================================================================================
1.35    ! bertrand    3:   RPL/2 (R) version 4.1.7
1.33      bertrand    4:   Copyright (C) 1989-2012 Dr. BERTRAND Joël
1.1       bertrand    5: 
                      6:   This file is part of RPL/2.
                      7: 
                      8:   RPL/2 is free software; you can redistribute it and/or modify it
                      9:   under the terms of the CeCILL V2 License as published by the french
                     10:   CEA, CNRS and INRIA.
                     11:  
                     12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
                     13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
                     14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
                     15:   for more details.
                     16:  
                     17:   You should have received a copy of the CeCILL License
                     18:   along with RPL/2. If not, write to info@cecill.info.
                     19: ================================================================================
                     20: */
                     21: 
                     22: 
1.11      bertrand   23: #include "rpl-conv.h"
1.1       bertrand   24: 
                     25: 
                     26: /*
                     27: ================================================================================
                     28:   Fonction 'clusr'
                     29: ================================================================================
                     30:   Entrées :
                     31: --------------------------------------------------------------------------------
                     32:   Sorties :
                     33: --------------------------------------------------------------------------------
                     34:   Effets de bord : néant
                     35: ================================================================================
                     36: */
                     37: 
                     38: void
                     39: instruction_clusr(struct_processus *s_etat_processus)
                     40: {
1.21      bertrand   41:    struct_liste_variables              *l_element_courant;
                     42: 
1.1       bertrand   43:    (*s_etat_processus).erreur_execution = d_ex;
                     44: 
                     45:    if ((*s_etat_processus).affichage_arguments == 'Y')
                     46:    {
                     47:        printf("\n  CLUSR ");
                     48: 
                     49:        if ((*s_etat_processus).langue == 'F')
                     50:        {
                     51:            printf("(effacement des variables)\n\n");
                     52:            printf("  Aucun argument\n");
                     53:        }
                     54:        else
                     55:        {
                     56:            printf("(clear variables)\n\n");
                     57:            printf("  No argument\n");
                     58:        }
                     59: 
                     60:        return;
                     61:    }
                     62:    else if ((*s_etat_processus).test_instruction == 'Y')
                     63:    {
                     64:        (*s_etat_processus).nombre_arguments = -1;
                     65:        return;
                     66:    }
                     67: 
                     68:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                     69:    {
                     70:        if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
                     71:        {
                     72:            return;
                     73:        }
                     74:    }
1.21      bertrand   75: 
                     76:    l_element_courant = (*s_etat_processus).l_liste_variables_par_niveau;
                     77: 
                     78:    if (l_element_courant == NULL)
                     79:    {
                     80:        return;
                     81:    }
                     82: 
                     83:    do
1.1       bertrand   84:    {
1.21      bertrand   85:        if ((*l_element_courant).liste != NULL)
1.1       bertrand   86:        {
1.21      bertrand   87:            if ((*(*l_element_courant).liste).donnee != NULL)
1.1       bertrand   88:            {
1.21      bertrand   89:                if ((*((struct_variable *) (*(*l_element_courant).liste)
                     90:                        .donnee)).niveau == 1)
                     91:                {
                     92:                    while((*l_element_courant).liste != NULL)
                     93:                    {
                     94:                        if (retrait_variable(s_etat_processus,
                     95:                                (*((struct_variable *) (*(*l_element_courant)
                     96:                                .liste).donnee)).nom, 'G') == d_erreur)
                     97:                        {
                     98:                            return;
                     99:                        }
                    100: 
                    101:                        if ((*s_etat_processus).niveau_supprime == d_vrai)
                    102:                        {
                    103:                            // La dernière variable de niveau 1 a été
                    104:                            // supprimée. On sort donc de la boucle car
                    105:                            // (*l_element_courant).liste pointe sur
                    106:                            // un pointeur libérée par retrait_variable().
                    107: 
                    108:                            break;
                    109:                        }
                    110:                    }
                    111: 
                    112:                    break;
                    113:                }
1.1       bertrand  114:            }
                    115:        }
1.21      bertrand  116: 
                    117:        l_element_courant = (*l_element_courant).precedent;
                    118:    } while(l_element_courant != (*s_etat_processus)
                    119:            .l_liste_variables_par_niveau);
1.1       bertrand  120: 
                    121:    return;
                    122: }
                    123: 
                    124: 
                    125: /*
                    126: ================================================================================
                    127:   Fonction 'col->'
                    128: ================================================================================
                    129:   Entrées :
                    130: --------------------------------------------------------------------------------
                    131:   Sorties :
                    132: --------------------------------------------------------------------------------
                    133:   Effets de bord : néant
                    134: ================================================================================
                    135: */
                    136: 
                    137: void
                    138: instruction_col_fleche(struct_processus *s_etat_processus)
                    139: {
                    140:    struct_objet                *s_objet;
                    141:    struct_objet                *s_objet_elementaire;
                    142: 
                    143:    unsigned long               i;
                    144:    unsigned long               j;
                    145: 
                    146:    (*s_etat_processus).erreur_execution = d_ex;
                    147: 
                    148:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    149:    {
                    150:        printf("\n  COL-> ");
                    151: 
                    152:        if ((*s_etat_processus).langue == 'F')
                    153:        {
                    154:            printf("(extraction des colonnes d'une matrice)\n\n");
                    155:        }
                    156:        else
                    157:        {
                    158:            printf("(extract matrix columns)\n\n");
                    159:        }
                    160: 
                    161:        printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
                    162:        printf("->  n: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
                    163:        printf("    ...\n");
                    164:        printf("    2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
                    165:        printf("    1: %s\n", d_INT);
                    166: 
                    167:        return;
                    168:    }
                    169:    else if ((*s_etat_processus).test_instruction == 'Y')
                    170:    {
                    171:        (*s_etat_processus).nombre_arguments = -1;
                    172:        return;
                    173:    }
                    174: 
                    175:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    176:    {
                    177:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    178:        {
                    179:            return;
                    180:        }
                    181:    }
                    182: 
                    183:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    184:            &s_objet) == d_erreur)
                    185:    {
                    186:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    187:        return;
                    188:    }
                    189: 
                    190:    if ((*s_objet).type == MIN)
                    191:    {
                    192:        for(i = 0; i < (*((struct_matrice *)
                    193:                (*s_objet).objet)).nombre_colonnes; i++)
                    194:        {
                    195:            if ((s_objet_elementaire = allocation(s_etat_processus, MIN))
                    196:                    == NULL)
                    197:            {
                    198:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    199:                return;
                    200:            }
                    201: 
                    202:            (*((struct_matrice *) (*s_objet_elementaire).objet))
                    203:                    .nombre_colonnes = 1;
                    204:            (*((struct_matrice *) (*s_objet_elementaire).objet))
                    205:                    .nombre_lignes = (*((struct_matrice *) (*s_objet).objet))
                    206:                    .nombre_lignes;
                    207: 
                    208:            if (((*((struct_matrice *) (*s_objet_elementaire).objet)).tableau =
                    209:                    malloc((*((struct_matrice *) (*s_objet).objet))
                    210:                    .nombre_lignes * sizeof(integer8 *))) == NULL)
                    211:            {
                    212:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    213:                return;
                    214:            }
                    215: 
                    216:            for(j = 0; j < (*((struct_matrice *) (*s_objet).objet))
                    217:                    .nombre_lignes; j++)
                    218:            {
                    219:                if ((((integer8 **) (*((struct_matrice *) (*s_objet_elementaire)
                    220:                        .objet)).tableau)[j] = malloc(sizeof(integer8)))
                    221:                        == NULL)
                    222:                {
                    223:                    (*s_etat_processus).erreur_systeme =
                    224:                            d_es_allocation_memoire;
                    225:                    return;
                    226:                }
                    227: 
                    228:                ((integer8 **) (*((struct_matrice *) (*s_objet_elementaire)
                    229:                        .objet)).tableau)[j][0] = ((integer8 **)
                    230:                        (*((struct_matrice *) (*s_objet).objet)).tableau)[j][i];
                    231:            }
                    232: 
                    233:            if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    234:                    s_objet_elementaire) == d_erreur)
                    235:            {
                    236:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    237:                return;
                    238:            }
                    239:        }
                    240:    }
                    241:    else if ((*s_objet).type == MRL)
                    242:    {
                    243:        for(i = 0; i < (*((struct_matrice *)
                    244:                (*s_objet).objet)).nombre_colonnes; i++)
                    245:        {
                    246:            if ((s_objet_elementaire = allocation(s_etat_processus, MRL))
                    247:                    == NULL)
                    248:            {
                    249:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    250:                return;
                    251:            }
                    252: 
                    253:            (*((struct_matrice *) (*s_objet_elementaire).objet))
                    254:                    .nombre_colonnes = 1;
                    255:            (*((struct_matrice *) (*s_objet_elementaire).objet))
                    256:                    .nombre_lignes = (*((struct_matrice *) (*s_objet).objet))
                    257:                    .nombre_lignes;
                    258: 
                    259:            if (((*((struct_matrice *) (*s_objet_elementaire).objet)).tableau =
                    260:                    malloc((*((struct_matrice *) (*s_objet).objet))
                    261:                    .nombre_lignes * sizeof(real8 *))) == NULL)
                    262:            {
                    263:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    264:                return;
                    265:            }
                    266: 
                    267:            for(j = 0; j < (*((struct_matrice *) (*s_objet).objet))
                    268:                    .nombre_lignes; j++)
                    269:            {
                    270:                if ((((real8 **) (*((struct_matrice *) (*s_objet_elementaire)
                    271:                        .objet)).tableau)[j] = malloc(sizeof(real8)))
                    272:                        == NULL)
                    273:                {
                    274:                    (*s_etat_processus).erreur_systeme =
                    275:                            d_es_allocation_memoire;
                    276:                    return;
                    277:                }
                    278: 
                    279:                ((real8 **) (*((struct_matrice *) (*s_objet_elementaire)
                    280:                        .objet)).tableau)[j][0] = ((real8 **)
                    281:                        (*((struct_matrice *) (*s_objet).objet)).tableau)[j][i];
                    282:            }
                    283: 
                    284:            if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    285:                    s_objet_elementaire) == d_erreur)
                    286:            {
                    287:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    288:                return;
                    289:            }
                    290:        }
                    291:    }
                    292:    else if ((*s_objet).type == MCX)
                    293:    {
                    294:        for(i = 0; i < (*((struct_matrice *)
                    295:                (*s_objet).objet)).nombre_colonnes; i++)
                    296:        {
                    297:            if ((s_objet_elementaire = allocation(s_etat_processus, MCX))
                    298:                    == NULL)
                    299:            {
                    300:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    301:                return;
                    302:            }
                    303: 
                    304:            (*((struct_matrice *) (*s_objet_elementaire).objet))
                    305:                    .nombre_colonnes = 1;
                    306:            (*((struct_matrice *) (*s_objet_elementaire).objet))
                    307:                    .nombre_lignes = (*((struct_matrice *) (*s_objet).objet))
                    308:                    .nombre_lignes;
                    309: 
                    310:            if (((*((struct_matrice *) (*s_objet_elementaire).objet)).tableau =
                    311:                    malloc((*((struct_matrice *) (*s_objet).objet))
                    312:                    .nombre_lignes * sizeof(complex16 *))) == NULL)
                    313:            {
                    314:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    315:                return;
                    316:            }
                    317: 
                    318:            for(j = 0; j < (*((struct_matrice *) (*s_objet).objet))
                    319:                    .nombre_lignes; j++)
                    320:            {
                    321:                if ((((complex16 **) (*((struct_matrice *)
                    322:                        (*s_objet_elementaire).objet)).tableau)[j] =
                    323:                        malloc(sizeof(complex16))) == NULL)
                    324:                {
                    325:                    (*s_etat_processus).erreur_systeme =
                    326:                            d_es_allocation_memoire;
                    327:                    return;
                    328:                }
                    329: 
                    330:                (((complex16 **) (*((struct_matrice *) (*s_objet_elementaire)
                    331:                        .objet)).tableau)[j][0]).partie_reelle =
                    332:                        (((complex16 **) (*((struct_matrice *) (*s_objet)
                    333:                        .objet)).tableau)[j][i]).partie_reelle;
                    334:                (((complex16 **) (*((struct_matrice *) (*s_objet_elementaire)
                    335:                        .objet)).tableau)[j][0]).partie_imaginaire =
                    336:                        (((complex16 **) (*((struct_matrice *) (*s_objet)
                    337:                        .objet)).tableau)[j][i]).partie_imaginaire;
                    338:            }
                    339: 
                    340:            if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    341:                    s_objet_elementaire) == d_erreur)
                    342:            {
                    343:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    344:                return;
                    345:            }
                    346:        }
                    347:    }
                    348:    else
                    349:    {
                    350:        liberation(s_etat_processus, s_objet);
                    351: 
                    352:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    353:        return;
                    354:    }
                    355: 
                    356:    if ((s_objet_elementaire = allocation(s_etat_processus, INT)) == NULL)
                    357:    {
                    358:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    359:        return;
                    360:    }
                    361: 
                    362:    (*((integer8 *) (*s_objet_elementaire).objet)) =
                    363:            (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes;
                    364: 
                    365:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    366:            s_objet_elementaire) == d_erreur)
                    367:    {
                    368:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    369:        return;
                    370:    }
                    371: 
                    372:    liberation(s_etat_processus, s_objet);
                    373: 
                    374:    return;
                    375: }
                    376: 
                    377: 
                    378: /*
                    379: ================================================================================
                    380:   Fonction 'clrswi'
                    381: ================================================================================
                    382:   Entrées : pointeur sur une structure struct_processus
                    383: --------------------------------------------------------------------------------
                    384:   Sorties :
                    385: --------------------------------------------------------------------------------
                    386:   Effets de bord : néant
                    387: ================================================================================
                    388: */
                    389: 
                    390: void
                    391: instruction_clrswi(struct_processus *s_etat_processus)
                    392: {
                    393:    integer8                        interruption;
                    394: 
                    395:    struct_objet                    *s_objet_argument;
                    396: 
                    397:    (*s_etat_processus).erreur_execution = d_ex;
                    398: 
                    399:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    400:    {
                    401:        printf("\n  CLRSWI ");
                    402: 
                    403:        if ((*s_etat_processus).langue == 'F')
                    404:        {
                    405:            printf("(suppression d'une interruption logicielle)\n\n");
                    406:        }
                    407:        else
                    408:        {
                    409:            printf("(software interrupt deletion)\n\n");
                    410:        }
                    411: 
                    412:        printf("    1: %s\n", d_INT);
                    413: 
                    414:        return;
                    415:    }
                    416:    else if ((*s_etat_processus).test_instruction == 'Y')
                    417:    {
                    418:        (*s_etat_processus).nombre_arguments = -1;
                    419:        return;
                    420:    }
                    421: 
                    422:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    423:    {
                    424:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    425:        {
                    426:            return;
                    427:        }
                    428:    }
                    429: 
                    430:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    431:            &s_objet_argument) == d_erreur)
                    432:    {
                    433:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    434:        return;
                    435:    }
                    436: 
                    437:    if ((*s_objet_argument).type == INT)
                    438:    {
                    439:        interruption = (*((integer8 *) (*s_objet_argument).objet));
                    440: 
                    441:        if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
                    442:        {
                    443:            liberation(s_etat_processus, s_objet_argument);
                    444: 
                    445:            (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
                    446:            return;
                    447:        }
                    448: 
                    449:        liberation(s_etat_processus, (*s_etat_processus)
                    450:                .corps_interruptions[interruption - 1]);
                    451:        (*s_etat_processus).corps_interruptions[interruption - 1] = NULL;
                    452:    }
                    453:    else
                    454:    {
                    455:        liberation(s_etat_processus, s_objet_argument);
                    456: 
                    457:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    458:        return;
                    459:    }
                    460: 
                    461:    return;
                    462: }
                    463: 
                    464: 
                    465: /*
                    466: ================================================================================
                    467:   Fonction 'clrcntxt'
                    468: ================================================================================
                    469:   Entrées :
                    470: --------------------------------------------------------------------------------
                    471:   Sorties :
                    472: --------------------------------------------------------------------------------
                    473:   Effets de bord : néant
                    474: ================================================================================
                    475: */
                    476: 
                    477: void
                    478: instruction_clrcntxt(struct_processus *s_etat_processus)
                    479: {
                    480:    struct_liste_chainee                *l_element_courant;
                    481:    struct_liste_chainee                *l_element_suivant;
                    482: 
                    483:    (*s_etat_processus).erreur_execution = d_ex;
                    484: 
                    485:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    486:    {
                    487:        printf("\n  CLCNTXT ");
                    488: 
                    489:        if ((*s_etat_processus).langue == 'F')
                    490:        {
                    491:            printf("(effacement des contextes)\n\n");
                    492:            printf("  Aucun argument\n");
                    493:        }
                    494:        else
                    495:        {
                    496:            printf("(clear contexts)\n\n");
                    497:            printf("  No argument\n");
                    498:        }
                    499: 
                    500:        return;
                    501:    }
                    502:    else if ((*s_etat_processus).test_instruction == 'Y')
                    503:    {
                    504:        (*s_etat_processus).nombre_arguments = -1;
                    505:        return;
                    506:    }
                    507: 
                    508:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    509:    {
                    510:        if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
                    511:        {
                    512:            return;
                    513:        }
                    514:    }
                    515: 
                    516:    l_element_courant = (*s_etat_processus).l_base_pile_contextes;
                    517: 
                    518:    while(l_element_courant != NULL)
                    519:    {
                    520:        l_element_suivant = (*l_element_courant).suivant;
                    521:        liberation(s_etat_processus, (*l_element_courant).donnee);
                    522:        free(l_element_courant);
                    523:        l_element_courant = l_element_suivant;
                    524:    }
                    525: 
                    526:    (*s_etat_processus).l_base_pile_contextes = NULL;
                    527: 
                    528:    return;
                    529: }
                    530: 
                    531: 
                    532: /*
                    533: ================================================================================
                    534:   Fonction 'continue'
                    535: ================================================================================
                    536:   Entrées :
                    537: --------------------------------------------------------------------------------
                    538:   Sorties :
                    539: --------------------------------------------------------------------------------
                    540:   Effets de bord : néant
                    541: ================================================================================
                    542: */
                    543: 
                    544: void
                    545: instruction_continue(struct_processus *s_etat_processus)
                    546: {
                    547:    struct_liste_chainee        *l_element_courant;
                    548: 
                    549:    struct_objet                *s_objet;
                    550: 
                    551:    (*s_etat_processus).erreur_execution = d_ex;
                    552: 
                    553:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    554:    {
                    555:        printf("\n  CONTINUE ");
                    556: 
                    557:        if ((*s_etat_processus).langue == 'F')
                    558:        {
                    559:            printf("(relance d'un processus suspendu)\n\n");
                    560:        }
                    561:        else
                    562:        {
                    563:            printf("(continue a pending process)\n\n");
                    564:        }
                    565: 
                    566:        printf("    1: %s\n", d_PRC);
                    567: 
                    568:        return;
                    569:    }
                    570:    else if ((*s_etat_processus).test_instruction == 'Y')
                    571:    {
                    572:        (*s_etat_processus).nombre_arguments = -1;
                    573:        return;
                    574:    }
                    575:    
                    576:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    577:    {
                    578:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    579:        {
                    580:            return;
                    581:        }
                    582:    }
                    583: 
                    584:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    585:            &s_objet) == d_erreur)
                    586:    {
                    587:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    588:        return;
                    589:    }
                    590: 
                    591:    if ((*s_objet).type == PRC)
                    592:    {
                    593:        if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
                    594:        {
                    595:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    596:        }
                    597:        else
                    598:        {
                    599:            l_element_courant = (struct_liste_chainee *)
                    600:                    (*s_etat_processus).l_base_pile_processus;
                    601: 
                    602:            while(l_element_courant != NULL)
                    603:            {
                    604:                if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
                    605:                        .processus_detache == d_vrai)
                    606:                {
                    607:                    if ((*(*((struct_processus_fils *) (*s_objet).objet))
                    608:                            .thread).pid == (*(*((struct_processus_fils *)
                    609:                            (*(*l_element_courant).donnee).objet)).thread).pid)
                    610:                    {
1.30      bertrand  611:                        if (envoi_signal_processus(
                    612:                                (*(*((struct_processus_fils *)
                    613:                                (*s_objet).objet)).thread).pid, rpl_sigcont)
                    614:                                != 0)
1.1       bertrand  615:                        {
                    616:                            // Le processus est peut-être dans l'état zombie.
                    617:                        }
                    618: 
                    619:                        break;
                    620:                    }
                    621:                }
                    622:                else
                    623:                {
                    624:                    if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
                    625:                            (*s_objet).objet)).thread).mutex)) != 0)
                    626:                    {
                    627:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                    628:                        return;
                    629:                    }
                    630: 
                    631:                    if ((*(*((struct_processus_fils *)
                    632:                            (*s_objet).objet)).thread).thread_actif == d_vrai)
                    633:                    {
                    634:                        if (((pthread_equal((*(*((struct_processus_fils *)
                    635:                                (*s_objet).objet)).thread).tid,
                    636:                                (*(*((struct_processus_fils *)
                    637:                                (*(*l_element_courant).donnee).objet)).thread)
                    638:                                .tid) != 0)) && ((*(*((struct_processus_fils *)
                    639:                                (*s_objet).objet)).thread).pid ==
                    640:                                (*(*((struct_processus_fils *)
                    641:                                (*(*l_element_courant).donnee).objet)).thread)
                    642:                                .pid))
                    643:                        {
1.30      bertrand  644:                            if (envoi_signal_thread(
                    645:                                    (*(*((struct_processus_fils *)
                    646:                                    (*s_objet).objet)).thread).tid, rpl_sigcont)
1.1       bertrand  647:                                    != 0)
                    648:                            {
                    649:                                // Le thread est peut-être dans l'état zombie.
                    650:                            }
                    651: 
                    652:                            if (pthread_mutex_unlock(
                    653:                                    &((*(*((struct_processus_fils *)
                    654:                                    (*s_objet).objet)).thread).mutex)) != 0)
                    655:                            {
                    656:                                (*s_etat_processus).erreur_systeme =
                    657:                                        d_es_processus;
                    658:                                return;
                    659:                            }
                    660: 
                    661:                            break;
                    662:                        }
                    663:                    }
                    664: 
                    665:                    if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
                    666:                            (*s_objet).objet)).thread).mutex)) != 0)
                    667:                    {
                    668:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                    669:                        return;
                    670:                    }
                    671:                }
                    672: 
                    673:                l_element_courant = (*l_element_courant).suivant;
                    674:            }
                    675: 
                    676:            if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
                    677:            {
                    678:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    679:            }
                    680:        }
                    681:    }
                    682:    else
                    683:    {
                    684:        liberation(s_etat_processus, s_objet);
                    685: 
                    686:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    687:        return;
                    688:    }
                    689: 
                    690:    liberation(s_etat_processus, s_objet);
                    691: 
                    692:    return;
                    693: }
                    694: 
                    695: 
                    696: /*
                    697: ================================================================================
                    698:   Fonction 'cstop'
                    699: ================================================================================
                    700:   Entrées :
                    701: --------------------------------------------------------------------------------
                    702:   Sorties :
                    703: --------------------------------------------------------------------------------
                    704:   Effets de bord : néant
                    705: ================================================================================
                    706: */
                    707: 
                    708: void
                    709: instruction_cstop(struct_processus *s_etat_processus)
                    710: {
                    711:    (*s_etat_processus).erreur_execution = d_ex;
                    712: 
                    713:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    714:    {
                    715:        printf("\n  CSTOP ");
                    716: 
                    717:        if ((*s_etat_processus).langue == 'F')
                    718:        {
                    719:            printf("(capture du signal stop)\n\n");
                    720:            printf("  Aucun argument\n");
                    721:        }
                    722:        else
                    723:        {
                    724:            printf("(catch stop signal)\n\n");
                    725:            printf("  No argument\n");
                    726:        }
                    727: 
                    728:        return;
                    729:    }
                    730:    else if ((*s_etat_processus).test_instruction == 'Y')
                    731:    {
                    732:        (*s_etat_processus).nombre_arguments = -1;
                    733:        return;
                    734:    }
                    735:    
                    736:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    737:    {
                    738:        if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
                    739:        {
                    740:            return;
                    741:        }
                    742:    }
                    743: 
                    744:    if ((*s_etat_processus).var_volatile_traitement_retarde_stop == 0)
                    745:    {
                    746:        (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
                    747:    }
                    748:    else
                    749:    {
                    750:        (*s_etat_processus).erreur_execution = d_ex_stop;
                    751:    }
                    752: 
                    753:    return;
                    754: }
                    755: 
                    756: 
                    757: /*
                    758: ================================================================================
                    759:   Fonction 'clrfuse'
                    760: ================================================================================
                    761:   Entrées :
                    762: --------------------------------------------------------------------------------
                    763:   Sorties :
                    764: --------------------------------------------------------------------------------
                    765:   Effets de bord : néant
                    766: ================================================================================
                    767: */
                    768: 
                    769: void
                    770: instruction_clrfuse(struct_processus *s_etat_processus)
                    771: {
                    772:    (*s_etat_processus).erreur_execution = d_ex;
                    773: 
                    774:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    775:    {
                    776:        printf("\n  CLRFUSE ");
                    777: 
                    778:        if ((*s_etat_processus).langue == 'F')
                    779:        {
                    780:            printf("(libère un fusible)\n\n");
                    781:            printf("  Aucun argument\n");
                    782:        }
                    783:        else
                    784:        {
                    785:            printf("(release fuse signal)\n\n");
                    786:            printf("  No argument\n");
                    787:        }
                    788: 
                    789:        return;
                    790:    }
                    791:    else if ((*s_etat_processus).test_instruction == 'Y')
                    792:    {
                    793:        (*s_etat_processus).nombre_arguments = -1;
                    794:        return;
                    795:    }
                    796:    
                    797:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    798:    {
                    799:        if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
                    800:        {
                    801:            return;
                    802:        }
                    803:    }
                    804: 
                    805:    if ((*s_etat_processus).presence_fusible == d_faux)
                    806:    {
                    807:        (*s_etat_processus).erreur_execution = d_ex_fusible;
                    808:        return;
                    809:    }
                    810: 
                    811:    if (pthread_cancel((*s_etat_processus).thread_fusible) != 0)
                    812:    {
                    813:        if ((*s_etat_processus).var_volatile_requete_arret == 0)
                    814:        {
                    815:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    816:            return;
                    817:        }
                    818:    }
                    819: 
                    820:    (*s_etat_processus).thread_fusible = 0;
                    821:    (*s_etat_processus).presence_fusible = d_faux;
                    822: 
                    823:    return;
                    824: }
                    825: 
                    826: 
                    827: /*
                    828: ================================================================================
                    829:   Fonction 'crtab'
                    830: ================================================================================
                    831:   Entrées :
                    832: --------------------------------------------------------------------------------
                    833:   Sorties :
                    834: --------------------------------------------------------------------------------
                    835:   Effets de bord : néant
                    836: ================================================================================
                    837: */
                    838: 
                    839: void
                    840: instruction_crtab(struct_processus *s_etat_processus)
                    841: {
                    842:    struct_liste_chainee    *l_element_courant;
                    843: 
                    844:    struct_objet            *s_objet_argument;
                    845:    struct_objet            *s_objet_resultat;
                    846: 
                    847:    struct_objet *
                    848:    creation_table(struct_liste_chainee *dimensions)
                    849:    {
                    850:        struct_objet        *s_table;
                    851: 
                    852:        unsigned long       i;
                    853: 
                    854:        if ((s_table = allocation(s_etat_processus, TBL)) == NULL)
                    855:        {
                    856:            return(NULL);
                    857:        }
                    858: 
                    859:        (*((struct_tableau *) (*s_table).objet)).nombre_elements =
                    860:                (unsigned long) (*((integer8 *) (*(*dimensions).donnee).objet));
                    861: 
                    862:        dimensions = (*dimensions).suivant;
                    863: 
                    864:        if (((*((struct_tableau *) (*s_table).objet)).elements =
                    865:                malloc((*((struct_tableau *) (*s_table).objet))
                    866:                .nombre_elements * sizeof(struct_objet *))) == NULL)
                    867:        {
                    868:            return(NULL);
                    869:        }
                    870: 
                    871:        if (dimensions == NULL)
                    872:        {
                    873:            for(i = 0; i < (*((struct_tableau *) (*s_table).objet))
                    874:                    .nombre_elements; i++)
                    875:            {
                    876:                if (((*((struct_tableau *) (*s_table).objet)).elements[i] =
                    877:                        allocation(s_etat_processus, LST)) == NULL)
                    878:                {
                    879:                    return(NULL);
                    880:                }
                    881:            }
                    882:        }
                    883:        else
                    884:        {
                    885:            for(i = 0; i < (*((struct_tableau *) (*s_table).objet))
                    886:                    .nombre_elements; i++)
                    887:            {
                    888:                if (((*((struct_tableau *) (*s_table).objet)).elements[i] =
                    889:                        creation_table(dimensions)) == NULL)
                    890:                {
                    891:                    return(NULL);
                    892:                }
                    893:            }
                    894:        }
                    895: 
                    896:        return(s_table);
                    897:    }
                    898: 
                    899:    (*s_etat_processus).erreur_execution = d_ex;
                    900: 
                    901:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    902:    {
                    903:        printf("\n  CRTAB ");
                    904: 
                    905:        if ((*s_etat_processus).langue == 'F')
                    906:        {
                    907:            printf("(création d'une table régulière)\n\n");
                    908:        }
                    909:        else
                    910:        {
                    911:            printf("(create a regular table)\n\n");
                    912:        }
                    913: 
                    914:        printf("    1: %s\n", d_LST);
                    915:        printf("->  1: %s\n", d_TAB);
                    916: 
                    917:        return;
                    918:    }
                    919:    else if ((*s_etat_processus).test_instruction == 'Y')
                    920:    {
                    921:        (*s_etat_processus).nombre_arguments = -1;
                    922:        return;
                    923:    }
                    924: 
                    925:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    926:    {
                    927:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    928:        {
                    929:            return;
                    930:        }
                    931:    }
                    932: 
                    933:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    934:            &s_objet_argument) == d_erreur)
                    935:    {
                    936:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    937:        return;
                    938:    }
                    939: 
                    940:    if ((*s_objet_argument).type == LST)
                    941:    {
                    942:        l_element_courant = (*s_objet_argument).objet;
                    943: 
                    944:        if (l_element_courant == NULL)
                    945:        {
                    946:            liberation(s_etat_processus, s_objet_argument);
                    947: 
                    948:            (*s_etat_processus).erreur_execution =
                    949:                    d_ex_argument_invalide;
                    950:            return;
                    951:        }
                    952: 
                    953:        while(l_element_courant != NULL)
                    954:        {
                    955:            if ((*(*l_element_courant).donnee).type != INT)
                    956:            {
                    957:                liberation(s_etat_processus, s_objet_argument);
                    958: 
                    959:                (*s_etat_processus).erreur_execution =
                    960:                        d_ex_erreur_type_argument;
                    961:                return;
                    962:            }
                    963: 
                    964:            l_element_courant = (*l_element_courant).suivant;
                    965:        }
                    966: 
                    967:        if ((s_objet_resultat =
                    968:                creation_table((*s_objet_argument).objet)) == NULL)
                    969:        {
                    970:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    971:            return;
                    972:        }
                    973:    }
                    974:    else
                    975:    {
                    976:        liberation(s_etat_processus, s_objet_argument);
                    977: 
                    978:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    979:        return;
                    980:    }
                    981: 
                    982:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    983:            s_objet_resultat) == d_erreur)
                    984:    {
                    985:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    986:        return;
                    987:    }
                    988: 
                    989:    liberation(s_etat_processus, s_objet_argument);
                    990: 
                    991:    return;
                    992: }
                    993: 
                    994: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>