-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathunix_poller.ml
90 lines (76 loc) · 2.72 KB
/
unix_poller.ml
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
(*
* Copyright (C) 2009 Prashanth Mundkur.
* Author Prashanth Mundkur <prashanth.mundkur _at_ gmail.com>
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 2.1 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*)
(* An extremely inefficient but purely native poller implementation. *)
type t = {
mutable readers : Unix.file_descr list;
mutable writers : Unix.file_descr list;
mutable errors : Unix.file_descr list;
}
let create_t () = {
readers = [];
writers = [];
errors = [];
}
let add t fd =
t.errors <- fd :: t.errors
let remove t fd =
let filter fd' = fd' <> fd
in
t.readers <- List.filter filter t.readers;
t.writers <- List.filter filter t.writers;
t.errors <- List.filter filter t.errors
let enable_recv t fd =
t.readers <- if List.mem fd t.readers then t.readers else fd :: t.readers
let disable_recv t fd =
let filter fd' = fd' <> fd in
t.readers <- List.filter filter t.readers
let enable_send t fd =
t.writers <- if List.mem fd t.writers then t.writers else fd :: t.writers
let disable_send t fd =
let filter fd' = fd' <> fd in
t.writers <- List.filter filter t.writers
let is_recv_enabled t fd =
List.mem fd t.readers
let is_send_enabled t fd =
List.mem fd t.writers
let get_events t timeout =
let readers, writers, errors = Unix.select t.readers t.writers t.errors timeout in
let events =
(List.map (fun fd -> {
Net_events.event_type = Net_events.Readable;
Net_events.event_fd = fd;
}) readers)
@ (List.map (fun fd -> {
Net_events.event_type = Net_events.Writeable;
Net_events.event_fd = fd;
}) writers)
@ (List.map (fun fd -> {
Net_events.event_type = Net_events.PendingError;
Net_events.event_fd = fd;
}) errors)
in
Array.of_list events
let create () =
let t = create_t () in {
Net_events.add = add t;
Net_events.remove = remove t;
Net_events.enable_recv = enable_recv t;
Net_events.disable_recv = disable_recv t;
Net_events.enable_send = enable_send t;
Net_events.disable_send = disable_send t;
Net_events.is_recv_enabled = is_recv_enabled t;
Net_events.is_send_enabled = is_send_enabled t;
Net_events.get_events = get_events t;
}