1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798open!Importletthreads_have_been_created=reffalseincludeThreadletsexp_of_tt=[%message"thread"~id:(idt:int)]letcreate_should_raise=reffalseletcreatefarg=if!create_should_raisethenraise_s[%message"Thread.create requested to raise"];threads_have_been_created:=true;letfarg=tryfargwithx->Printf.eprintf"%s\n%!"(Exn.to_stringx);raisexincreatefarg;;letthreads_have_been_created()=!threads_have_been_createdletwait_signalsigs=wait_signal(List.map~f:Signal.to_caml_intsigs)letsigmaskcmdsigs=letcmd=matchcmdwith|`Set->Unix.SIG_SETMASK|`Block->Unix.SIG_BLOCK|`Unblock->Unix.SIG_UNBLOCKinletsigs=List.map~f:Signal.to_caml_intsigsinList.map~f:Signal.of_caml_int(sigmaskcmdsigs);;letnum_threads()=letrecfind_thread_count=function|[]->None|line::xs->ifString.is_prefixline~prefix:"Threads:"thenbegintrySome(int_of_string(String.strip(snd(String.lsplit2_exnline~on:':'))))with|_->Noneendelsefind_thread_countxsintryfind_thread_count(In_channel.read_lines("/proc/"^string_of_int(Unix.getpid())^"/status"))with_->None;;letblock_forever()=Event.sync(Event.receive(Event.new_channel()));;[%%import"config.h"][%%ifdefJSC_PTHREAD_NP]externalsetaffinity_self_exn:intArray.t->unit="pthread_np_setaffinity_self"externalgetaffinity_self_exn:unit->intArray.t="pthread_np_getaffinity_self"letsetaffinity_self_exn=letsetaffinity_self_exncpuset=setaffinity_self_exn(Int.Set.to_arraycpuset)inOksetaffinity_self_exn;;letgetaffinity_self_exn=letgetaffinity_self_exn()=Int.Set.of_array(getaffinity_self_exn())inOkgetaffinity_self_exn;;[%%else]letnot_supportedname=Error.of_string(sprintf"%s: non-portable pthread extension is not supported on this platform"name);;letsetaffinity_self_exn=Error(not_supported"pthread_setaffinity_np")letgetaffinity_self_exn=Error(not_supported"pthread_getaffinity_np")[%%endif]moduleFor_testing=structletcreate_should_raise=create_should_raiseend