wip task pooling
This commit is contained in:
parent
1b15371767
commit
8f6ff5cb12
2
Makefile
2
Makefile
|
@ -17,7 +17,7 @@ twotasking:
|
||||||
echoserver:
|
echoserver:
|
||||||
$(GNATMAKE) echoserver.adb
|
$(GNATMAKE) echoserver.adb
|
||||||
|
|
||||||
echopool:
|
echopool: clean
|
||||||
$(GNATMAKE) echopool.adb
|
$(GNATMAKE) echopool.adb
|
||||||
|
|
||||||
vectors:
|
vectors:
|
||||||
|
|
56
echopool.adb
56
echopool.adb
|
@ -1,14 +1,16 @@
|
||||||
--
|
--
|
||||||
-- Echo server!
|
-- Echo server!
|
||||||
|
|
||||||
private with Ada.Text_IO;
|
private with Ada.Containers.Vectors,
|
||||||
private with Ada.Streams;
|
Ada.Text_IO,
|
||||||
private with GNAT.Sockets;
|
Ada.Streams,
|
||||||
|
GNAT.Sockets;
|
||||||
|
|
||||||
procedure EchoPool is
|
procedure EchoPool is
|
||||||
use Ada.Text_IO;
|
use Ada.Containers,
|
||||||
use Ada.Streams;
|
Ada.Text_IO,
|
||||||
use GNAT.Sockets;
|
Ada.Streams,
|
||||||
|
GNAT.Sockets;
|
||||||
|
|
||||||
ServerSock : Socket_Type;
|
ServerSock : Socket_Type;
|
||||||
ClientSock : Socket_Type;
|
ClientSock : Socket_Type;
|
||||||
|
@ -27,7 +29,7 @@ procedure EchoPool is
|
||||||
accept Handle (Client_Socket : Socket_Type) do
|
accept Handle (Client_Socket : Socket_Type) do
|
||||||
declare
|
declare
|
||||||
Channel : Stream_Access := Stream (Client_Socket);
|
Channel : Stream_Access := Stream (Client_Socket);
|
||||||
Char : Character;
|
-- Char : Character;
|
||||||
Data : Ada.Streams.Stream_Element_Array (1 .. 1);
|
Data : Ada.Streams.Stream_Element_Array (1 .. 1);
|
||||||
Offset : Ada.Streams.Stream_Element_Count;
|
Offset : Ada.Streams.Stream_Element_Count;
|
||||||
begin
|
begin
|
||||||
|
@ -46,6 +48,46 @@ procedure EchoPool is
|
||||||
end loop;
|
end loop;
|
||||||
end Echo_Handler;
|
end Echo_Handler;
|
||||||
|
|
||||||
|
type Handler_Ptr is access all Echo_Handler;
|
||||||
|
type Handler_Arr is array (Positive range 1 .. 10) of Handler_Ptr;
|
||||||
|
|
||||||
|
package T_Container is new Ada.Containers.Vectors (Element_Type => Handler_Ptr,
|
||||||
|
Index_Type => Natural);
|
||||||
|
|
||||||
|
type Task_Pool is tagged record
|
||||||
|
--Busy_Tasks : T_Container.Vector;
|
||||||
|
Available_Tasks : T_Container.Vector;
|
||||||
|
All_Tasks : Handler_Arr;
|
||||||
|
end record;
|
||||||
|
|
||||||
|
procedure Acquire (T : in out Task_Pool; H : out Handler_Ptr) is
|
||||||
|
begin
|
||||||
|
while true loop
|
||||||
|
if T_Container.Length (T.Available_Tasks) > 0 then
|
||||||
|
declare
|
||||||
|
Ptr : Handler_Ptr := T_Container.First_Element (T.Available_Tasks);
|
||||||
|
begin
|
||||||
|
T_Container.Delete_First (T.Available_Tasks, 1);
|
||||||
|
H := Ptr;
|
||||||
|
|
||||||
|
-- Since we're going to be using this task now, let's put
|
||||||
|
-- it into the Busy_Tasks vector
|
||||||
|
--T_Container.Append (T.Busy_Tasks, Ptr);
|
||||||
|
return;
|
||||||
|
end;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- If we had no tasks available to us, we'll just busy-wait
|
||||||
|
delay 0.1;
|
||||||
|
end loop;
|
||||||
|
end Acquire;
|
||||||
|
|
||||||
|
procedure Release (T : in out Task_Pool; H : in Handler_Ptr) is
|
||||||
|
begin
|
||||||
|
T_Container.Append (T.Available_Tasks, H);
|
||||||
|
end Release;
|
||||||
|
|
||||||
|
Pool : Task_Pool;
|
||||||
Handler : Echo_Handler;
|
Handler : Echo_Handler;
|
||||||
begin
|
begin
|
||||||
Initialize; -- Initialize the GNAT.Sockets library
|
Initialize; -- Initialize the GNAT.Sockets library
|
||||||
|
|
Loading…
Reference in New Issue