systemd-ml/lib_main/systemd_main.ml

46 lines
1.4 KiB
OCaml

let noop _env _ctx = ()
let run ?(min_level=Xlog.WARN) ?(init=noop) ?(ready_status=None) ?(reload=noop) ?(shutdown=noop) func =
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)];