Annotation of rpl/src/instructions_m4.c, revision 1.14

1.1       bertrand    1: /*
                      2: ================================================================================
1.14    ! bertrand    3:   RPL/2 (R) version 4.0.19
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.12      bertrand   23: #include "rpl-conv.h"
1.1       bertrand   24: 
                     25: 
                     26: /*
                     27: ================================================================================
                     28:   Fonction 'mem'
                     29: ================================================================================
                     30:   Entrées :
                     31: --------------------------------------------------------------------------------
                     32:   Sorties :
                     33: --------------------------------------------------------------------------------
                     34:   Effets de bord : néant
                     35: ================================================================================
                     36: */
                     37: 
                     38: void
                     39: instruction_mem(struct_processus *s_etat_processus)
                     40: {
                     41:    struct_liste_chainee    *l_element_courant;
                     42: 
                     43:    struct_objet            *s_objet_resultat;
                     44: 
                     45:    unsigned long           i;
                     46: 
                     47:    (*s_etat_processus).erreur_execution = d_ex;
                     48: 
                     49:    if ((*s_etat_processus).affichage_arguments == 'Y')
                     50:    {
                     51:        printf("\n  MEM ");
                     52: 
                     53:        if ((*s_etat_processus).langue == 'F')
                     54:        {
                     55:            printf("(mémoire occupée)\n\n");
                     56:        }
                     57:        else
                     58:        {
                     59:            printf("(used memory)\n\n");
                     60:        }
                     61: 
                     62:        printf("->  1: %s\n", d_LST);
                     63: 
                     64:        return;
                     65:    }
                     66:    else if ((*s_etat_processus).test_instruction == 'Y')
                     67:    {
                     68:        (*s_etat_processus).nombre_arguments = -1;
                     69:        return;
                     70:    }
                     71: 
                     72:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                     73:    {
                     74:        if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
                     75:        {
                     76:            return;
                     77:        }
                     78:    }
                     79: 
                     80:    if ((s_objet_resultat = allocation(s_etat_processus, LST))
                     81:            == NULL)
                     82:    {
                     83:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                     84:        return;
                     85:    }
                     86: 
                     87:    if (((*s_objet_resultat).objet =
                     88:                allocation_maillon(s_etat_processus)) == NULL)
                     89:    {
                     90:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                     91:        return;
                     92:    }
                     93: 
                     94:    if (((*((struct_liste_chainee *) (*s_objet_resultat).objet)).donnee =
                     95:            allocation(s_etat_processus, INT)) == NULL)
                     96:    {
                     97:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                     98:        return;
                     99:    }
                    100: 
                    101:    /*
                    102:     * Décompte de la mémoire utilisée dans la pile
                    103:     */
                    104: 
                    105:    (*((integer8 *) (*((*((struct_liste_chainee *) (*s_objet_resultat).objet))
                    106:            .donnee)).objet)) = 0;
                    107: 
                    108:    l_element_courant = (*s_etat_processus).l_base_pile;
                    109: 
                    110:    while(l_element_courant != NULL)
                    111:    {
                    112:        (*((integer8 *) (*((*((struct_liste_chainee *) (*s_objet_resultat)
                    113:                .objet)).donnee)).objet)) += occupation_memoire(
                    114:                (*l_element_courant).donnee);
                    115:        l_element_courant = (*l_element_courant).suivant;
                    116:    }
                    117: 
                    118:    /*
                    119:     * Décompte de la mémoire utilisée pour les différentes variables
                    120:     */
                    121: 
                    122:    if (((*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant
                    123:            = allocation_maillon(s_etat_processus)) == NULL)
                    124:    {
                    125:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    126:        return;
                    127:    }
                    128: 
                    129:    if (((*((*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant))
                    130:            .donnee = allocation(s_etat_processus, INT)) == NULL)
                    131:    {
                    132:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    133:        return;
                    134:    }
                    135: 
                    136:    (*((*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant))
                    137:            .suivant = NULL;
                    138: 
                    139:    (*((integer8 *) (*((*((*((struct_liste_chainee *)
                    140:            (*s_objet_resultat).objet)).suivant)).donnee)).objet)) = 0;
                    141: 
                    142:    for(i = 0; i < (*s_etat_processus).nombre_variables; i++)
                    143:    {
                    144:        (*((integer8 *) (*((*((*((struct_liste_chainee *) (*s_objet_resultat)
                    145:                .objet)).suivant)).donnee)).objet)) += sizeof(unsigned char) *
                    146:                strlen((*s_etat_processus).s_liste_variables[i].nom);
                    147:        (*((integer8 *) (*((*((*((struct_liste_chainee *) (*s_objet_resultat)
                    148:                .objet)).suivant)).donnee)).objet)) += occupation_memoire(
                    149:                (*s_etat_processus).s_liste_variables[i].objet);
                    150:    }
                    151: 
                    152:    for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++)
                    153:    {
                    154:        // Comptabilisation des empreintes mémoire des variables
                    155:        // statiques qui ne sont pas accessibles, les variables statiques
                    156:        // accessibles étant déjà comptabilitées par la boucle précédente.
                    157: 
                    158:        if ((*s_etat_processus).s_liste_variables_statiques[i].objet != NULL)
                    159:        {
                    160:            (*((integer8 *) (*((*((*((struct_liste_chainee *)
                    161:                    (*s_objet_resultat).objet)).suivant)).donnee)).objet)) +=
                    162:                    sizeof(unsigned char) * strlen((*s_etat_processus)
                    163:                    .s_liste_variables_statiques[i].nom);
                    164:            (*((integer8 *) (*((*((*((struct_liste_chainee *)
                    165:                    (*s_objet_resultat).objet)).suivant)).donnee)).objet)) +=
                    166:                    occupation_memoire((*s_etat_processus)
                    167:                    .s_liste_variables_statiques[i].objet);
                    168:        }
                    169:    }
                    170: 
                    171:    for(i = 0; i < (*(*s_etat_processus).s_liste_variables_partagees)
                    172:            .nombre_variables; i++)
                    173:    {
                    174:        (*((integer8 *) (*((*((*((struct_liste_chainee *)
                    175:                (*s_objet_resultat).objet)).suivant)).donnee)).objet)) +=
                    176:                sizeof(unsigned char) * strlen((*(*s_etat_processus)
                    177:                .s_liste_variables_partagees).table[i].nom);
                    178:        (*((integer8 *) (*((*((*((struct_liste_chainee *)
                    179:                (*s_objet_resultat).objet)).suivant)).donnee)).objet)) +=
                    180:                occupation_memoire((*(*s_etat_processus)
                    181:                .s_liste_variables_partagees).table[i].objet);
                    182:    }
                    183: 
                    184:    /*
                    185:     * Empilement du résultat
                    186:     */
                    187: 
                    188:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    189:            s_objet_resultat) == d_erreur)
                    190:    {
                    191:        return;
                    192:    }
                    193: 
                    194:    return;
                    195: }
                    196: 
                    197: 
                    198: /*
                    199: ================================================================================
                    200:   Fonction 'mclrin'
                    201: ================================================================================
                    202:   Entrées :
                    203: --------------------------------------------------------------------------------
                    204:   Sorties :
                    205: --------------------------------------------------------------------------------
                    206:   Effets de bord : néant
                    207: ================================================================================
                    208: */
                    209: 
                    210: void
                    211: instruction_mclrin(struct_processus *s_etat_processus)
                    212: {
                    213:    logical1                    last_valide;
                    214: 
                    215:    struct_liste_chainee        *l_liste;
                    216: 
                    217:    struct_objet                *s_objet;
                    218: 
                    219:    (*s_etat_processus).erreur_execution = d_ex;
                    220: 
                    221:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    222:    {
                    223:        printf("\n  MCLRIN ");
                    224: 
                    225:        if ((*s_etat_processus).langue == 'F')
                    226:        {
                    227:            printf("(série de MacLaurin)\n\n");
                    228:        }
                    229:        else
                    230:        {
                    231:            printf("(MacLaurin serie)\n\n");
                    232:        }
                    233: 
                    234:        printf("    3: %s\n", d_ALG);
                    235:        printf("    2: %s\n", d_NOM);
                    236:        printf("    1: %s\n", d_INT);
                    237:        printf("->  1: %s\n", d_ALG);
                    238: 
                    239:        return;
                    240:    }
                    241:    else if ((*s_etat_processus).test_instruction == 'Y')
                    242:    {
                    243:        (*s_etat_processus).nombre_arguments = -1;
                    244:        return;
                    245:    }
                    246: 
                    247:    if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
                    248:    {
                    249:        if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
                    250:        {
                    251:            return;
                    252:        }
                    253:    }
                    254: 
                    255:    if ((*s_etat_processus).hauteur_pile_operationnelle < 3)
                    256:    {
                    257:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    258:        return;
                    259:    }
                    260: 
                    261:    if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
                    262:    {
                    263:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    264:        return;
                    265:    }
                    266: 
                    267:    (*((integer8 *) (*s_objet).objet)) = 0;
                    268: 
                    269:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    270:            s_objet) == d_erreur)
                    271:    {
                    272:        return;
                    273:    }
                    274: 
                    275:    l_liste = (*s_etat_processus).l_base_pile;
                    276:    (*s_etat_processus).l_base_pile = (*l_liste).suivant;
                    277:    (*l_liste).suivant = (*(*s_etat_processus).l_base_pile).suivant;
                    278:    (*(*s_etat_processus).l_base_pile).suivant = l_liste;
                    279: 
                    280:    if (last_valide == d_vrai)
                    281:    {
                    282:        cf(s_etat_processus, 31);
                    283:    }
                    284: 
                    285:    instruction_taylr(s_etat_processus);
                    286: 
                    287:    if (last_valide == d_vrai)
                    288:    {
                    289:        sf(s_etat_processus, 31);
                    290:    }
                    291: 
                    292:    return;
                    293: }
                    294: 
                    295: 
                    296: /*
                    297: ================================================================================
                    298:   Fonction 'mtxlock'
                    299: ================================================================================
                    300:   Entrées :
                    301: --------------------------------------------------------------------------------
                    302:   Sorties :
                    303: --------------------------------------------------------------------------------
                    304:   Effets de bord : néant
                    305: ================================================================================
                    306: */
                    307: 
                    308: void
                    309: instruction_mtxlock(struct_processus *s_etat_processus)
                    310: {
                    311:    struct_liste_chainee        *l_element_courant;
                    312: 
                    313:    struct_objet                *s_objet_argument;
                    314: 
                    315:    unsigned char               *tampon;
                    316: 
                    317:    (*s_etat_processus).erreur_execution = d_ex;
                    318: 
                    319:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    320:    {
                    321:        printf("\n  MTXLOCK ");
                    322: 
                    323:        if ((*s_etat_processus).langue == 'F')
                    324:        {
                    325:            printf("(verrouille un mutex)\n\n");
                    326:        }
                    327:        else
                    328:        {
                    329:            printf("(lock mutex)\n\n");
                    330:        }
                    331: 
                    332:        printf("    1: %s\n", d_MTX);
                    333: 
                    334:        return;
                    335:    }
                    336:    else if ((*s_etat_processus).test_instruction == 'Y')
                    337:    {
                    338:        (*s_etat_processus).nombre_arguments = -1;
                    339:        return;
                    340:    }
                    341: 
                    342:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    343:    {
                    344:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    345:        {
                    346:            return;
                    347:        }
                    348:    }
                    349: 
                    350:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    351:            &s_objet_argument) == d_erreur)
                    352:    {
                    353:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    354:        return;
                    355:    }
                    356: 
                    357:    if ((*s_objet_argument).type == MTX)
                    358:    {
                    359:        l_element_courant = (*s_etat_processus).liste_mutexes;
                    360: 
                    361:        while(l_element_courant != NULL)
                    362:        {
                    363:            if (&((*((struct_mutex *) (*(*l_element_courant).donnee).objet))
                    364:                    .mutex) == &((*((struct_mutex *) (*s_objet_argument).objet))
                    365:                    .mutex))
                    366:            {
                    367:                break;
                    368:            }
                    369: 
                    370:            l_element_courant = (*l_element_courant).suivant;
                    371:        }
                    372: 
                    373:        if (l_element_courant == NULL)
                    374:        {
                    375:            (*s_etat_processus).erreur_execution = d_ex_mutex;
                    376: 
                    377:            liberation(s_etat_processus, s_objet_argument);
                    378:            return;
                    379:        }
                    380: 
                    381:        if ((*s_etat_processus).profilage == d_vrai)
                    382:        {
                    383:            if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
                    384:                    == NULL)
                    385:            {
                    386:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    387:                return;
                    388:            }
                    389: 
                    390:            profilage(s_etat_processus, tampon);
                    391:            free(tampon);
                    392: 
                    393:            if ((*s_etat_processus).erreur_systeme != d_es)
                    394:            {
                    395:                return;
                    396:            }
                    397:        }
                    398: 
