From 06b8d09156d9afbedb853aadad2d54220dcddf1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr> Date: Fri, 24 Jan 2020 18:49:57 +0100 Subject: [PATCH] [server/zmq] background server --- src/plugins/server/main.ml | 1 + src/plugins/server/server_zmq.ml | 70 +++++++++++++++++++++----------- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/src/plugins/server/main.ml b/src/plugins/server/main.ml index d9212a6abdb..77497270548 100644 --- a/src/plugins/server/main.ml +++ b/src/plugins/server/main.ml @@ -297,6 +297,7 @@ let stop server = | Some db -> begin server.background <- None ; + signal false ; Db.progress := db ; end diff --git a/src/plugins/server/server_zmq.ml b/src/plugins/server/server_zmq.ml index 3beb162451a..05a2b23d7ec 100644 --- a/src/plugins/server/server_zmq.ml +++ b/src/plugins/server/server_zmq.ml @@ -32,12 +32,19 @@ module Senv = Server_parameters let zmq_group = Senv.add_group "Protocol ZeroMQ" let () = Parameter_customize.set_group zmq_group -module Enabled = Senv.String +module Socket = Senv.String (struct let option_name = "-server-zmq" let arg_name = "url" let default = "" - let help = "Establish a ZeroMQ server and listen for connections" + let help = "Setup the ZeroMQ server (in background)." + end) + +let () = Parameter_customize.set_group zmq_group +module Run = Senv.Action + (struct + let option_name = "-server-zmq-run" + let help = "Launch the ZeroMQ server (until shutdown)." end) let _ = Doc.page `Protocol ~title:"ZeroMQ Protocol" ~filename:"server_zmq.md" @@ -46,7 +53,7 @@ let _ = Doc.page `Protocol ~title:"ZeroMQ Protocol" ~filename:"server_zmq.md" (* --- ZMQ Context --- *) (* -------------------------------------------------------------------------- *) -let context = +let zmq_context = let zmq = ref None in fun () -> match !zmq with @@ -117,26 +124,43 @@ let fetch socket () = (* --- Establish the Server --- *) (* -------------------------------------------------------------------------- *) -let establish url = - if url <> "" then - begin - let context = context () in - let socket = Zmq.Socket.(create context rep) in - try - Zmq.Socket.bind socket url ; - Senv.feedback "ZeroMQ [%s]" url ; - Main.create ~pretty:Format.pp_print_string ~fetch:(fetch socket) () - |> Main.run ; - Zmq.Socket.close socket ; - with exn -> - Zmq.Socket.close socket ; - raise exn - end +let pretty = Format.pp_print_string +let background = ref None -(* -------------------------------------------------------------------------- *) -(* --- Establish the Server from Command line --- *) -(* -------------------------------------------------------------------------- *) - -let () = Db.Main.extend (fun () -> establish (Enabled.get ())) +let cmdline () = + begin + match !background with + | Some server -> + if Run.get () then Main.run server + | None -> + let url = Socket.get () in + if url <> "" then + let context = zmq_context () in + let socket = Zmq.Socket.(create context rep) in + try + Zmq.Socket.bind socket url ; + let server = Main.create ~pretty ~fetch:(fetch socket) () in + background := Some server ; + at_exit begin fun () -> + Senv.feedback "ZeroMQ [%s] stopped" url ; + Zmq.Socket.close socket ; + background := None ; + end ; + if Run.get () then + begin + Senv.feedback "ZeroMQ [%s] running" url ; + Main.run server + end + else + begin + Senv.feedback "ZeroMQ [%s] started" url ; + Main.start server + end + with exn -> + Zmq.Socket.close socket ; + raise exn + end + +let () = Db.Main.extend cmdline (* -------------------------------------------------------------------------- *) -- GitLab