10
0
mirror of https://github.com/LCPQ/quantum_package synced 2024-12-23 04:43:50 +01:00

Queuing_system.ml pops from the back and adds to the front

This commit is contained in:
Anthony Scemama 2016-10-17 17:40:51 +02:00
parent d7b40e6d1f
commit 85596d9e7a
2 changed files with 20 additions and 10 deletions

View File

@ -3,7 +3,8 @@ module TasksMap = Map.Make (Id.Task)
module ClientsSet = Set.Make (Id.Client) module ClientsSet = Set.Make (Id.Client)
type t = type t =
{ queued : Id.Task.t list ; { queued_front : Id.Task.t list ;
queued_back : Id.Task.t list ;
running : Id.Client.t RunningMap.t; running : Id.Client.t RunningMap.t;
tasks : string TasksMap.t; tasks : string TasksMap.t;
clients : ClientsSet.t; clients : ClientsSet.t;
@ -18,7 +19,8 @@ type t =
let create () = let create () =
{ queued = [] ; { queued_front = [] ;
queued_back = [] ;
running = RunningMap.empty ; running = RunningMap.empty ;
tasks = TasksMap.empty; tasks = TasksMap.empty;
clients = ClientsSet.empty; clients = ClientsSet.empty;
@ -38,7 +40,7 @@ let add_task ~task q =
q.next_task_id q.next_task_id
in in
{ q with { q with
queued = task_id :: q.queued ; queued_front = task_id :: q.queued_front ;
tasks = TasksMap.add task_id task q.tasks; tasks = TasksMap.add task_id task q.tasks;
next_task_id = Id.Task.increment task_id ; next_task_id = Id.Task.increment task_id ;
number_of_queued = q.number_of_queued + 1; number_of_queued = q.number_of_queued + 1;
@ -60,15 +62,21 @@ let add_client q =
let pop_task ~client_id q = let pop_task ~client_id q =
let { queued ; running ; _ } = let { queued_front ; queued_back ; running ; _ } =
q q
in in
assert (ClientsSet.mem client_id q.clients); assert (ClientsSet.mem client_id q.clients);
match queued with let queued_front', queued_back' =
match queued_front, queued_back with
| (l, []) -> ( [], List.rev l)
| t -> t
in
match queued_back' with
| task_id :: new_queue -> | task_id :: new_queue ->
let new_q = let new_q =
{ q with { q with
queued = new_queue ; queued_front= queued_front' ;
queued_back = new_queue ;
running = RunningMap.add task_id client_id running; running = RunningMap.add task_id client_id running;
number_of_queued = q.number_of_queued - 1; number_of_queued = q.number_of_queued - 1;
number_of_running = q.number_of_running + 1; number_of_running = q.number_of_running + 1;
@ -139,9 +147,10 @@ let number_of_clients q =
let to_string qs = let to_string qs =
let { queued ; running ; tasks ; _ } = qs in let { queued_back ; queued_front ; running ; tasks ; _ } = qs in
let q = let q =
List.map Id.Task.to_string queued (List.map Id.Task.to_string queued_front) @
(List.map Id.Task.to_string @@ List.rev queued_back)
|> String.concat " ; " |> String.concat " ; "
and r = and r =
RunningMap.bindings running RunningMap.bindings running
@ -181,6 +190,7 @@ let test () =
| _ -> assert false | _ -> assert false
in in
Printf.printf "Task_id : %d \t\t Task : %s\n" task_id task_content; Printf.printf "Task_id : %d \t\t Task : %s\n" task_id task_content;
to_string q |> print_endline ;
let q, task_id, task_content = let q, task_id, task_content =
match pop_task ~client_id q with match pop_task ~client_id q with
| q, Some x, Some y -> q, Id.Task.to_int x, y | q, Some x, Some y -> q, Id.Task.to_int x, y

View File

@ -3,7 +3,8 @@ module TasksMap : Map.S with type key = Id.Task.t
module ClientsSet : Set.S with type elt = Id.Client.t module ClientsSet : Set.S with type elt = Id.Client.t
type t = { type t = {
queued : Id.Task.t list ; queued_front : Id.Task.t list ;
queued_back : Id.Task.t list ;
running : Id.Client.t RunningMap.t ; running : Id.Client.t RunningMap.t ;
tasks : string TasksMap.t ; tasks : string TasksMap.t ;
clients : ClientsSet.t ; clients : ClientsSet.t ;
@ -60,4 +61,3 @@ val to_string : t -> string
val test : unit -> unit val test : unit -> unit