File:  [local] / rpl / src / instructions_m4.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Jan 26 15:22:45 2010 UTC (14 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Initial revision

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.9
    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: 
   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:     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: 
  399:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  400:         {
  401:             (*s_etat_processus).erreur_systeme = d_es_processus;
  402:             return;
  403:         }
  404: 
  405:         if (pthread_mutex_lock(&((*((struct_mutex *) (*s_objet_argument).objet))
  406:                 .mutex)) != 0)
  407:         {
  408:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  409:             {
  410:                 if ((*s_etat_processus).profilage == d_vrai)
  411:                 {
  412:                     profilage(s_etat_processus, NULL);
  413:                 }
  414: 
  415:                 if (errno != EINTR)
  416:                 {
  417:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  418:                     return;
  419:                 }
  420:             }
  421: 
  422:             liberation(s_etat_processus, s_objet_argument);
  423: 
  424:             if ((*s_etat_processus).profilage == d_vrai)
  425:             {
  426:                 profilage(s_etat_processus, NULL);
  427:             }
  428: 
  429:             (*s_etat_processus).erreur_systeme = d_es_processus;
  430:             return;
  431:         }
  432: 
  433:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  434:         {
  435:             if (errno != EINTR)
  436:             {
  437:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  438:                 return;
  439:             }
  440:         }
  441: 
  442:         if ((*s_etat_processus).profilage == d_vrai)
  443:         {
  444:             profilage(s_etat_processus, NULL);
  445:         }
  446:     }
  447:     else
  448:     {
  449:         liberation(s_etat_processus, s_objet_argument);
  450: 
  451:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  452:         return;
  453:     }
  454: 
  455:     liberation(s_etat_processus, s_objet_argument);
  456: 
  457:     return;
  458: }
  459: 
  460: 
  461: /*
  462: ================================================================================
  463:   Fonction 'mtxtrylock'
  464: ================================================================================
  465:   Entrées :
  466: --------------------------------------------------------------------------------
  467:   Sorties :
  468: --------------------------------------------------------------------------------
  469:   Effets de bord : néant
  470: ================================================================================
  471: */
  472: 
  473: void
  474: instruction_mtxtrylock(struct_processus *s_etat_processus)
  475: {
  476:     int                         ios;
  477: 
  478:     struct_liste_chainee        *l_element_courant;
  479: 
  480:     struct_objet                *s_objet_argument;
  481:     struct_objet                *s_objet_resultat;
  482: 
  483:     unsigned char               *tampon;
  484: 
  485:     (*s_etat_processus).erreur_execution = d_ex;
  486: 
  487:     if ((*s_etat_processus).affichage_arguments == 'Y')
  488:     {
  489:         printf("\n  MTXTRYLOCK ");
  490: 
  491:         if ((*s_etat_processus).langue == 'F')
  492:         {
  493:             printf("(essai de verrouillage du mutex)\n\n");
  494:         }
  495:         else
  496:         {
  497:             printf("(try to lock mutex)\n\n");
  498:         }
  499: 
  500:         printf("    1: %s\n", d_MTX);
  501:         printf("->  1: %s\n", d_INT);
  502: 
  503:         return;
  504:     }
  505:     else if ((*s_etat_processus).test_instruction == 'Y')
  506:     {
  507:         (*s_etat_processus).nombre_arguments = -1;
  508:         return;
  509:     }
  510: 
  511:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  512:     {
  513:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  514:         {
  515:             return;
  516:         }
  517:     }
  518: 
  519:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  520:             &s_objet_argument) == d_erreur)
  521:     {
  522:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  523:         return;
  524:     }
  525: 
  526:     if ((*s_objet_argument).type == MTX)
  527:     {
  528:         l_element_courant = (*s_etat_processus).liste_mutexes;
  529: 
  530:         while(l_element_courant != NULL)
  531:         {
  532:             if (&((*((struct_mutex *) (*(*l_element_courant).donnee).objet))
  533:                     .mutex) == &((*((struct_mutex *) (*s_objet_argument).objet))
  534:                     .mutex))
  535:             {
  536:                 break;
  537:             }
  538: 
  539:             l_element_courant = (*l_element_courant).suivant;
  540:         }
  541: 
  542:         if (l_element_courant == NULL)
  543:         {
  544:             (*s_etat_processus).erreur_execution = d_ex_mutex;
  545: 
  546:             liberation(s_etat_processus, s_objet_argument);
  547:             return;
  548:         }
  549: 
  550:         if ((*s_etat_processus).profilage == d_vrai)
  551:         {
  552:             if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
  553:                     == NULL)
  554:             {
  555:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  556:                 return;
  557:             }
  558: 
  559:             profilage(s_etat_processus, tampon);
  560:             free(tampon);
  561: 
  562:             if ((*s_etat_processus).erreur_systeme != d_es)
  563:             {
  564:                 return;
  565:             }
  566:         }
  567: 
  568:         if ((ios = pthread_mutex_trylock(&((*((struct_mutex *)
  569:                 (*s_objet_argument).objet)).mutex))) != 0)
  570:         {
  571:             if (ios != EBUSY)
  572:             {
  573:                 liberation(s_etat_processus, s_objet_argument);
  574: 
  575:                 if ((*s_etat_processus).profilage == d_vrai)
  576:                 {
  577:                     profilage(s_etat_processus, NULL);
  578:                 }
  579: 
  580:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  581:                 return;
  582:             }
  583:         }
  584: 
  585:         if ((*s_etat_processus).profilage == d_vrai)
  586:         {
  587:             profilage(s_etat_processus, NULL);
  588:         }
  589:     }
  590:     else
  591:     {
  592:         liberation(s_etat_processus, s_objet_argument);
  593: 
  594:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  595:         return;
  596:     }
  597: 
  598:     liberation(s_etat_processus, s_objet_argument);
  599: 
  600:     if ((s_objet_resultat = allocation(s_etat_processus, INT))
  601:             == NULL)
  602:     {
  603:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  604:         return;
  605:     }
  606: 
  607:     (*((integer8 *) (*s_objet_resultat).objet)) = (ios == 0) ? 0 : -1;
  608: 
  609:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  610:             s_objet_resultat) == d_erreur)
  611:     {
  612:         return;
  613:     }
  614: 
  615:     return;
  616: }
  617: 
  618: /*
  619: ================================================================================
  620:   Fonction 'mtxstatus'
  621: ================================================================================
  622:   Entrées :
  623: --------------------------------------------------------------------------------
  624:   Sorties :
  625: --------------------------------------------------------------------------------
  626:   Effets de bord : néant
  627: ================================================================================
  628: */
  629: 
  630: void
  631: instruction_mtxstatus(struct_processus *s_etat_processus)
  632: {
  633:     int                         ios;
  634: 
  635:     struct_liste_chainee        *l_element_courant;
  636: 
  637:     struct_objet                *s_objet_argument;
  638:     struct_objet                *s_objet_resultat;
  639: 
  640:     unsigned char               *tampon;
  641: 
  642:     (*s_etat_processus).erreur_execution = d_ex;
  643: 
  644:     if ((*s_etat_processus).affichage_arguments == 'Y')
  645:     {
  646:         printf("\n  MTXSTATUS ");
  647: 
  648:         if ((*s_etat_processus).langue == 'F')
  649:         {
  650:             printf("(statut du mutex)\n\n");
  651:         }
  652:         else
  653:         {
  654:             printf("(mutex status)\n\n");
  655:         }
  656: 
  657:         printf("    1: %s\n", d_MTX);
  658:         printf("->  1: %s\n", d_INT);
  659: 
  660:         return;
  661:     }
  662:     else if ((*s_etat_processus).test_instruction == 'Y')
  663:     {
  664:         (*s_etat_processus).nombre_arguments = -1;
  665:         return;
  666:     }
  667: 
  668:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  669:     {
  670:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  671:         {
  672:             return;
  673:         }
  674:     }
  675: 
  676:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  677:             &s_objet_argument) == d_erreur)
  678:     {
  679:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  680:         return;
  681:     }
  682: 
  683:     if ((*s_objet_argument).type == MTX)
  684:     {
  685:         l_element_courant = (*s_etat_processus).liste_mutexes;
  686: 
  687:         while(l_element_courant != NULL)
  688:         {
  689:             if (&((*((struct_mutex *) (*(*l_element_courant).donnee).objet))
  690:                     .mutex) == &((*((struct_mutex *) (*s_objet_argument).objet))
  691:                     .mutex))
  692:             {
  693:                 break;
  694:             }
  695: 
  696:             l_element_courant = (*l_element_courant).suivant;
  697:         }
  698: 
  699:         if (l_element_courant == NULL)
  700:         {
  701:             (*s_etat_processus).erreur_execution = d_ex_mutex;
  702: 
  703:             liberation(s_etat_processus, s_objet_argument);
  704:             return;
  705:         }
  706: 
  707:         if ((*s_etat_processus).profilage == d_vrai)
  708:         {
  709:             if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
  710:                     == NULL)
  711:             {
  712:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  713:                 return;
  714:             }
  715: 
  716:             profilage(s_etat_processus, tampon);
  717:             free(tampon);
  718: 
  719:             if ((*s_etat_processus).erreur_systeme != d_es)
  720:             {
  721:                 return;
  722:             }
  723:         }
  724: 
  725:         if ((ios = pthread_mutex_trylock(&((*((struct_mutex *)
  726:                 (*s_objet_argument).objet)).mutex))) != 0)
  727:         {
  728:             if (ios != EBUSY)
  729:             {
  730:                 liberation(s_etat_processus, s_objet_argument);
  731: 
  732:                 if ((*s_etat_processus).profilage == d_vrai)
  733:                 {
  734:                     profilage(s_etat_processus, NULL);
  735:                 }
  736: 
  737:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  738:                 return;
  739:             }
  740:         }
  741: 
  742:         if (pthread_mutex_unlock(&((*((struct_mutex *)
  743:                 (*s_objet_argument).objet)).mutex)) != 0)
  744:         {
  745:             liberation(s_etat_processus, s_objet_argument);
  746: 
  747:             if ((*s_etat_processus).profilage == d_vrai)
  748:             {
  749:                 profilage(s_etat_processus, NULL);
  750:             }
  751: 
  752:             (*s_etat_processus).erreur_systeme = d_es_processus;
  753:             return;
  754:         }
  755: 
  756:         if ((*s_etat_processus).profilage == d_vrai)
  757:         {
  758:             profilage(s_etat_processus, NULL);
  759:         }
  760:     }
  761:     else
  762:     {
  763:         liberation(s_etat_processus, s_objet_argument);
  764: 
  765:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  766:         return;
  767:     }
  768: 
  769:     liberation(s_etat_processus, s_objet_argument);
  770: 
  771:     if ((s_objet_resultat = allocation(s_etat_processus, INT))
  772:             == NULL)
  773:     {
  774:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  775:         return;
  776:     }
  777: 
  778:     (*((integer8 *) (*s_objet_resultat).objet)) = (ios == 0) ? 0 : -1;
  779: 
  780:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  781:             s_objet_resultat) == d_erreur)
  782:     {
  783:         return;
  784:     }
  785: 
  786:     return;
  787: }
  788: 
  789: 
  790: /*
  791: ================================================================================
  792:   Fonction 'mtxunlock'
  793: ================================================================================
  794:   Entrées :
  795: --------------------------------------------------------------------------------
  796:   Sorties :
  797: --------------------------------------------------------------------------------
  798:   Effets de bord : néant
  799: ================================================================================
  800: */
  801: 
  802: void
  803: instruction_mtxunlock(struct_processus *s_etat_processus)
  804: {
  805:     struct_liste_chainee        *l_element_courant;
  806: 
  807:     struct_objet                *s_objet_argument;
  808: 
  809:     (*s_etat_processus).erreur_execution = d_ex;
  810: 
  811:     if ((*s_etat_processus).affichage_arguments == 'Y')
  812:     {
  813:         printf("\n  MTXUNLOCK ");
  814: 
  815:         if ((*s_etat_processus).langue == 'F')
  816:         {
  817:             printf("(déverrouille un mutex)\n\n");
  818:         }
  819:         else
  820:         {
  821:             printf("(unlock mutex)\n\n");
  822:         }
  823: 
  824:         printf("    1: %s\n", d_MTX);
  825: 
  826:         return;
  827:     }
  828:     else if ((*s_etat_processus).test_instruction == 'Y')
  829:     {
  830:         (*s_etat_processus).nombre_arguments = -1;
  831:         return;
  832:     }
  833: 
  834:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  835:     {
  836:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  837:         {
  838:             return;
  839:         }
  840:     }
  841: 
  842:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  843:             &s_objet_argument) == d_erreur)
  844:     {
  845:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  846:         return;
  847:     }
  848: 
  849:     if ((*s_objet_argument).type == MTX)
  850:     {
  851:         l_element_courant = (*s_etat_processus).liste_mutexes;
  852: 
  853:         while(l_element_courant != NULL)
  854:         {
  855:             if (&((*((struct_mutex *) (*(*l_element_courant).donnee).objet))
  856:                     .mutex) == &((*((struct_mutex *) (*s_objet_argument).objet))
  857:                     .mutex))
  858:             {
  859:                 break;
  860:             }
  861: 
  862:             l_element_courant = (*l_element_courant).suivant;
  863:         }
  864: 
  865:         if (l_element_courant == NULL)
  866:         {
  867:             (*s_etat_processus).erreur_execution = d_ex_mutex;
  868: 
  869:             liberation(s_etat_processus, s_objet_argument);
  870:             return;
  871:         }
  872: 
  873:         if (pthread_mutex_trylock(&((*((struct_mutex *)
  874:                 (*s_objet_argument).objet)).mutex)) == EINVAL)
  875:         {
  876:             liberation(s_etat_processus, s_objet_argument);
  877: 
  878:             (*s_etat_processus).erreur_systeme = d_es_processus;
  879:             return;
  880:         }
  881: 
  882:         if (pthread_mutex_unlock(&((*((struct_mutex *)
  883:                 (*s_objet_argument).objet)).mutex)) != 0)
  884:         {
  885:             liberation(s_etat_processus, s_objet_argument);
  886: 
  887:             (*s_etat_processus).erreur_systeme = d_es_processus;
  888:             return;
  889:         }
  890:     }
  891:     else
  892:     {
  893:         liberation(s_etat_processus, s_objet_argument);
  894: 
  895:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  896:         return;
  897:     }
  898: 
  899:     liberation(s_etat_processus, s_objet_argument);
  900: 
  901:     return;
  902: }
  903: 
  904: 
  905: /*
  906: ================================================================================
  907:   Fonction 'mark'
  908: ================================================================================
  909:   Entrées :
  910: --------------------------------------------------------------------------------
  911:   Sorties :
  912: --------------------------------------------------------------------------------
  913:   Effets de bord : néant
  914: ================================================================================
  915: */
  916: 
  917: void
  918: instruction_mark(struct_processus *s_etat_processus)
  919: {
  920:     struct_marque               *marque;
  921: 
  922:     struct_objet                *s_objet_argument;
  923:     struct_objet                *s_objet_label;
  924: 
  925:     (*s_etat_processus).erreur_execution = d_ex;
  926: 
  927:     if ((*s_etat_processus).affichage_arguments == 'Y')
  928:     {
  929:         printf("\n  MARK ");
  930: 
  931:         if ((*s_etat_processus).langue == 'F')
  932:         {
  933:             printf("(ajoute une marque à un graphique)\n\n");
  934:         }
  935:         else
  936:         {
  937:             printf("(add mark to graph)\n\n");
  938:         }
  939: 
  940:         printf("    2: %s\n", d_CHN);
  941:         printf("    1: %s\n", d_CPL);
  942: 
  943:         return;
  944:     }
  945:     else if ((*s_etat_processus).test_instruction == 'Y')
  946:     {
  947:         (*s_etat_processus).nombre_arguments = -1;
  948:         return;
  949:     }
  950: 
  951:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  952:     {
  953:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  954:         {
  955:             return;
  956:         }
  957:     }
  958: 
  959:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  960:             &s_objet_argument) == d_erreur)
  961:     {
  962:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  963:         return;
  964:     }
  965: 
  966:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  967:             &s_objet_label) == d_erreur)
  968:     {
  969:         liberation(s_etat_processus, s_objet_argument);
  970: 
  971:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  972:         return;
  973:     }
  974: 
  975:     if (((*s_objet_argument).type == CPL) && ((*s_objet_label).type == CHN))
  976:     {
  977:         if ((marque = malloc(sizeof(struct_marque))) == NULL)
  978:         {
  979:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  980:             return;
  981:         }
  982: 
  983:         if (((*marque).label = malloc((strlen((unsigned char *)
  984:                 (*s_objet_label).objet) + 1) * sizeof(unsigned char))) == NULL)
  985:         {
  986:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  987:             return;
  988:         }
  989: 
  990:         sprintf((*marque).label, "%s",
  991:                 (unsigned char *) (*s_objet_label).objet);
  992: 
  993:         if (((*marque).position = malloc(64 * sizeof(unsigned char))) == NULL)
  994:         {
  995:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  996:             return;
  997:         }
  998: 
  999:         sprintf((*marque).position, "%f,%f",
 1000:                 (*((complex16 *) (*s_objet_argument).objet)).partie_reelle,
 1001:                 (*((complex16 *) (*s_objet_argument).objet)).partie_imaginaire);
 1002: 
 1003:         (*marque).suivant = (*s_etat_processus).s_marques;
 1004:         (*s_etat_processus).s_marques = marque;
 1005: 
 1006:         (*s_etat_processus).mise_a_jour_trace_requise = d_vrai;
 1007:     }
 1008:     else
 1009:     {
 1010:         liberation(s_etat_processus, s_objet_argument);
 1011:         liberation(s_etat_processus, s_objet_label);
 1012: 
 1013:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1014:         return;
 1015:     }
 1016: 
 1017:     liberation(s_etat_processus, s_objet_argument);
 1018:     liberation(s_etat_processus, s_objet_label);
 1019: 
 1020:     return;
 1021: }
 1022: 
 1023: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>