1.7       bertrand  399: #      ifndef SEMAPHORES_NOMMES
1.1       bertrand  400:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    401:        {
                    402:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    403:            return;
                    404:        }
1.7       bertrand  405: #      else
                    406:        if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    407:        {
                    408:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    409:            return;
                    410:        }
                    411: #      endif
1.1       bertrand  412: 
                    413:        if (pthread_mutex_lock(&((*((struct_mutex *) (*s_objet_argument).objet))
                    414:                .mutex)) != 0)
                    415:        {
1.7       bertrand  416: #          ifndef SEMAPHORES_NOMMES
1.1       bertrand  417:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  418: #          else
                    419:            while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    420: #          endif
1.1       bertrand  421:            {
                    422:                if ((*s_etat_processus).profilage == d_vrai)
                    423:                {
                    424:                    profilage(s_etat_processus, NULL);
                    425:                }
                    426: 
                    427:                if (errno != EINTR)
                    428:                {
                    429:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                    430:                    return;
                    431:                }
                    432:            }
                    433: 
                    434:            liberation(s_etat_processus, s_objet_argument);
                    435: 
                    436:            if ((*s_etat_processus).profilage == d_vrai)
                    437:            {
                    438:                profilage(s_etat_processus, NULL);
                    439:            }
                    440: 
                    441:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    442:            return;
                    443:        }
                    444: 
