2024-09-24 09:19:09 +00:00
|
|
|
let noop _env _ctx = ()
|
|
|
|
|
|
|
|
let run ?(min_level=Xlog.WARN) ?(init=noop) ?(ready_status=None) ?(reload=noop) ?(shutdown=noop) func =
|
2024-09-24 17:46:02 +00:00
|
|
|
if not (Systemd.is_in_systemd ()) then failwith "Not executing in systemd!";
|
2024-09-24 09:19:09 +00:00
|
|
|
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)];
|