aboutsummaryrefslogtreecommitdiff
path: root/civyloop.c
diff options
context:
space:
mode:
authorbuisson2005-04-29 09:35:43 +0000
committerbuisson2005-04-29 09:35:43 +0000
commit22c1e6dbe7cf74936e5ca29eadeff81312ccc506 (patch)
tree3304815b956eb5c76674fa2763d3da8a2e73394f /civyloop.c
parent23abb4b87c7e40ed259dd02f653516f60e55ade4 (diff)
downloadivy-ocaml-22c1e6dbe7cf74936e5ca29eadeff81312ccc506.zip
ivy-ocaml-22c1e6dbe7cf74936e5ca29eadeff81312ccc506.tar.gz
ivy-ocaml-22c1e6dbe7cf74936e5ca29eadeff81312ccc506.tar.bz2
ivy-ocaml-22c1e6dbe7cf74936e5ca29eadeff81312ccc506.tar.xz
Initial revision
Diffstat (limited to 'civyloop.c')
-rw-r--r--civyloop.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/civyloop.c b/civyloop.c
new file mode 100644
index 0000000..0414654
--- /dev/null
+++ b/civyloop.c
@@ -0,0 +1,60 @@
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <getopt.h>
+#include <ivy.h>
+#include <ivyloop.h>
+#include <timer.h>
+#include <caml/mlvalues.h>
+#include <caml/fail.h>
+#include <caml/callback.h>
+#include <caml/memory.h>
+#include <caml/alloc.h>
+
+value ivy_mainLoop(value unit)
+{
+ IvyMainLoop (0);
+ return Val_unit;
+}
+
+void timer_cb(TimerId id, void *data, unsigned long delta)
+{
+ value closure = *(value*)data;
+ callback(closure, Val_int((int) id));
+}
+
+value ivy_timerRepeatafter(value nb_ticks,value delay, value closure_name)
+{
+ value * closure = caml_named_value(String_val(closure_name));
+ TimerId id = TimerRepeatAfter(Int_val(nb_ticks), Int_val(delay), timer_cb, (void*)closure);
+ return Val_int(id);
+}
+
+/* Data associated to Channel callbacks is the couple of delete and
+read closures */
+
+void cb_delete_channel(void *delete_read);
+void cb_read_channel(Channel ch, HANDLE fd, void *closure);
+
+
+value ivy_channelSetUp(value fd, value closure_name)
+{
+ Channel c;
+ value * closure = caml_named_value(String_val(closure_name));
+
+ c = IvyChannelSetUp((HANDLE)Int_val(fd), (void*)closure, cb_delete_channel, cb_read_channel);
+ return Val_int(c);
+}
+
+value ivy_timerRemove(value t)
+{
+ TimerRemove((TimerId)Int_val(t));
+ return Val_unit;
+}
+
+
+value ivy_channelClose(value ch)
+{
+ IvyChannelClose((Channel)Int_val(ch));
+ return Val_unit;
+}