Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 2.47 KB | None | 0 0
  1. -- PQ (10/12) ; PM (10/14)
  2.  
  3. with Ada.Text_IO; use Ada.Text_IO;
  4. with Ada.Exceptions;
  5.  
  6. -- Priorité rédacteurs, approche automate.
  7. package body LR.Synchro.Priored is
  8.    
  9.    -- La mise en oeuvre d'une stricte priorité rédacteurs est problématique,
  10.    -- car on ne peut réévaluer les gardes: si l'ouverture de l'entrée Demander_Lecture
  11.    -- se fait vu l'état courant (pas de rédacteur en attente) et qu'ensuite un
  12.    -- rédacteur arrive, l'entrée est toujours ouverte et un lecteur peut
  13.    -- passer. Par contre les lecteurs suivants attendront comme il faut :
  14.    -- il y a absence de famine des rédacteurs et un seul lecteur qui peut
  15.    -- doubler, c'est le mieux qu'on puisse faire ainsi.
  16.    
  17.    function Nom_Strategie return String is
  18.    begin
  19.       return "Automate, priorité rédacteurs";
  20.    end Nom_Strategie;
  21.    
  22.    task LectRedTask is
  23.       entry Demander_Lecture;
  24.       entry Demander_Ecriture;
  25.       entry Terminer_Lecture;
  26.       entry Terminer_Ecriture;
  27.    end LectRedTask;
  28.  
  29.    task body LectRedTask is
  30.       type EtatType is (Libre, Lecture, Ecriture);
  31.       etat : EtatType := Libre;
  32.       nbLecteurs : Natural := 0; -- etat Lecture seulement
  33.    begin
  34.         loop
  35.             case etat is
  36.                 when Libre =>
  37.                     select
  38.                         when Demander_Ecriture'Count = 0 =>
  39.                             accept Demander_Lecture;
  40.                             etat := Lecture;
  41.                             NbLecteurs := 1;
  42.                     or
  43.                         accept Demander_Ecriture;
  44.                         etat := Ecriture;
  45.                     end select;
  46.                 when Lecture =>
  47.                     select
  48.                         when Demander_Ecriture'Count = 0 =>
  49.                             accept Demander_Lecture;
  50.                             NbLecteurs := NbLecteurs + 1;
  51.                     or
  52.                         accept Terminer_Lecture;
  53.                         NbLecteurs := NbLecteurs - 1;
  54.                         if NbLecteurs = 0 then
  55.                             etat := Libre;
  56.                         end if;
  57.                     end select;
  58.                 when Ecriture =>
  59.                         accept Terminer_Ecriture;
  60.                         etat := Libre;
  61.             end case;
  62.         end loop;
  63.    exception
  64.       when Error: others =>
  65.          Put_Line("**** LectRedTask: exception: " & Ada.Exceptions.Exception_Information(Error));
  66.    end LectRedTask;
  67.  
  68.    procedure Demander_Lecture is
  69.    begin
  70.       LectRedTask.Demander_Lecture;
  71.    end Demander_Lecture;
  72.  
  73.    procedure Demander_Ecriture is
  74.    begin
  75.       LectRedTask.Demander_Ecriture;
  76.    end Demander_Ecriture;
  77.  
  78.    procedure Terminer_Lecture is
  79.    begin
  80.       LectRedTask.Terminer_Lecture;
  81.    end Terminer_Lecture;
  82.  
  83.    procedure Terminer_Ecriture is
  84.    begin
  85.       LectRedTask.Terminer_Ecriture;
  86.    end Terminer_Ecriture;
  87.  
  88. end LR.Synchro.Priored;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement