|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 7168 (0x1c00)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, procedure Do_Abort, seg_0009d8, separate Transport_Server
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦5a81ac88f⟧ »Space Info Vol 1«
└─⟦this⟧
separate (Transport_Server)
task body Mutex is
All_Pools : Pool_Id := null;
subtype Worker_List is Worker_Id;
Busy_List : Worker_List := null;
Idle_List : Worker_List := null;
Finisher : Worker_Id;
procedure Do_Abort (Worker : Worker_Id) is
begin
begin
abort Worker.Worker;
exception
when others =>
null;
end;
Transport.Close (Worker.Connection);
end Do_Abort;
procedure Do_Abort_List (List : in out Worker_List) is
begin
while List /= null loop
Do_Abort (List);
List := List.Next;
end loop;
end Do_Abort_List;
procedure Destroy_One (Pool : Pool_Id) is
Worker : Worker_Id := Busy_List;
begin
Pool.Max_Servers := 0;
while Worker /= null loop
if Worker.Pool = Pool and then
Transport.Is_Connecting_Passive (Worker.Connection) then
-- worker belongs to this pool, but isn't serving yet.
Do_Abort (Worker);
end if;
Worker := Worker.Next;
end loop;
end Destroy_One;
procedure Destroy_All is
Pool : Pool_Id := All_Pools;
begin
while Pool /= null loop
Destroy_One (Pool);
Pool := Pool.Next;
end loop;
end Destroy_All;
procedure Start_Worker (Pool : Pool_Id) is
Worker : Worker_Id;
begin
if Pool.Servers < Pool.Max_Servers then
if Idle_List = null then
Worker := new Worker_Type;
else
Worker := Idle_List;
Idle_List := Idle_List.Next;
end if;
Worker.Next := Busy_List;
Worker.Pool := Pool;
Worker.Worker.Start (Worker);
Busy_List := Worker;
Pool.Servers := Pool.Servers + 1;
end if;
end Start_Worker;
procedure Finish_Worker (Worker : Worker_Id) is
Pool : constant Pool_Id := Worker.Pool;
begin
-- extract Worker from Busy_List:
if Busy_List = Worker then
Busy_List := Busy_List.Next;
else
declare
Prev : Worker_Id := Busy_List;
begin
while Prev.Next /= Worker loop
Prev := Prev.Next;
end loop;
Prev.Next := Prev.Next.Next;
end;
end if;
Worker.Next := Idle_List;
Worker.Pool := null;
Transport.Close (Worker.Connection);
Idle_List := Worker;
Pool.Servers := Pool.Servers - 1;
if Pool.Servers = 0 then
Start_Worker (Pool);
end if;
end Finish_Worker;
begin
loop
begin
select
accept Create (Pool : out Pool_Id;
Network : Transport_Defs.Network_Name;
Local_Socket : Transport_Defs.Socket_Id;
Max_Servers : Natural) do
declare
New_Pool : Pool_Id :=
new Pool_Type
(Network'Length, Local_Socket'Length);
begin
New_Pool.Network := Network;
New_Pool.Local_Socket := Local_Socket;
New_Pool.Max_Servers := Max_Servers;
New_Pool.Servers := 0;
New_Pool.Next := All_Pools;
Start_Worker (New_Pool);
All_Pools := New_Pool;
Pool := New_Pool;
end;
end Create;
or
accept Set_Max_Servers (Pool : Pool_Id;
Max_Servers : Natural) do
Pool.Max_Servers := Max_Servers;
end Set_Max_Servers;
or
accept Start (Pool : Pool_Id) do
Start_Worker (Pool);
end Start;
or
accept Finish (Worker : Worker_Id) do
Finisher := Worker;
end Finish;
Finish_Worker (Finisher);
or
accept Destroy (Pool : Pool_Id := null) do
if Pool = null then
Destroy_All;
else
Destroy_One (Pool);
end if;
end Destroy;
or
accept Finalize (Abort_Servers : Boolean) do
if Abort_Servers then
Do_Abort_List (Busy_List);
end if;
Do_Abort_List (Idle_List);
Destroy_All;
end Finalize;
exit;
end select;
exception
when others =>
null;
end;
end loop;
end Mutex;
nblk1=6
nid=0
hdr6=c
[0x00] rec0=27 rec1=00 rec2=01 rec3=01e
[0x01] rec0=1d rec1=00 rec2=02 rec3=052
[0x02] rec0=1f rec1=00 rec2=03 rec3=010
[0x03] rec0=16 rec1=00 rec2=04 rec3=042
[0x04] rec0=1a rec1=00 rec2=05 rec3=02a
[0x05] rec0=0f rec1=00 rec2=06 rec3=000
tail 0x201007ce67bac64c44e15 0x42a00088462060003