|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: B T
Length: 4122 (0x101a)
Types: TextFile
Names: »B«
└─⟦bad92a95e⟧ Bits:30000535 8mm tape, Rational 1000, RPC 1_0_2
└─⟦bb34fe6e2⟧ »DATA«
└─⟦15d8b76c6⟧
└─⟦this⟧
with Transport_Server_Proc;
package body Transport_Server is
type Pool_Type (Network_Length, Local_Socket_Length : Natural) is
record
Servers : Natural := 0;
Max_Servers : Natural;
Network : Transport_Defs.Network_Name (1 .. Network_Length);
Local_Socket : Transport_Defs.Socket_Id (1 .. Local_Socket_Length);
Next : Pool_Id;
end record;
Pool_Is_Destroyed : exception;
type Worker_Type;
type Worker_Id is access Worker_Type;
task type Worker_Task is
entry Start (Id : Worker_Id);
end Worker_Task;
type Worker_Type is
record
Worker : Worker_Task;
Connection : Transport.Connection_Id;
Pool : Pool_Id;
Next : Worker_Id;
end record;
task Mutex is
entry Create (Pool : out Pool_Id;
Network : Transport_Defs.Network_Name;
Local_Socket : Transport_Defs.Socket_Id;
Max_Servers : Natural);
entry Set_Max_Servers (Pool : Pool_Id; Max_Servers : Natural);
entry Start (Pool : Pool_Id);
entry Finish (Worker : Worker_Id);
entry Finalize (Abort_Servers : Boolean);
end Mutex;
Min_Backoff : constant Duration := 0.1;
Max_Backoff : constant Duration := 5 * 60.0;
procedure Do_Backoff (Backoff : in out Duration) is
begin
delay Backoff;
Backoff := 2 * Backoff;
if Backoff > Max_Backoff then
Backoff := Max_Backoff;
end if;
end Do_Backoff;
task body Mutex is separate;
function Create (Network : Transport_Defs.Network_Name;
Local_Socket : Transport_Defs.Socket_Id;
Max_Servers : Natural := Natural'Last) return Pool_Id is
Answer : Pool_Id;
begin
-- Ignore the Max_Servers parameter due to blocking I/O on target
-- Mutex.Create (Answer, Network, Local_Socket, Max_Servers);
Mutex.Create (Answer, Network, Local_Socket, 1);
return Answer;
end Create;
procedure Set_Max_Servers (Pool : Pool_Id; Max_Servers : Natural) is
begin
-- Ignore Max_Servers parameter due to blocking I/O on the target
-- Mutex.Set_Max_Servers (Pool, Max_Servers);
Mutex.Set_Max_Servers (Pool, 1);
end Set_Max_Servers;
function Network (Pool : Pool_Id) return Transport_Defs.Network_Name is
begin
return Pool.Network;
end Network;
function Local_Socket (Pool : Pool_Id) return Transport_Defs.Socket_Id is
begin
return Pool.Local_Socket;
end Local_Socket;
function Max_Servers (Pool : Pool_Id) return Natural is
begin
return Pool.Max_Servers;
end Max_Servers;
function Servers (Pool : Pool_Id) return Natural is
begin
return Pool.Servers;
end Servers;
procedure Finalize (Abort_Servers : Boolean := False) is
begin
-- Mutex.Finalize (Abort_Servers); JMK 10/25/86 not for native code
null;
end Finalize;
procedure Serve (Pool : in out Pool_Id;
Connection : Transport.Connection_Id) is
begin
if Pool.Max_Servers <= 0 then
raise Pool_Is_Destroyed;
end if;
Mutex.Start (Pool);
Serve (Connection);
if Pool.Max_Servers <= 0 then
raise Pool_Is_Destroyed;
end if;
end Serve;
procedure Work is new Transport_Server_Proc (Pool_Id, Serve);
task body Worker_Task is
Id : Worker_Id;
begin
loop
select
accept Start (Id : Worker_Id) do
Worker_Task.Id := Start.Id;
end Start;
or
terminate;
end select;
begin
Work (Id.Pool, Id.Connection,
Id.Pool.Network, Id.Pool.Local_Socket);
exception
when Pool_Is_Destroyed =>
null;
end;
Mutex.Finish (Id);
end loop;
end Worker_Task;
end Transport_Server;