1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859open!Coreopen!Asynctype'at='aDeferred.tletreturn=Deferred.returnletbind=Deferred.bindletmap=Deferred.maplet(>>=)=Deferred.(>>=)let(>>|)=Deferred.(>>|)letwrap_main_threadfv=Deferred.return(fv)letnum_threads=letmax_num_threads=Async_config.(Max_num_threads.rawmax_num_threads)inifmax_num_threads<=1thenraise_s[%message"Async max_num_threads too low; must be > 1"]elseletfloat_num_threads=Float.of_int(Async_config.(Max_num_threads.rawmax_num_threads))inletten_percent=0.1*.float_num_threadsinFloat.to_intten_percentletnext_thread=Lazy_deferred.create(fun()->Deferred.Array.initnum_threads~f:(funi->In_thread.Helper_thread.create~name:(sprintf"netsnmp thread %i"i)())>>|funthreads->letnext_thread=ref0infun()->letret=threads.(!next_thread)innext_thread:=(!next_thread+1)%num_threads;ret)letthread_table:In_thread.Helper_thread.tInt.Table.t=Int.Table.create()letwrap_new_threadfv=Lazy_deferred.force_exnnext_thread>>=funnext_thread->letthread=next_thread()inIn_thread.run~thread(fun()->fv)>>|funresult_with_thread_id->letthread_id=Netsnmp_raw_monad.Io_intf.With_thread_id.thread_idresult_with_thread_idinInt.Table.add_exnthread_table~key:thread_id~data:thread;Netsnmp_raw_monad.Io_intf.With_thread_id.resultresult_with_thread_idletwrap~thread_idfv=letthread=Int.Table.find_exnthread_tablethread_idinIn_thread.run~thread(fun()->fv)letwrap_mtfv=In_thread.run(fun()->fv)letgc_finaliseft=Gc.add_finalizer_exnt(funt->ft|>don't_wait_for)