123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081openExtLibmoduleU=ExtUnix.SpecificmoduleEv=Libeventclasspoll=letreadmask=U.Poll.(pollin+pollerr+pollhup+pollpri+pollrdhup)inletwritemask=U.Poll.(pollout+pollerr+pollhup)inletconvert(fd,i,o)=fd,U.Poll.((ifithenpollinelsenone)+(ifothenpolloutelsenone))inobjectvalmutablebuffer=[||]inheritLwt_engine.poll_basedmethodpollfdstimeout=(*
let show = Stre.list (fun (fd,i,o) -> sprintf "%d%s%s" (U.int_of_file_descr fd) (if i then "r" else "") (if o then "w" else "")) in
log #info "lwt poll %f %s" timeout (show fds);
*)letnfds=List.lengthfdsinifnfds<=Array.lengthbuffer&&nfds*2>Array.lengthbufferthenbeginList.iteri(funix->buffer.(i)<-convertx)fds;endelsebuffer<-Array.of_list@@List.mapconvertfds;lettimeout=iftimeout<0.then-1./.1000.elsetimeoutinletl=U.pollbuffer~n:nfdstimeout|>List.map(fun(fd,f)->fd,U.Poll.is_interfreadmask,U.Poll.is_interfwritemask)in(* log #info "lwt poll done %s" (show l); *)lendtypeLwt_engine.engine_id+=Engine_id__Devkit_libevent(** libevent-based engine for lwt *)classlibevent=letonce_block=Ev.[ONCE]inletonce_nonblock=Ev.[ONCE;NONBLOCK]inobject(self)inheritLwt_engine.abstract(* suppressing warning 7: for compatibility with both lwt.5.10 and lwt.6
once we move fully to lwt.6 and drop compat with 5.10, we can remove the attribute *)method[@warning"-7"]id=Engine_id__Devkit_libeventvalevents_=Ev.init()valmutablepid=Unix.getpid()methodevents=ifUnix.getpid()<>pidthen(pid<-Unix.getpid();Ev.reinitevents_);events_methodprivatecleanup=Ev.freeevents_methoditerblock=tryEv.(loopsself#events(ifblockthenonce_blockelseonce_nonblock))withexn->Exn.fail~exn"Lwt_engines.libevent#iter"methodprivateregister_readablefdf=letev=Ev.create()inEv.setself#eventsevfd[Ev.READ]~persist:true(fun__->f());Ev.addevNone;lazy(Ev.delev)methodprivateregister_writablefdf=letev=Ev.create()inEv.setself#eventsevfd[Ev.WRITE]~persist:true(fun__->f());Ev.addevNone;lazy(Ev.delev)methodprivateregister_timerdelayrepeatf=letev=Ev.create()inletstop=reffalseinEv.set_timerself#eventsev~persist:falsebeginfun()->ifnot!stopthenf();ifrepeat&¬!stopthenEv.addev(Somedelay);end;Ev.addev(Somedelay);lazy(stop:=true;Ev.delev)end