123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147(* OCaml promise library
* http://www.ocsigen.org/lwt
* Copyright (C) 2009-2011 Jérémie Dimino
*
* 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, with linking exceptions;
* either version 2.1 of the License, or (at your option) any later
* version. See COPYING file for details.
*
* 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*)(* [Lwt_sequence] is deprecated – we don't want users outside Lwt using it.
However, it is still used internally by Lwt. So, briefly disable warning 3
("deprecated"), and create a local, non-deprecated alias for
[Lwt_sequence] that can be referred to by the rest of the code in this
module without triggering any more warnings. *)[@@@ocaml.warning"-3"]moduleLwt_sequence=Lwt_sequence[@@@ocaml.warning"+3"]externalglib_init:unit->unit="lwt_glib_init"externalglib_stop:unit->unit="lwt_glib_stop"typestate=|State_none|State_glib_into_lwtof(unit->unit)Lwt_sequence.node*(unit->unit)Lwt_sequence.node|State_lwt_into_glibofLwt_engine.tletstate=refState_none(* +-----------------------------------------------------------------+
| Glib-based engine |
+-----------------------------------------------------------------+ *)externalglib_poll:(Unix.file_descr*bool*bool)list->int->int->(Unix.file_descr*bool*bool)list="lwt_glib_poll"classengine=objectinheritLwt_engine.poll_basedmethodprivatepollfdstimeout=glib_pollfds(List.lengthfds)(max(-1)(truncate(timeout*.1000.)))end(* +-----------------------------------------------------------------+
| Glib --> Lwt based integration |
+-----------------------------------------------------------------+ *)[@@@ocaml.warning"-37"]typewatch=|Watch_none|Watch_in|Watch_out|Watch_in_out[@@@ocaml.warning"+37"]externalglib_get_sources:unit->Unix.file_descrarray*watcharray*float="lwt_glib_get_sources"externalglib_check:unit->unit="lwt_glib_check"[@@@ocaml.warning"-3"]externalglib_mark_readable:int->unit="lwt_glib_mark_readable""noalloc"externalglib_mark_writable:int->unit="lwt_glib_mark_writable""noalloc"[@@@ocaml.warning"+3"]letevents=ref[]letcheck=reftrueletenter()=if!checkthenbegincheck:=false;letengine=Lwt_engine.get()inassert(!events=[]);letfds,watches,timeout=glib_get_sources()infori=0toArray.lengthfds-1doletfd=fds.(i)inmatchwatches.(i)with|Watch_none->()|Watch_in->events:=engine#on_readablefd(fun_->glib_mark_readablei)::!events|Watch_out->events:=engine#on_writablefd(fun_->glib_mark_writablei)::!events|Watch_in_out->events:=engine#on_readablefd(fun_->glib_mark_readablei)::engine#on_writablefd(fun_->glib_mark_writablei)::!eventsdone;iftimeout=0.thenignore(Lwt_main.yield())elseiftimeout>0.thenevents:=engine#on_timertimeoutfalseignore::!eventsendletleave()=ifnot!checkthenbegincheck:=true;List.iterLwt_engine.stop_event!events;events:=[];glib_check()end(* +-----------------------------------------------------------------+
| Installation/removal |
+-----------------------------------------------------------------+ *)letinstall?(mode=`lwt_into_glib)()=match!statewith|State_lwt_into_glib_|State_glib_into_lwt_->()|State_none->glib_init();matchmodewith|`glib_into_lwt->state:=State_glib_into_lwt(Lwt_sequence.add_lenterLwt_main.enter_iter_hooks,Lwt_sequence.add_lleaveLwt_main.leave_iter_hooks)[@ocaml.warning"-3"]|`lwt_into_glib->letengine=Lwt_engine.get()inLwt_engine.set~destroy:false(newengine);state:=State_lwt_into_glibengineletremove()=match!statewith|State_none->()|State_glib_into_lwt(node_enter,node_leave)->state:=State_none;Lwt_sequence.removenode_enter;Lwt_sequence.removenode_leave;List.iterLwt_engine.stop_event!events;events:=[];glib_stop()|State_lwt_into_glibengine->Lwt_engine.setengine(* +-----------------------------------------------------------------+
| Misc |
+-----------------------------------------------------------------+ *)externaliter:bool->unit="lwt_glib_iter"externalwakeup:unit->unit="lwt_glib_wakeup"