epoll_0.1.1_5475faed/example/src/server.ads

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
--
--  Copyright (C) 2022 Jeremy Grosser <jeremy@synack.me>
--
--  SPDX-License-Identifier: BSD-3-Clause
--
with Ada.Containers.Hashed_Sets;
with Ada.Containers.Vectors;
with Ada.Containers;
with GNAT.Sockets;
with Epoll;

package Server is

   function Hash (Element : GNAT.Sockets.Socket_Type)
      return Ada.Containers.Hash_Type;

   function "=" (Left, Right : GNAT.Sockets.Socket_Type)
      return Boolean;

   package Socket_Sets is new Ada.Containers.Hashed_Sets
      (Element_Type        => GNAT.Sockets.Socket_Type,
       Equivalent_Elements => "=",
       Hash                => Hash);

   type Socket_Action is (No_Action, Should_Close);
   type Callback is access function
       (Socket : GNAT.Sockets.Socket_Type)
       return Socket_Action;

   type Socket_Server is record
      On_Connect  : Callback := null;
      On_Readable : Callback := null;
      On_Writable : Callback := null;
      Listeners   : Socket_Sets.Set := Socket_Sets.Empty_Set;
      Sessions    : Socket_Sets.Set := Socket_Sets.Empty_Set;
      EP          : Epoll.Epoll_Descriptor := Epoll.Create;
   end record;

   procedure Bind
      (Server     : in out Socket_Server;
       Host       : String;
       Port       : String);

   procedure Poll
      (Server : in out Socket_Server);

   procedure Destroy
      (Server : in out Socket_Server);

private

   procedure Listener_Event
      (Server : in out Socket_Server;
       Socket : GNAT.Sockets.Socket_Type;
       Event  : Epoll.Epoll_Event);

   procedure Session_Event
      (Server : in out Socket_Server;
       Socket : GNAT.Sockets.Socket_Type;
       Event  : Epoll.Epoll_Event);
end Server;