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
include Helpers.Retained
(struct
include C.Types.Handle
type 'kind base = 'kind handle
include C.Functions.Handle
end)
let is_closing handle =
C.Functions.Handle.is_closing (coerce handle)
let close_trampoline =
C.Functions.Handle.get_close_trampoline ()
let close handle callback =
if is_closing handle then
()
else begin
set_reference
~index:C.Types.Handle.close_callback_index
handle
(fun () ->
release handle;
callback ());
C.Functions.Handle.close (coerce handle) close_trampoline
end
let is_active handle =
C.Functions.Handle.is_active (coerce handle)
let ref handle =
C.Functions.Handle.ref (coerce handle)
let unref handle =
C.Functions.Handle.unref (coerce handle)
let has_ref handle =
C.Functions.Handle.has_ref (coerce handle)
let buffer_size c_function handle =
let size = Ctypes.(allocate int 0) in
c_function (coerce handle) size
|> Error.to_result (Ctypes.(!@) size)
let send_buffer_size handle =
buffer_size C.Functions.Handle.send_buffer_size handle
let recv_buffer_size handle =
buffer_size C.Functions.Handle.recv_buffer_size handle
let set_buffer_size c_function handle size =
let size = Ctypes.(allocate int size) in
c_function (coerce handle) size
let set_send_buffer_size handle size =
set_buffer_size C.Functions.Handle.send_buffer_size handle size
|> Error.to_result ()
let set_recv_buffer_size handle size =
set_buffer_size C.Functions.Handle.recv_buffer_size handle size
|> Error.to_result ()
let fileno handle =
let os_fd = Ctypes.make C.Types.Os_fd.t in
C.Functions.Handle.fileno (coerce handle) (Ctypes.addr os_fd)
|> Error.to_result os_fd
let get_loop handle =
C.Functions.Handle.get_loop (coerce handle)