Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -1,50 +0,0 @@
|
|||
with Ada.Numerics.Float_Random; use Ada.Numerics.Float_Random;
|
||||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
|
||||
with Synchronization.Generic_Mutexes_Array;
|
||||
|
||||
procedure Test_Dining_Philosophers is
|
||||
type Philosopher is (Aristotle, Kant, Spinoza, Marx, Russel);
|
||||
package Fork_Arrays is new Synchronization.Generic_Mutexes_Array (Philosopher);
|
||||
use Fork_Arrays;
|
||||
|
||||
Life_Span : constant := 20; -- In his life a philosopher eats 20 times
|
||||
Forks : aliased Mutexes_Array; -- Forks for hungry philosophers
|
||||
|
||||
function Left_Of (Fork : Philosopher) return Philosopher is
|
||||
begin
|
||||
if Fork = Philosopher'First then
|
||||
return Philosopher'Last;
|
||||
else
|
||||
return Philosopher'Pred (Fork);
|
||||
end if;
|
||||
end Left_Of;
|
||||
|
||||
task type Person (ID : Philosopher);
|
||||
task body Person is
|
||||
Cutlery : aliased Mutexes_Set := ID or Left_Of (ID);
|
||||
Dice : Generator;
|
||||
begin
|
||||
Reset (Dice);
|
||||
for Life_Cycle in 1..Life_Span loop
|
||||
Put_Line (Philosopher'Image (ID) & " is thinking");
|
||||
delay Duration (Random (Dice) * 0.100);
|
||||
Put_Line (Philosopher'Image (ID) & " is hungry");
|
||||
declare
|
||||
Lock : Set_Holder (Forks'Access, Cutlery'Access);
|
||||
begin
|
||||
Put_Line (Philosopher'Image (ID) & " is eating");
|
||||
delay Duration (Random (Dice) * 0.100);
|
||||
end;
|
||||
end loop;
|
||||
Put_Line (Philosopher'Image (ID) & " is leaving");
|
||||
end Person;
|
||||
|
||||
Ph_1 : Person (Aristotle); -- Start philosophers
|
||||
Ph_2 : Person (Kant);
|
||||
Ph_3 : Person (Spinoza);
|
||||
Ph_4 : Person (Marx);
|
||||
Ph_5 : Person (Russel);
|
||||
begin
|
||||
null; -- Nothing to do in the main task, just sit and behold
|
||||
end Test_Dining_Philosophers;
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
with Ada.Numerics.Float_Random; use Ada.Numerics.Float_Random;
|
||||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
|
||||
procedure Test_Dining_Philosophers is
|
||||
type Philosopher is (Aristotle, Kant, Spinoza, Marx, Russel);
|
||||
protected type Fork is
|
||||
entry Grab;
|
||||
procedure Put_Down;
|
||||
private
|
||||
Seized : Boolean := False;
|
||||
end Fork;
|
||||
protected body Fork is
|
||||
entry Grab when not Seized is
|
||||
begin
|
||||
Seized := True;
|
||||
end Grab;
|
||||
procedure Put_Down is
|
||||
begin
|
||||
Seized := False;
|
||||
end Put_Down;
|
||||
end Fork;
|
||||
|
||||
Life_Span : constant := 20; -- In his life a philosopher eats 20 times
|
||||
|
||||
task type Person (ID : Philosopher; First, Second : not null access Fork);
|
||||
task body Person is
|
||||
Dice : Generator;
|
||||
begin
|
||||
Reset (Dice);
|
||||
for Life_Cycle in 1..Life_Span loop
|
||||
Put_Line (Philosopher'Image (ID) & " is thinking");
|
||||
delay Duration (Random (Dice) * 0.100);
|
||||
Put_Line (Philosopher'Image (ID) & " is hungry");
|
||||
First.Grab;
|
||||
Second.Grab;
|
||||
Put_Line (Philosopher'Image (ID) & " is eating");
|
||||
delay Duration (Random (Dice) * 0.100);
|
||||
Second.Put_Down;
|
||||
First.Put_Down;
|
||||
end loop;
|
||||
Put_Line (Philosopher'Image (ID) & " is leaving");
|
||||
end Person;
|
||||
|
||||
Forks : array (1..5) of aliased Fork; -- Forks for hungry philosophers
|
||||
-- Start philosophers
|
||||
Ph_1 : Person (Aristotle, Forks (1)'Access, Forks (2)'Access);
|
||||
Ph_2 : Person (Kant, Forks (2)'Access, Forks (3)'Access);
|
||||
Ph_3 : Person (Spinoza, Forks (3)'Access, Forks (4)'Access);
|
||||
Ph_4 : Person (Marx, Forks (4)'Access, Forks (5)'Access);
|
||||
Ph_5 : Person (Russel, Forks (1)'Access, Forks (5)'Access);
|
||||
begin
|
||||
null; -- Nothing to do in the main task, just sit and behold
|
||||
end Test_Dining_Philosophers;
|
||||
|
|
@ -1,75 +0,0 @@
|
|||
with Ada.Numerics.Float_Random; use Ada.Numerics.Float_Random;
|
||||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
|
||||
procedure Test_Dining_Philosophers is
|
||||
type Philosopher is (Aristotle, Kant, Spinoza, Marx, Russel);
|
||||
|
||||
protected type Fork is
|
||||
entry Grab;
|
||||
procedure Put_Down;
|
||||
private
|
||||
Seized : Boolean := False;
|
||||
end Fork;
|
||||
|
||||
protected Host is
|
||||
entry Greet;
|
||||
procedure Farewell;
|
||||
private
|
||||
Guests : Natural := 0;
|
||||
end Host;
|
||||
|
||||
protected body Fork is
|
||||
entry Grab when not Seized is
|
||||
begin
|
||||
Seized := True;
|
||||
end Grab;
|
||||
procedure Put_Down is
|
||||
begin
|
||||
Seized := False;
|
||||
end Put_Down;
|
||||
end Fork;
|
||||
|
||||
protected body Host is
|
||||
entry Greet when Guests < 5 is
|
||||
begin
|
||||
Guests := Guests + 1;
|
||||
end Greet;
|
||||
procedure Farewell is
|
||||
begin
|
||||
Guests := Guests - 1;
|
||||
end Farewell;
|
||||
end Host;
|
||||
|
||||
Life_Span : constant := 20; -- In his life a philosopher eats 20 times
|
||||
|
||||
task type Person (ID : Philosopher; Left, Right : not null access Fork);
|
||||
task body Person is
|
||||
Dice : Generator;
|
||||
begin
|
||||
Reset (Dice);
|
||||
for Life_Cycle in 1..Life_Span loop
|
||||
Put_Line (Philosopher'Image (ID) & " is thinking");
|
||||
delay Duration (Random (Dice) * 0.100);
|
||||
Put_Line (Philosopher'Image (ID) & " is hungry");
|
||||
Host.Greet;
|
||||
Left.Grab;
|
||||
Right.Grab;
|
||||
Put_Line (Philosopher'Image (ID) & " is eating");
|
||||
delay Duration (Random (Dice) * 0.100);
|
||||
Left.Put_Down;
|
||||
Right.Put_Down;
|
||||
Host.Farewell;
|
||||
end loop;
|
||||
Put_Line (Philosopher'Image (ID) & " is leaving");
|
||||
end Person;
|
||||
|
||||
Forks : array (1..5) of aliased Fork; -- Forks for hungry philosophers
|
||||
-- Start philosophers
|
||||
Ph_1 : Person (Aristotle, Forks (1)'Access, Forks (2)'Access);
|
||||
Ph_2 : Person (Kant, Forks (2)'Access, Forks (3)'Access);
|
||||
Ph_3 : Person (Spinoza, Forks (3)'Access, Forks (4)'Access);
|
||||
Ph_4 : Person (Marx, Forks (4)'Access, Forks (5)'Access);
|
||||
Ph_5 : Person (Russel, Forks (5)'Access, Forks (1)'Access);
|
||||
begin
|
||||
null; -- Nothing to do in the main task, just sit and behold
|
||||
end Test_Dining_Philosophers;
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
constant FREE = 0, LOCKED = 1
|
||||
sequence forks
|
||||
forks = repeat(FREE,5)
|
||||
|
||||
procedure person(sequence name, integer left_fork, integer right_fork)
|
||||
while 1 do
|
||||
while forks[left_fork] = LOCKED or forks[right_fork] = LOCKED do
|
||||
if forks[left_fork] = FREE then
|
||||
puts(1, name & " hasn't right fork.\n")
|
||||
elsif forks[right_fork] = FREE then
|
||||
puts(1, name & " hasn't left fork.\n")
|
||||
else
|
||||
puts(1, name & " hasn't both forks.\n")
|
||||
end if
|
||||
puts(1, name & " is waiting.\n")
|
||||
task_yield()
|
||||
end while
|
||||
|
||||
puts(1, name & " grabs forks.\n")
|
||||
forks[left_fork] = LOCKED
|
||||
forks[right_fork] = LOCKED
|
||||
for i = 1 to rand(10) do
|
||||
puts(1, name & " is eating.\n")
|
||||
task_yield()
|
||||
end for
|
||||
puts(1, name & " puts forks down and leaves the dinning room.\n")
|
||||
forks[left_fork] = FREE
|
||||
forks[right_fork] = FREE
|
||||
|
||||
for i = 1 to rand(10) do
|
||||
puts(1, name & " is thinking.\n")
|
||||
task_yield()
|
||||
end for
|
||||
puts(1, name & " becomes hungry.\n")
|
||||
end while
|
||||
end procedure
|
||||
|
||||
integer rid
|
||||
atom taskid
|
||||
rid = routine_id("person")
|
||||
taskid = task_create(rid,{"Aristotle",1,2})
|
||||
task_schedule(taskid,{1,2})
|
||||
taskid = task_create(rid,{"Kant",2,3})
|
||||
task_schedule(taskid,{1,2})
|
||||
taskid = task_create(rid,{"Spinoza",3,4})
|
||||
task_schedule(taskid,{1,2})
|
||||
taskid = task_create(rid,{"Marx",4,5})
|
||||
task_schedule(taskid,{1,2})
|
||||
taskid = task_create(rid,{"Russell",5,1})
|
||||
task_schedule(taskid,{1,2})
|
||||
|
||||
while get_key() = -1 do
|
||||
task_yield()
|
||||
end while
|
||||
Loading…
Add table
Add a link
Reference in a new issue