Skip to content

Commit 7b6fbc1

Browse files
committed
Initialize the array in C, cuts 70% of creation time
1 parent 7fa2412 commit 7b6fbc1

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

lib/iomux_stubs.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,23 @@ caml_iomux_poll_set_index(value v_fds, value v_index, value v_fd, value v_events
113113
return (Val_unit);
114114
}
115115

116+
value
117+
caml_iomux_poll_init(value v_fds, value v_maxfds)
118+
{
119+
CAMLparam1(v_fds);
120+
struct pollfd *pfd = pollfd_of_index(v_fds, Val_int(0));
121+
int maxfds = Int_val(v_maxfds);
122+
int i;
123+
124+
for (i = 0; i < maxfds; i++, pfd++) {
125+
pfd->fd = -1;
126+
pfd->events = 0;
127+
}
128+
129+
CAMLreturn(Val_unit);
130+
}
131+
132+
116133
value /* noalloc */
117134
caml_iomux_poll_get_revents(value v_fds, value v_index)
118135
{

lib/poll.ml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ module Raw = struct
2222
external poll : buffer -> int -> int -> int = "caml_iomux_poll"
2323
external ppoll : buffer -> int -> int64 -> int list -> int = "caml_iomux_ppoll"
2424
external set_index : buffer -> int -> int -> int -> unit = "caml_iomux_poll_set_index" [@@noalloc]
25+
external init : buffer -> int -> unit = "caml_iomux_poll_init"
2526
external get_revents : buffer -> int -> int = "caml_iomux_poll_get_revents" [@@noalloc]
2627
external get_fd : buffer -> int -> int = "caml_iomux_poll_get_fd" [@@noalloc]
2728
end
@@ -117,9 +118,7 @@ let create ?(maxfds=Util.max_open_files ()) () =
117118
let len = maxfds * Config.sizeof_pollfd in
118119
let buffer = Bigarray.(Array1.create char c_layout len) in
119120
let t = { buffer; maxfds } in
120-
for i = 0 to maxfds - 1 do
121-
invalidate_index t i
122-
done;
121+
Raw.init buffer maxfds;
123122
t
124123

125124
let maxfds t = t.maxfds

0 commit comments

Comments
 (0)