123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484[%%import"config.h"]moduleNull=structtypetletavailable=falsemoduleTimeout=structtypet=[`Not_implemented]letnever=`Not_implementedletimmediate=`Not_implementedletof_ns_=assertfalseendmoduleUtil=structletfile_descr_to_int:Unix.file_descr->int=fun_->assertfalseletfile_descr_of_int:int->Unix.file_descr=fun_->assertfalseendmoduleNote=structtypet=[`Not_implemented]letpp__=assertfalseletequal__=assertfalselet(=)=equalletseconds=`Not_implementedletempty=`Not_implementedletuseconds=`Not_implementedletnseconds=`Not_implementedletlowat=`Not_implementedletoob=`Not_implementedletdelete=`Not_implementedletwrite=`Not_implementedletextend=`Not_implementedletattrib=`Not_implementedletlink=`Not_implementedletrename=`Not_implementedletrevoke=`Not_implementedletexit=`Not_implementedletfork=`Not_implementedletexec=`Not_implementedletsignal=`Not_implementedendmoduleFilter=structtypet=[`Not_implemented]letpp__=assertfalseletequal__=assertfalselet(=)=equalletread=`Not_implementedletwrite=`Not_implementedlettimer=`Not_implementedletvnode=`Not_implementedletproc=`Not_implementedendmoduleFlag=structtypet=[`Not_implemented]letpp__=assertfalseletequal__=assertfalselet(=)=equallet(+)__=assertfalseletintersect__=assertfalseletreceipt=`Not_implementedletadd=`Not_implementedletenable=`Not_implementedletdisable=`Not_implementedletdelete=`Not_implementedletoneshot=`Not_implementedletclear=`Not_implementedleteof=`Not_implementedleterror=`Not_implementedendmoduleEvent_list=structtypet=[`Not_implemented]letnull=`Not_implementedletcreate_=assertfalsemoduleEvent=structtypet=[`Not_implemented]letget_ident_=assertfalseletset_ident__=assertfalseletget_filter_=assertfalseletset_filter__=assertfalseletget_flags_=assertfalseletset_flags__=assertfalseletget_fflags_=assertfalseletset_fflags__=assertfalseletget_data_=assertfalseletset_data__=assertfalseletget_udata_=assertfalseletset_udata__=assertfalseendletget__=assertfalseendletcreate()=assertfalseletkevent_~changelist:_~eventlist:__=assertfalseletclose_=assertfalseendmodule_:Kqueue_intf.S=structincludeNullend[%%ifdefinedKQUEUE_AVAILABLE&&definedKQUEUE_ML_ARCH_SIXTYFOUR]moduleUtil=structletfile_descr_to_int:Unix.file_descr->int=Obj.magicletfile_descr_of_int:int->Unix.file_descr=Obj.magicendmoduleFfi=structexternalkqueue:unit->Unix.file_descr="kqueue_ml_kqueue_create"externalkevent:Unix.file_descr->Bigstring.t->Bigstring.t->int64->int="kqueue_ml_kevent"endmoduleNote=structtypet=intletequal=Int.equallet(=)=equalletempty=0externalseconds:unit->int="kqueue_note_seconds"letseconds=seconds()externaluseconds:unit->int="kqueue_note_useconds"letuseconds=useconds()externalnseconds:unit->int="kqueue_note_nseconds"letnseconds=nseconds()externallowat:unit->int="kqueue_note_lowat"letlowat=lowat()externaloob:unit->int="kqueue_note_oob"letoob=oob()externaldelete:unit->int="kqueue_note_delete"letdelete=delete()externalwrite:unit->int="kqueue_note_write"letwrite=write()externalextend:unit->int="kqueue_note_extend"letextend=extend()externalattrib:unit->int="kqueue_note_attrib"letattrib=attrib()externallink:unit->int="kqueue_note_link"letlink=link()externalrename:unit->int="kqueue_note_rename"letrename=rename()externalrevoke:unit->int="kqueue_note_revoke"letrevoke=revoke()externalexit:unit->int="kqueue_note_exit"letexit=exit()externalfork:unit->int="kqueue_note_fork"letfork=fork()externalexec:unit->int="kqueue_note_exec"letexec=exec()externalsignal:unit->int="kqueue_note_signal"letsignal=signal()letto_stringt=matchtwith|twhent=seconds->"NOTE_SECONDS"|twhent=useconds->"NOTE_USECONDS"|twhent=nseconds->"NOTE_NSECONDS"|twhent=lowat->"NOTE_LOWAT"|twhent=oob->"NOTE_OOB"|twhent=delete->"NOTE_DELETE"|twhent=write->"NOTE_WRITE"|twhent=extend->"NOTE_EXTEND"|twhent=attrib->"NOTE_ATTRIB"|twhent=link->"NOTE_LINK"|twhent=rename->"NOTE_RENAME"|twhent=revoke->"NOTE_REVOKE"|twhent=exit->"NOTE_EXIT"|twhent=fork->"NOTE_FORK"|twhent=exec->"NOTE_EXEC"|twhent=signal->"NOTE_SIGNAL"|twhent=empty->"0"|t->Printf.sprintf"Unknown Note(%d)"t;;letppfmtt=Format.fprintffmt"%a"Format.pp_print_string(to_stringt)endmoduleFlag=structtypet=intletequal=Int.equallet(=)=equallet(+)=(lor)letintersectt1t2=t1landt2<>0letis_subsett~of_:flags=t=tlandflagsexternaladd:unit->int="kqueue_flag_ev_add"letadd=add()externalreceipt:unit->int="kqueue_flag_ev_receipt"letreceipt=receipt()externalenable:unit->int="kqueue_flag_ev_enable"letenable=enable()externaldisable:unit->int="kqueue_flag_ev_disable"letdisable=disable()externaldelete:unit->int="kqueue_flag_ev_delete"letdelete=delete()externaloneshot:unit->int="kqueue_flag_ev_oneshot"letoneshot=oneshot()externalclear:unit->int="kqueue_flag_ev_clear"letclear=clear()externaleof:unit->int="kqueue_flag_ev_eof"leteof=eof()externalerror:unit->int="kqueue_flag_ev_error"leterror=error()letknown=[add,"EV_ADD";enable,"EV_ENABLE";disable,"EV_DISABLE";delete,"EV_DELETE";oneshot,"EV_ONESHOT";clear,"EV_CLEAR";eof,"EV_EOF";error,"EV_ERROR"];;letppfmtt=letknown_flags=List.filter_map(fun(k,label)->ifis_subsetk~of_:tthenSomelabelelseNone)knowninFormat.pp_print_list~pp_sep:(funfmt()->Format.fprintffmt", ")Format.pp_print_stringfmtknown_flags;;endmoduleFilter=structtypet=intletequalab=Int.equalablet(=)=equalexternalread:unit->int="kqueue_filter_evfilt_read"letread=read()externalwrite:unit->int="kqueue_filter_evfilt_write"letwrite=write()externaltimer:unit->int="kqueue_filter_evfilt_timer"lettimer=timer()externalvnode:unit->int="kqueue_filter_evfilt_vnode"letvnode=vnode()externalproc:unit->int="kqueue_filter_evfilt_proc"letproc=proc()letppfmtt=letto_string=function|cwhenc=read->"EVFILT_READ"|cwhenc=write->"EVFILT_WRITE"|cwhenc=timer->"EVFILT_TIMER"|cwhenc=vnode->"EVFILT_VNODE"|c->Printf.sprintf"Unknown (%d)"cinFormat.fprintffmt"%a"Format.pp_print_string(to_stringt);;endmoduleKevent=structexternalsizeof:unit->int="kqueue_ml_kevent_sizeof"externalevent_ident_offset:unit->int="kqueue_ml_kevent_offset_event_fd"letevent_ident_offset=event_ident_offset()externalevent_filter_offset:unit->int="kqueue_ml_kevent_offset_filter"letevent_filter_offset=event_filter_offset()externalevent_flags_offset:unit->int="kqueue_ml_kevent_offset_flags"letevent_flags_offset=event_flags_offset()externalevent_fflags_offset:unit->int="kqueue_ml_kevent_offset_fflags"letevent_fflags_offset=event_fflags_offset()externalevent_data_offset:unit->int="kqueue_ml_kevent_offset_data"letevent_data_offset=event_data_offset()externalevent_udata_offset:unit->int="kqueue_ml_kevent_offset_udata"letevent_udata_offset=event_udata_offset()letsizeof=sizeof()letread_ident_atbufidx=Bigstring.unsafe_get_int64_le_truncbuf~pos:((idx*sizeof)+event_ident_offset);;letwrite_ident_atbufidxident=Bigstring.unsafe_set_int64_lebuf~pos:((idx*sizeof)+event_ident_offset)ident;;letread_filter_atbufidx=Bigstring.unsafe_get_int16_lebuf~pos:((idx*sizeof)+event_filter_offset);;letwrite_filter_atbufidxfilter=Bigstring.unsafe_set_int16_lebuf~pos:((idx*sizeof)+event_filter_offset)filter;;letread_flags_atbufidx=Bigstring.unsafe_get_int16_lebuf~pos:((idx*sizeof)+event_flags_offset);;letwrite_flags_atbufidxflags=Bigstring.unsafe_set_int16_lebuf~pos:((idx*sizeof)+event_flags_offset)flags;;letread_fflags_atbufidx=Bigstring.unsafe_get_int32_lebuf~pos:((idx*sizeof)+event_fflags_offset);;letwrite_fflags_atbufidxfflags=Bigstring.unsafe_set_int32_lebuf~pos:((idx*sizeof)+event_fflags_offset)fflags;;letread_data_atbufidx=Bigstring.unsafe_get_int64_le_truncbuf~pos:((idx*sizeof)+event_data_offset);;letwrite_data_atbufidxdata=Bigstring.unsafe_set_int64_lebuf~pos:((idx*sizeof)+event_data_offset)data;;letread_udata_atbufidx=Bigstring.unsafe_get_int64_le_truncbuf~pos:((idx*sizeof)+event_udata_offset);;letwrite_udata_atbufidxdata=Bigstring.unsafe_set_int64_lebuf~pos:((idx*sizeof)+event_udata_offset)data;;endmoduleEvent_list=structtypet=Bigstring.tletnull=Bigstring.create0moduleEvent=structtypet={buf:Bigstring.t;idx:int}letget_identt=Kevent.read_ident_att.buft.idxletset_identtident=Kevent.write_ident_att.buft.idxidentletget_filtert=Kevent.read_filter_att.buft.idxletset_filtertfilter=Kevent.write_filter_att.buft.idxfilterletget_flagst=Kevent.read_flags_att.buft.idxletset_flagstflags=Kevent.write_flags_att.buft.idxflagsletget_fflagst=Kevent.read_fflags_att.buft.idxletset_fflagstfflags=Kevent.write_fflags_att.buft.idxfflagsletget_datat=Kevent.read_data_att.buft.idxletset_datatdata=Kevent.write_data_att.buft.idxdataletget_udatat=Kevent.read_udata_att.buft.idxletset_udatatudata=Kevent.write_udata_att.buft.idxudataendletcreatesize=ifsize<1theninvalid_arg"Kqueue.create: changelist_size cannot be less than 1";Bigstring.create(Kevent.sizeof*size);;letgettidx={Event.buf=t;idx}endmoduleTimeout=structtypet=int64letnever=-1Lletimmediate=0Lletof_nsx=ifx<0Ltheninvalid_arg"Timeout cannot be negative";x;;endtypet={kqueue_fd:Unix.file_descr;mutableclosed:bool}letensure_opent=ift.closedthenfailwith"Attempting to use a closed kqueue"letcreate()={kqueue_fd=Ffi.kqueue();closed=false}letkeventt~changelist~eventlisttimeout=ensure_opent;Ffi.keventt.kqueue_fdchangelisteventlisttimeout;;letcloset=ifnott.closedthen(t.closed<-true;Unix.closet.kqueue_fd);;letavailable=true[%%else]includeNull[%%endif]