1.7       bertrand  445: #      ifndef SEMAPHORES_NOMMES
1.1       bertrand  446:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  447: #      else
                    448:        while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    449: #      endif
1.1       bertrand  450:        {
                    451:            if (errno != EINTR)
                    452:            {
                    453:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    454:                return;
                    455:            }
                    456:        }
                    457: 
                    458:        if ((*s_etat_processus).profilage == d_vrai)
                    459:        {
                    460:            profilage(s_etat_processus, NULL);
                    461:        }
                    462:    }
                    463:    else
                    464:    {
                    465:        liberation(s_etat_processus, s_objet_argument);
                    466: 
                    467:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    468:        return;
                    469:    }
                    470: 
                    471:    liberation(s_etat_processus, s_objet_argument);
                    472: 
                    473:    return;
                    474: }
                    475: 
                    476: 
                    477: /*
                    478: ================================================================================
                    479:   Fonction 'mtxtrylock'
                    480: ================================================================================
                    481:   Entrées :
                    482: --------------------------------------------------------------------------------
                    483:   Sorties :
                    484: --------------------------------------------------------------------------------
                    485:   Effets de bord : néant
                    486: ================================================================================
                    487: */
                    488: 
                    489: void
                    490: instruction_mtxtrylock(struct_processus *s_etat_processus)
                    491: {
                    492:    int                         ios;
                    493: 
                    494:    struct_liste_chainee        *l_element_courant;
                    495: 
                    496:    struct_objet                *s_objet_argument;
                    497:    struct_objet                *s_objet_resultat;
                    498: 
                    499:    unsigned char               *tampon;
                    500: 
                    501:    (*s_etat_processus).erreur_execution = d_ex;
                    502: 
                    503:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    504:    {
                    505:        printf("\n  MTXTRYLOCK ");
                    506: 
                    507:        if ((*s_etat_processus).langue == 'F')
                    508:        {
                    509:            printf("(essai de verrouillage du mutex)\n\n");
                    510:        }
                    511:        else
                    512:        {
                    513:            printf("(try to lock mutex)\n\n");
                    514:        }
                    515: 
                    516:        printf("    1: %s\n", d_MTX);
                    517:        printf("->  1: %s\n", d_INT);
                    518: 
                    519:        return;
                    520:    }
                    521:    else if ((*s_etat_processus).test_instruction == 'Y')
                    522:    {
                    523:        (*s_etat_processus).nombre_arguments = -1;
                    524:        return;
                    525:    }
                    526: 
                    527:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    528:    {
                    529:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    530:        {
                    531:            return;
                    532:        }
                    533:    }
                    534: 
                    535:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    536:            &s_objet_argument) == d_erreur)
                    537:    {
                    538:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    539:        return;
                    540:    }
                    541: 
                    542:    if ((*s_objet_argument).type == MTX)
                    543:    {
                    544:        l_element_courant = (*s_etat_processus).liste_mutexes;
                    545: 
                    546:        while(l_element_courant != NULL)
                    547:        {
                    548:            if (&((*((struct_mutex *) (*(*l_element_courant).donnee).objet))
                    549:                    .mutex) == &((*((struct_mutex *) (*s_objet_argument).objet))
                    550:                    .mutex))
                    551:            {
                    552:                break;
                    553:            }
                    554: 
                    555:            l_element_courant = (*l_element_courant).suivant;
                    556:        }
                    557: 
                    558:        if (l_element_courant == NULL)
                    559:        {
                    560:            (*s_etat_processus).erreur_execution = d_ex_mutex;
                    561: 
                    562:            liberation(s_etat_processus, s_objet_argument);
                    563:            return;
                    564:        }
                    565: 
                    566:        if ((*s_etat_processus).profilage == d_vrai)
                    567:        {
                    568:            if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
                    569:                    == NULL)
                    570:            {
                    571:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    572:                return;
                    573:            }
                    574: 
                    575:            profilage(s_etat_processus, tampon);
                    576:            free(tampon);
                    577: 
                    578:            if ((*s_etat_processus).erreur_systeme != d_es)
                    579:            {
                    580:                return;
                    581:            }
                    582:        }
                    583: 
                    584:        if ((ios = pthread_mutex_trylock(&((*((struct_mutex *)
                    585:                (*s_objet_argument).objet)).mutex))) != 0)
                    586:        {
                    587:            if (ios != EBUSY)
                    588:            {
                    589:                liberation(s_etat_processus, s_objet_argument);
                    590: 
                    591:                if ((*s_etat_processus).profilage == d_vrai)
                    592:                {
                    593:                    profilage(s_etat_processus, NULL);
                    594:                }
                    595: 
                    596:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    597:                return;
                    598:            }
                    599:        }
                    600: 
                    601:        if ((*s_etat_processus).profilage == d_vrai)
                    602:        {
                    603:            profilage(s_etat_processus, NULL);
                    604:        }
                    605:    }
                    606:    else
                    607:    {
                    608:        liberation(s_etat_processus, s_objet_argument);
                    609: 
                    610:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    611:        return;
                    612:    }
                    613: 
                    614:    liberation(s_etat_processus, s_objet_argument);
                    615: 
                    616:    if ((s_objet_resultat = allocation(s_etat_processus, INT))
                    617:            == NULL)
                    618:    {
                    619:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    620:        return;
                    621:    }
                    622: 
                    623:    (*((integer8 *) (*s_objet_resultat).objet)) = (ios == 0) ? 0 : -1;
                    624: 
                    625:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    626:            s_objet_resultat) == d_erreur)
                    627:    {
                    628:        return;
                    629:    }
                    630: 
                    631:    return;
                    632: }
                    633: 
                    634: /*
                    635: ================================================================================
                    636:   Fonction 'mtxstatus'
                    637: ================================================================================
                    638:   Entrées :
                    639: --------------------------------------------------------------------------------
                    640:   Sorties :
                    641: --------------------------------------------------------------------------------
                    642:   Effets de bord : néant
                    643: ================================================================================
                    644: */
                    645: 
                    646: void
                    647: instruction_mtxstatus(struct_processus *s_etat_processus)
                    648: {
                    649:    int                         ios;
                    650: 
                    651:    struct_liste_chainee        *l_element_courant;
                    652: 
                    653:    struct_objet                *s_objet_argument;
                    654:    struct_objet                *s_objet_resultat;
                    655: 
                    656:    unsigned char               *tampon;
                    657: 
                    658:    (*s_etat_processus).erreur_execution = d_ex;
                    659: 
                    660:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    661:    {
                    662:        printf("\n  MTXSTATUS ");
                    663: 
                    664:        if ((*s_etat_processus).langue == 'F')
                    665:        {
                    666:            printf("(statut du mutex)\n\n");
                    667:        }
                    668:        else
                    669:        {
                    670:            printf("(mutex status)\n\n");
                    671:        }
                    672: 
                    673:        printf("    1: %s\n", d_MTX);
                    674:        printf("->  1: %s\n", d_INT);
                    675: 
                    676:        return;
                    677:    }
                    678:    else if ((*s_etat_processus).test_instruction == 'Y')
                    679:    {
                    680:        (*s_etat_processus).nombre_arguments = -1;
                    681:        return;
                    682:    }
                    683: 
                    684:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    685:    {
                    686:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    687:        {
                    688:            return;
                    689:        }
                    690:    }
                    691: 
                    692:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    693:            &s_objet_argument) == d_erreur)
                    694:    {
                    695:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    696:        return;
                    697:    }
                    698: 
                    699:    if ((*s_objet_argument).type == MTX)
                    700:    {
                    701:        l_element_courant = (*s_etat_processus).liste_mutexes;
                    702: 
                    703:        while(l_element_courant != NULL)
                    704:        {
                    705:            if (&((*((struct_mutex *) (*(*l_element_courant).donnee).objet))
                    706:                    .mutex) == &((*((struct_mutex *) (*s_objet_argument).objet))
                    707:                    .mutex))
                    708:            {
                    709:                break;
                    710:            }
                    711: 
                    712:            l_element_courant = (*l_element_courant).suivant;
                    713:        }
                    714: 
                    715:        if (l_element_courant == NULL)
                    716:        {
                    717:            (*s_etat_processus).erreur_execution = d_ex_mutex;
                    718: 
                    719:            liberation(s_etat_processus, s_objet_argument);
                    720:            return;
                    721:        }
                    722: 
                    723:        if ((*s_etat_processus).profilage == d_vrai)
                    724:        {
                    725:            if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
                    726:                    == NULL)
                    727:            {
                    728:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    729:                return;
                    730:            }
                    731: 
                    732:            profilage(s_etat_processus, tampon);
                    733:            free(tampon);
                    734: 
                    735:            if ((*s_etat_processus).erreur_systeme != d_es)
                    736:            {
                    737:                return;
                    738:            }
                    739:        }
                    740: 
                    741:        if ((ios = pthread_mutex_trylock(&((*((struct_mutex *)
                    742:                (*s_objet_argument).objet)).mutex))) != 0)
                    743:        {
                    744:            if (ios != EBUSY)
                    745:            {
                    746:                liberation(s_etat_processus, s_objet_argument);
                    747: 
                    748:                if ((*s_etat_processus).profilage == d_vrai)
                    749:                {
                    750:                    profilage(s_etat_processus, NULL);
                    751:                }
                    752: 
                    753:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    754:                return;
                    755:            }
                    756:        }
                    757: 
                    758:        if (pthread_mutex_unlock(&((*((struct_mutex *)
                    759:                (*s_objet_argument).objet)).mutex)) != 0)
                    760:        {
                    761:            liberation(s_etat_processus, s_objet_argument);
                    762: 
                    763:            if ((*s_etat_processus).profilage == d_vrai)
                    764:            {
                    765:                profilage(s_etat_processus, NULL);
                    766:            }
                    767: 
                    768:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    769:            return;
                    770:        }
                    771: 
                    772:        if ((*s_etat_processus).profilage == d_vrai)
                    773:        {
                    774:            profilage(s_etat_processus, NULL);
                    775:        }
                    776:    }
                    777:    else
                    778:    {
                    779:        liberation(s_etat_processus, s_objet_argument);
                    780: 
                    781:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    782:        return;
                    783:    }
                    784: 
                    785:    liberation(s_etat_processus, s_objet_argument);
                    786: 
                    787:    if ((s_objet_resultat = allocation(s_etat_processus, INT))
                    788:            == NULL)
                    789:    {
                    790:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    791:        return;
                    792:    }
                    793: 
                    794:    (*((integer8 *) (*s_objet_resultat).objet)) = (ios == 0) ? 0 : -1;
                    795: 
                    796:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    797:            s_objet_resultat) == d_erreur)
                    798:    {
                    799:        return;
                    800:    }
                    801: 
                    802:    return;
                    803: }
                    804: 
                    805: 
                    806: /*
                    807: ================================================================================
                    808:   Fonction 'mtxunlock'
                    809: ================================================================================
                    810:   Entrées :
                    811: --------------------------------------------------------------------------------
                    812:   Sorties :
                    813: --------------------------------------------------------------------------------
                    814:   Effets de bord : néant
                    815: ================================================================================
                    816: */
                    817: 
                    818: void
                    819: instruction_mtxunlock(struct_processus *s_etat_processus)
                    820: {
                    821:    struct_liste_chainee        *l_element_courant;
                    822: 
                    823:    struct_objet                *s_objet_argument;
                    824: 
                    825:    (*s_etat_processus).erreur_execution = d_ex;
                    826: 
                    827:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    828:    {
                    829:        printf("\n  MTXUNLOCK ");
                    830: 
                    831:        if ((*s_etat_processus).langue == 'F')
                    832:        {
                    833:            printf("(déverrouille un mutex)\n\n");
                    834:        }
                    835:        else
                    836:        {
                    837:            printf("(unlock mutex)\n\n");
                    838:        }
                    839: 
                    840:        printf("    1: %s\n", d_MTX);
                    841: 
                    842:        return;
                    843:    }
                    844:    else if ((*s_etat_processus).test_instruction == 'Y')
                    845:    {
                    846:        (*s_etat_processus).nombre_arguments = -1;
                    847:        return;
                    848:    }
                    849: 
                    850:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    851:    {
                    852:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    853:        {
                    854:            return;
                    855:        }
                    856:    }
                    857: 
                    858:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    859:            &s_objet_argument) == d_erreur)
                    860:    {
                    861:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    862:        return;
                    863:    }
                    864: 
                    865:    if ((*s_objet_argument).type == MTX)
                    866:    {
                    867:        l_element_courant = (*s_etat_processus).liste_mutexes;
                    868: 
                    869:        while(l_element_courant != NULL)
                    870:        {
                    871:            if (&((*((struct_mutex *) (*(*l_element_courant).donnee).objet))
                    872:                    .mutex) == &((*((struct_mutex *) (*s_objet_argument).objet))
                    873:                    .mutex))
                    874:            {
                    875:                break;
                    876:            }
                    877: 
                    878:            l_element_courant = (*l_element_courant).suivant;
                    879:        }
                    880: 
                    881:        if (l_element_courant == NULL)
                    882:        {
                    883:            (*s_etat_processus).erreur_execution = d_ex_mutex;
                    884: 
                    885:            liberation(s_etat_processus, s_objet_argument);
                    886:            return;
                    887:        }
                    888: 
                    889:        if (pthread_mutex_trylock(&((*((struct_mutex *)
                    890:                (*s_objet_argument).objet)).mutex)) == EINVAL)
                    891:        {
                    892:            liberation(s_etat_processus, s_objet_argument);
                    893: 
                    894:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    895:            return;
                    896:        }
                    897: 
                    898:        if (pthread_mutex_unlock(&((*((struct_mutex *)
                    899:                (*s_objet_argument).objet)).mutex)) != 0)
                    900:        {
                    901:            liberation(s_etat_processus, s_objet_argument);
                    902: 
                    903:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    904:            return;
                    905:        }
                    906:    }
                    907:    else
                    908:    {
                    909:        liberation(s_etat_processus, s_objet_argument);
                    910: 
                    911:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    912:        return;
                    913:    }
                    914: 
                    915:    liberation(s_etat_processus, s_objet_argument);
                    916: 
                    917:    return;
                    918: }
                    919: 
                    920: 
                    921: /*
                    922: ================================================================================
                    923:   Fonction 'mark'
                    924: ================================================================================
                    925:   Entrées :
                    926: --------------------------------------------------------------------------------
                    927:   Sorties :
                    928: --------------------------------------------------------------------------------
                    929:   Effets de bord : néant
                    930: ================================================================================
                    931: */
                    932: 
                    933: void
                    934: instruction_mark(struct_processus *s_etat_processus)
                    935: {
                    936:    struct_marque               *marque;
                    937: 
                    938:    struct_objet                *s_objet_argument;
                    939:    struct_objet                *s_objet_label;
                    940: 
                    941:    (*s_etat_processus).erreur_execution = d_ex;
                    942: 
                    943:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    944:    {
                    945:        printf("\n  MARK ");
                    946: 
                    947:        if ((*s_etat_processus).langue == 'F')
                    948:        {
                    949:            printf("(ajoute une marque à un graphique)\n\n");
                    950:        }
                    951:        else
                    952:        {
                    953:            printf("(add mark to graph)\n\n");
                    954:        }
                    955: 
                    956:        printf("    2: %s\n", d_CHN);
                    957:        printf("    1: %s\n", d_CPL);
                    958: 
                    959:        return;
                    960:    }
                    961:    else if ((*s_etat_processus).test_instruction == 'Y')
                    962:    {
                    963:        (*s_etat_processus).nombre_arguments = -1;
                    964:        return;
                    965:    }
                    966: 
                    967:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    968:    {
                    969:        if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
                    970:        {
                    971:            return;
                    972:        }
                    973:    }
                    974: 
                    975:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    976:            &s_objet_argument) == d_erreur)
                    977:    {
                    978:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    979:        return;
                    980:    }
                    981: 
                    982:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    983:            &s_objet_label) == d_erreur)
                    984:    {
                    985:        liberation(s_etat_processus, s_objet_argument);
                    986: 
                    987:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    988:        return;
                    989:    }
                    990: 
                    991:    if (((*s_objet_argument).type == CPL) && ((*s_objet_label).type == CHN))
                    992:    {
                    993:        if ((marque = malloc(sizeof(struct_marque))) == NULL)
                    994:        {
                    995:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    996:            return;
                    997:        }
                    998: 
                    999:        if (((*marque).label = malloc((strlen((unsigned char *)
                   1000:                (*s_objet_label).objet) + 1) * sizeof(unsigned char))) == NULL)
                   1001:        {
                   1002:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1003:            return;
                   1004:        }
                   1005: 
                   1006:        sprintf((*marque).label, "%s",
                   1007:                (unsigned char *) (*s_objet_label).objet);
                   1008: 
                   1009:        if (((*marque).position = malloc(64 * sizeof(unsigned char))) == NULL)
                   1010:        {
                   1011:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1012:            return;
                   1013:        }
                   1014: 
                   1015:        sprintf((*marque).position, "%f,%f",
                   1016:                (*((complex16 *) (*s_objet_argument).objet)).partie_reelle,
                   1017:                (*((complex16 *) (*s_objet_argument).objet)).partie_imaginaire);
                   1018: 
                   1019:        (*marque).suivant = (*s_etat_processus).s_marques;
                   1020:        (*s_etat_processus).s_marques = marque;
                   1021: 
                   1022:        (*s_etat_processus).mise_a_jour_trace_requise = d_vrai;
                   1023:    }
                   1024:    else
                   1025:    {
                   1026:        liberation(s_etat_processus, s_objet_argument);
                   1027:        liberation(s_etat_processus, s_objet_label);
                   1028: 
                   1029:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1030:        return;
                   1031:    }
                   1032: 
                   1033:    liberation(s_etat_processus, s_objet_argument);
                   1034:    liberation(s_etat_processus, s_objet_label);
                   1035: 
                   1036:    return;
                   1037: }
                   1038: 
                   1039: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>