12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455(**
* Copyright (c) 2015, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the "hack" directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*)openHack_core(* Forking duplicates data in all buffers, so we flush them beforehand to avoid
* writing the same thing twice.
*
* Note: by default, this only clears ocaml's internal buffers (via flush_all).
* If your process has its own buffers in the program state, those must be
* cleared by registering a callback with `on_fork` below to reliably avoid
* writing those buffers twice as well. *)letpre_fork_callbacks:(unit->unit)listref=ref[flush_all](** Sometimes it is more convenient to clear buffers in the children (to
* avoid the double writing of data) instead of the parent on a successful
* fork. We store those callbacks here. *)letpost_fork_child_callbacks:(unit->unit)listref=ref[]leton_forkf=pre_fork_callbacks:=f::!pre_fork_callbacksletpost_fork_childf=post_fork_child_callbacks:=f::!post_fork_child_callbacks(* You should always use this instead of Unix.fork, so that the callbacks get
* invoked *)letfork()=List.iter!pre_fork_callbacks~f:(funf->f());matchUnix.fork()with|0->List.iter!post_fork_child_callbacks~f:(funf->f());0|i->i(* should only be called from hh_server, which initializes the PidLog *)letfork_and_log?reason()=letresult=fork()in(matchresultwith|-1->()|0->PidLog.close();|pid->PidLog.log?reasonpid);resultletfork_and_may_log?reason()=matchreasonwith|None->fork()|Some_->fork_and_log?reason()