File:  [local] / rpl / src / instructions_m4.c
Revision 1.43: download - view: text, annotated - select for diffs - revision graph
Mon May 21 17:25:44 2012 UTC (11 years, 11 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_9, HEAD
En route vers la 4.1.9.

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

CVSweb interface <joel.bertrand@systella.fr>