1 (***********************************************************************)
2 (* The OcamlEvent library *)
4 (* Copyright 2002, 2003 Maas-Maarten Zeeman. All rights reserved. See *)
5 (* LICENCE for details. *)
6 (***********************************************************************)
8 (* $Id: liboevent.ml,v 1.1 2009-11-26 08:49:02 maas Exp $ *)
18 let int_of_event_type = function
24 let event_type_of_int = function
28 | 6 -> READ
(* READ|WRITE *)
30 | n
-> raise
(Invalid_argument
(Printf.sprintf
"event_type %d" n
))
32 type event_callback
= event
-> Unix.file_descr
-> event_flags
-> unit
34 (* Use an internal hashtable to store the ocaml callbacks with the
36 let table = Hashtbl.create
0
38 (* Called by the c-stub, locate, and call the ocaml callback *)
39 let event_cb event_id fd etype
=
40 let (event
,cb
) = Hashtbl.find
table event_id
in
41 cb event fd
(event_type_of_int etype
)
43 (* Return the id of an event *)
44 external event_id
: event
-> int = "oc_event_id"
46 (* Return the signal associated with the event *)
47 external signal
: event
-> int = "oc_event_fd"
49 (* Return the fd associated with the event *)
50 external fd
: event
-> Unix.file_descr
= "oc_event_fd"
52 (* Set an event (not exported) *)
53 external cset_fd
: event_base
-> Unix.file_descr
-> int -> event
= "oc_event_create"
54 external cset_int
: event_base
-> int -> int -> event
= "oc_event_create"
56 let persist_flag = function true -> 0x10 | false -> 0
59 let create event_base fd etype persist
(cb
: event_callback
) =
60 let rec int_of_event_type_list flag
= function
61 h
::t
-> int_of_event_type_list (flag
lor (int_of_event_type h
)) t
64 let flag = int_of_event_type_list (persist_flag persist
) etype
in
65 let event = cset_fd event_base fd
flag in
66 Hashtbl.add
table (event_id
event) (event,cb
);
69 let create_timer event_base persist
(cb
: event -> unit) =
70 let flag = persist_flag persist
in
71 let event = cset_int event_base
(-1) flag in
72 Hashtbl.add
table (event_id
event) (event, (fun e _ _
-> cb e
));
75 let create_signal event_base signal persist
(cb
: event_callback
) =
76 let flag = (int_of_event_type SIGNAL
) lor (persist_flag persist
) in
77 let event = cset_int event_base signal
flag in
78 Hashtbl.add
table (event_id
event) (event,cb
);
82 external add
: event -> float option -> unit = "oc_event_add"
85 external cdel
: event -> unit = "oc_event_del"
87 Hashtbl.remove
table (event_id
event);
91 (* Not fully implemented yet *)
92 external pending
: event -> event_flags list
-> bool = "oc_event_pending"
95 external dispatch
: event_base
-> unit = "oc_event_base_dispatch"
97 type loop_flags
= ONCE
| NONBLOCK
98 external loop
: event_base
-> loop_flags
-> unit = "oc_event_base_loop"
100 external init
: unit -> event_base
= "oc_event_base_init"
101 external reinit
: event_base
-> unit = "oc_event_base_reinit"
102 external free
: event_base
-> unit = "oc_event_base_free"
105 Callback.register
"event_cb" event_cb
108 module Global
= struct
111 let init () = reinit
base
113 let create = create base
114 let dispatch () = dispatch base