-
Notifications
You must be signed in to change notification settings - Fork 3
/
tcp-wrapper.dylan
75 lines (62 loc) · 2.23 KB
/
tcp-wrapper.dylan
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
module: uv
author: Bruce Mitchener <[email protected]>
copyright: MIT
define C-subtype <%uv-tcp> (<%uv-stream>) end;
define class <uv-tcp> (<uv-stream>)
slot connection-callback :: <function>;
end;
define inline C-function %uv-tcp-init
parameter loop :: <uv-loop>;
parameter tcp-stream :: <%uv-tcp>;
result xxx :: <C-int>;
c-name: "uv_tcp_init";
end;
define inline C-function %uv-tcp-bind
parameter tcp-stream :: <%uv-tcp>;
parameter bind-ip :: <C-string>;
parameter bind-port :: <C-int>;
c-name: "uv_dylan_tcp_bind";
end;
define inline function uv-tcp-bind (tcp-stream :: <uv-tcp>, bind-ip :: <string>, bind-port :: <integer>) => ()
%uv-tcp-bind(tcp-stream.raw-handle, bind-ip, bind-port);
end;
define inline C-function %uv-listen
parameter server :: <%uv-tcp>;
parameter backlog :: <C-int>;
parameter connection-cb :: <C-function-pointer>;
result xxx :: <C-int>;
c-name: "uv_listen";
end;
define method %uv-invoke-connection-callback
(raw-handle :: <%uv-tcp>, #rest args) => ()
let handle = import-c-dylan-object(%uv-handle-data(raw-handle));
apply(handle.connection-callback, args)
end;
define C-callable-wrapper %invoke-connection-callback of %uv-invoke-connection-callback
parameter server :: <%uv-tcp>;
parameter status :: <C-int>;
c-name: "uv_invoke_connection_callback";
end;
define inline function uv-listen (server :: <uv-tcp>, backlog :: <integer>, connection-cb :: <function>) => ()
server.connection-callback := connection-cb;
%uv-listen(server.raw-handle, backlog, %invoke-connection-callback);
end;
define inline C-function %uv-accept
parameter server :: <%uv-stream>;
parameter client :: <%uv-stream>;
c-name: "uv_accept";
end;
define inline function uv-accept (server :: <uv-stream>, client :: <uv-stream>) => ()
%uv-accept(server.raw-handle, client.raw-handle);
end;
define inline C-function %uv-dylan-tcp-new
result tcp-stream :: <%uv-tcp>;
c-name: "uv_dylan_tcp_new";
end;
define sealed domain make (singleton(<uv-tcp>));
define sealed domain initialize (singleton(<uv-tcp>));
define sealed method initialize (tcp-stream :: <uv-tcp>, #key loop = uv-default-loop())
tcp-stream.raw-handle := %uv-dylan-tcp-new();
next-method();
%uv-tcp-init(loop, tcp-stream.raw-handle);
end;