123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475(** Copyright (c) 2016-present, Facebook, Inc.
Modified work Copyright (c) 2018-2019 Rijnard van Tonder
This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree. *)moduleSharedMemory=Hack_parallel_intf.Std.SharedMemincludeSharedMemorytypebytes=inttypeconfiguration={heap_handle:Hack_parallel_intf.Std.SharedMem.handle;minor_heap_size:bytes;}letconfiguration:configurationoptionref=refNoneletinitial_heap_size=4096*1024*1024(* 4 GB *)letworker_garbage_control={(Gc.get())withGc.minor_heap_size=256*1024;(* 256 KB *)space_overhead=100;}letinitialize()=match!configurationwith|None->letminor_heap_size=4*1024*1024in(* 4 MB *)letspace_overhead=50in(* Only sets the GC for the master process - the parallel
workers use GC settings with less overhead. *)Gc.set{(Gc.get())withGc.minor_heap_size;space_overhead;};letshared_mem_config=letopenSharedMemoryin{global_size=initial_heap_size;heap_size=initial_heap_size;dep_table_pow=19;hash_table_pow=21;shm_dirs=["/dev/shm";"/ocaml_parallel"];shm_min_avail=1024*1024*512;(* 512 MB *)log_level=0;}inletheap_handle=SharedMemory.initshared_mem_configinconfiguration:=Some{heap_handle;minor_heap_size};{heap_handle;minor_heap_size}|Someconfiguration->configurationletget_heap_handle()=let{heap_handle;_}=initialize()inheap_handleletheap_use_ratio()=Core_kernel.Float.of_int(SharedMemory.heap_size())/.Core_kernel.Float.of_intinitial_heap_sizeletslot_use_ratio()=let{SharedMemory.used_slots;slots;_}=SharedMemory.hash_stats()inCore_kernel.Float.of_intused_slots/.Core_kernel.Float.of_intslots