1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950openCoreopenPolymoduleSyscall_result=Unix.Syscall_resultletmax_tries=1000lettoo_many_tries=Error.to_exn(Error.create"syscall interrupted too many times"max_tries[%sexp_of:int]);;lettoo_many_tries_error=Errortoo_many_triesletsyscall=letrecloopfn=ifn>=max_triesthentoo_many_tries_errorelse(matchf()with|x->Okx|exceptionUnix.Unix_error(EINTR,_,_)->loopf(n+1)|exceptionexn->Errorexn)infunf->loopf0;;letis_eintrr=Syscall_result.is_errorr&&Syscall_result.error_exnr=EINTRletsyscall_result=letrecloopafn=ifn>=max_triesthenraisetoo_many_trieselse(letr=fainifnot(is_eintrr)thenrelseloopaf(n+1))infunaf->loopaf0;;letsyscall_result2=letrecloopabfn=ifn>=max_triesthenraisetoo_many_trieselse(letr=fabinifnot(is_eintrr)thenrelseloopabf(n+1))infunabf->loopabf0;;