Skip to content
Snippets Groups Projects
Commit 65f07394 authored by Loïc Correnson's avatar Loïc Correnson Committed by David Bühler
Browse files

[server] fix lost pending signals

parent 20eb25de
No related branches found
No related tags found
No related merge requests found
...@@ -108,8 +108,9 @@ type 'a server = { ...@@ -108,8 +108,9 @@ type 'a server = {
q_in : 'a pending Queue.t ; (* queue of pending `EXEC and `GET jobs *) q_in : 'a pending Queue.t ; (* queue of pending `EXEC and `GET jobs *)
q_out : 'a response Queue.t ; (* queue of pending responses *) q_out : 'a response Queue.t ; (* queue of pending responses *)
mutable daemon : Db.daemon option ; (* Db.yield daemon *) mutable daemon : Db.daemon option ; (* Db.yield daemon *)
mutable s_active : Signals.t ; (* signals the client is listening to *) mutable s_listen : Signals.t ; (* signals the client is listening to *)
mutable s_signal : Signals.t ; (* emitted signals since last synchro *) mutable s_emitted : Signals.t ; (* emitted signals enqueued *)
mutable s_pending : Signals.t ; (* emitted signals not enqueued yet *)
mutable shutdown : bool ; (* server has been asked to shut down *) mutable shutdown : bool ; (* server has been asked to shut down *)
mutable running : 'a running ; (* server running state *) mutable running : 'a running ; (* server running state *)
mutable cmdline : bool option ; (* cmdline signal management *) mutable cmdline : bool option ; (* cmdline signal management *)
...@@ -254,12 +255,18 @@ let process_request (server : 'a server) (request : 'a request) : unit = ...@@ -254,12 +255,18 @@ let process_request (server : 'a server) (request : 'a request) : unit =
end end
| `SigOn sg -> | `SigOn sg ->
begin begin
server.s_active <- Signals.add sg server.s_active ; server.s_listen <- Signals.add sg server.s_listen ;
if Signals.mem sg server.s_pending then
begin
server.s_emitted <- Signals.add sg server.s_emitted ;
server.s_pending <- Signals.remove sg server.s_pending ;
Queue.push (`Signal sg) server.q_out ;
end ;
notify sg true ; notify sg true ;
end end
| `SigOff sg -> | `SigOff sg ->
begin begin
server.s_active <- Signals.remove sg server.s_active ; server.s_listen <- Signals.remove sg server.s_listen ;
notify sg false ; notify sg false ;
end end
| `Kill id -> | `Kill id ->
...@@ -307,7 +314,7 @@ let communicate server = ...@@ -307,7 +314,7 @@ let communicate server =
pool := List.rev !pool ; pool := List.rev !pool ;
Queue.clear server.q_out ; Queue.clear server.q_out ;
server.cmdline <- None ; server.cmdline <- None ;
server.s_signal <- Signals.empty ; server.s_emitted <- Signals.empty ;
Senv.debug ~level:2 "response(s) callback" ; Senv.debug ~level:2 "response(s) callback" ;
if Senv.debug_atleast 2 then if Senv.debug_atleast 2 then
List.iter (Senv.debug "%a" (pp_response server.pretty)) !pool ; List.iter (Senv.debug "%a" (pp_response server.pretty)) !pool ;
...@@ -324,11 +331,16 @@ let do_yield server () = ...@@ -324,11 +331,16 @@ let do_yield server () =
ignore ( communicate server ) ignore ( communicate server )
let do_signal server s = let do_signal server s =
if Signals.mem s server.s_active && not (Signals.mem s server.s_signal) then if Signals.mem s server.s_listen then
begin begin
server.s_signal <- Signals.add s server.s_signal ; if not (Signals.mem s server.s_emitted) then
Queue.push (`Signal s) server.q_out ; begin
server.s_emitted <- Signals.add s server.s_emitted ;
Queue.push (`Signal s) server.q_out ;
end
end end
else
server.s_pending <- Signals.add s server.s_pending
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
(* --- One Step Process --- *) (* --- One Step Process --- *)
...@@ -380,8 +392,9 @@ let create ~pretty ?(equal=(=)) ~fetch () = ...@@ -380,8 +392,9 @@ let create ~pretty ?(equal=(=)) ~fetch () =
fetch ; polling ; equal ; pretty ; fetch ; polling ; equal ; pretty ;
q_in = Queue.create () ; q_in = Queue.create () ;
q_out = Queue.create () ; q_out = Queue.create () ;
s_active = Signals.empty ; s_listen = Signals.empty ;
s_signal = Signals.empty ; s_emitted = Signals.empty ;
s_pending = Signals.empty ;
daemon = None ; daemon = None ;
running = Idle ; running = Idle ;
cmdline = None ; cmdline = None ;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment