let noop _env _ctx = () let run ?(min_level=Xlog.WARN) ?(init=noop) ?(ready_status=None) ?(reload=noop) ?(shutdown=noop) func = if not (Systemd.is_in_systemd ()) then failwith "Not executing in systemd!"; Eio_linux.run @@ fun env -> Eio.Switch.run ~name:"main" @@ fun sw -> if Systemd.is_journald_attached () then Xlog.add_writer (Systemd_xlog.make_writer ~sw ~env) ~min_level else Xlog.init_pretty_writer stdout ~min_level; let ctx = Systemd.Notify.make ~sw ~env in let stop_cond = Eio.Condition.create () in let reload_cond = Eio.Condition.create () in let handle_stop _ = Eio.Condition.broadcast stop_cond in let handle_reload _ = Eio.Condition.broadcast reload_cond in Sys.set_signal Sys.sigint (Signal_handle handle_stop); Sys.set_signal Sys.sigterm (Signal_handle handle_stop); Sys.set_signal Sys.sighup (Signal_handle handle_reload); init env ctx; let rec reload_loop () = Eio.Condition.await_no_mutex reload_cond; Systemd.Notify.reloading ctx; reload env ctx; Systemd.Notify.ready ~status:ready_status ctx; reload_loop () in Eio.Switch.on_release sw (fun () -> Systemd.Notify.stopping ctx; shutdown env ctx); Systemd.Notify.ready ~status:ready_status ctx; Eio.Fiber.any [(fun () -> Eio.Condition.await_no_mutex stop_cond); reload_loop; (fun () -> func env ctx)];