|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 21/28] libxl: ocaml: add wrappers for poll
We need this in order to wrap the event API of libxl.
Signed-off-by: Rob Hoes <rob.hoes@xxxxxxxxxx>
---
tools/ocaml/libs/xl/Makefile | 2 +-
tools/ocaml/libs/xl/poll_stubs.c | 128 ++++++++++++++++++++++++++++++++++++++
tools/ocaml/libs/xl/poll_stubs.h | 6 ++
3 files changed, 135 insertions(+), 1 deletion(-)
create mode 100644 tools/ocaml/libs/xl/poll_stubs.c
create mode 100644 tools/ocaml/libs/xl/poll_stubs.h
diff --git a/tools/ocaml/libs/xl/Makefile b/tools/ocaml/libs/xl/Makefile
index 5a410d2..beca795 100644
--- a/tools/ocaml/libs/xl/Makefile
+++ b/tools/ocaml/libs/xl/Makefile
@@ -15,7 +15,7 @@ OCAMLINCLUDE += -I ../xentoollog
LIBS_xenlight = $(LDLIBS_libxenlight)
xenlight_OBJS = $(OBJS)
-xenlight_C_OBJS = xenlight_stubs
+xenlight_C_OBJS = xenlight_stubs poll_stubs
OCAML_LIBRARY = xenlight
diff --git a/tools/ocaml/libs/xl/poll_stubs.c b/tools/ocaml/libs/xl/poll_stubs.c
new file mode 100644
index 0000000..0cf54b9
--- /dev/null
+++ b/tools/ocaml/libs/xl/poll_stubs.c
@@ -0,0 +1,128 @@
+#include <poll.h>
+#include <caml/alloc.h>
+#include <caml/memory.h>
+#include <caml/signals.h>
+#include <caml/fail.h>
+
+static int list_len(value v)
+{
+ int len = 0;
+ while ( v != Val_emptylist ) {
+ len++;
+ v = Field(v, 1);
+ }
+ return len;
+}
+
+short Poll_val(value event)
+{
+ CAMLparam1(event);
+ short res = -1;
+
+ switch (Int_val(event)) {
+ case 0: res = POLLIN; break;
+ case 1: res = POLLPRI; break;
+ case 2: res = POLLOUT; break;
+ case 3: res = POLLERR; break;
+ case 4: res = POLLHUP; break;
+ case 5: res = POLLNVAL; break;
+ }
+
+ CAMLreturn(res);
+}
+
+short Poll_events_val(value event_list)
+{
+ CAMLparam1(event_list);
+ short events = 0;
+
+ while (event_list != Val_emptylist) {
+ events |= Poll_val(Field(event_list, 0));
+ event_list = Field(event_list, 1);
+ }
+
+ CAMLreturn(events);
+}
+
+value Val_poll(short event)
+{
+ CAMLparam0();
+ CAMLlocal1(res);
+
+ switch (event) {
+ case POLLIN: res = Val_int(0); break;
+ case POLLPRI: res = Val_int(1); break;
+ case POLLOUT: res = Val_int(2); break;
+ case POLLERR: res = Val_int(3); break;
+ case POLLHUP: res = Val_int(4); break;
+ case POLLNVAL: res = Val_int(5); break;
+ }
+
+ CAMLreturn(res);
+}
+
+value add_event(value event_list, short event)
+{
+ CAMLparam1(event_list);
+ CAMLlocal1(new_list);
+
+ new_list = caml_alloc(2, 0);
+ Store_field(new_list, 0, Val_poll(event));
+ Store_field(new_list, 1, event_list);
+
+ CAMLreturn(new_list);
+}
+
+value Val_poll_events(short events)
+{
+ CAMLparam0();
+ CAMLlocal1(event_list);
+
+ event_list = Val_emptylist;
+ if (events & POLLIN)
+ event_list = add_event(event_list, POLLIN);
+ if (events & POLLPRI)
+ event_list = add_event(event_list, POLLPRI);
+ if (events & POLLOUT)
+ event_list = add_event(event_list, POLLOUT);
+ if (events & POLLERR)
+ event_list = add_event(event_list, POLLERR);
+ if (events & POLLHUP)
+ event_list = add_event(event_list, POLLHUP);
+ if (events & POLLNVAL)
+ event_list = add_event(event_list, POLLNVAL);
+
+ CAMLreturn(event_list);
+}
+
+value stub_poll(value fds)
+{
+ CAMLparam1(fds);
+ CAMLlocal2(fd, tmp);
+ int rc, i;
+ const int c_nfds = list_len(fds);
+ struct pollfd c_fds[c_nfds];
+
+ for (i = 0; fds != Val_emptylist; i++) {
+ fd = Field(fds, 0);
+ c_fds[i].fd = Int_val(Field(fd, 0));
+ c_fds[i].events = Poll_events_val(Field(fd, 1));
+ fds = Field(fds, 1);
+ }
+
+ caml_enter_blocking_section();
+ rc = poll(c_fds, c_nfds, -1);
+ caml_leave_blocking_section();
+
+ if (rc > 0) {
+ for (i = c_nfds - 1; i >= 0; i--) {
+ tmp = caml_alloc(2, 0);
+ Store_field(tmp, 0, Val_poll_events(c_fds[i].revents));
+ Store_field(tmp, 1, fds);
+ fds = tmp;
+ }
+ }
+
+ CAMLreturn(fds);
+}
+
diff --git a/tools/ocaml/libs/xl/poll_stubs.h b/tools/ocaml/libs/xl/poll_stubs.h
new file mode 100644
index 0000000..0b2332d
--- /dev/null
+++ b/tools/ocaml/libs/xl/poll_stubs.h
@@ -0,0 +1,6 @@
+#include <caml/alloc.h>
+
+short Poll_events_val(value event_list);
+value Val_poll_events(short events);
+value stub_poll(value fds);
+
--
1.7.10.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |