diff options
-rw-r--r-- | README.md | 32 | ||||
-rw-r--r-- | judge/core.ml | 10 |
2 files changed, 23 insertions, 19 deletions
@@ -9,23 +9,23 @@ standard et jouent leur coups sur la sortie standard. Organisation des fichiers ------------------------- -judge/ - xxx.ml le code du juge - protocol.ml encodeur et décodeur pour le protocole décrit plus bas - core.ml la partie principale - main.ml la synchro - gui.ml l'interface de visualisation - morpionrec.ml la partie spécifique à un jeu -morpionrec/ - joueur1/ - player le binaire/code du joueur - * fichiers de données perso - (le binaire est lancé dans le dossier du joueur) +judge/ le code du juge + protocol.ml encodeur et décodeur pour le protocole décrit plus bas + core.ml la partie principale + main.ml la synchro + gui.ml l'interface de visualisation + morpionrec.ml la partie spécifique à un jeu + +morpionrec/ dossier pour un jeu + joueur1/ dossier pour une IA + player le binaire/code du joueur + ... fichiers de données perso + (le binaire est lancé dans le dossier du joueur) joueur2/ player - * - 201411202011.log log de chaque séance - 201411202011.score enregistrement des scores de chaque séance + ... + 201411202011.log log de chaque séance + 201411202011.score enregistrement des scores de chaque séance Protocole d'entrée-sortie @@ -78,7 +78,7 @@ Organisation du tournoi Chaque paire ordonnée de joueurs distincts est considérée (pour chaque paire de joueurs, il y a deux matchs, un où chaque joueur commence). Les matchs sont mis -en attente, et n matchs sont lancés en parallèle (typiquement n = 4). +en attente, et n matchs sont lancés en parallèle (typiquement n = #CPU/2). Interface de visualisation du juge diff --git a/judge/core.ml b/judge/core.ml index 65a43a8..34d5dc9 100644 --- a/judge/core.ml +++ b/judge/core.ml @@ -67,6 +67,7 @@ module C (G: GAME) : CORE = struct type player = { name: string; binary: string; + dir: string; log_out: file_descr; mutable score: int; } @@ -149,19 +150,21 @@ module C (G: GAME) : CORE = struct let rec rd () = try let s = readdir fd in try - let b = Filename.concat (Filename.concat !game_dir s) "player" in + let dir = Filename.concat !game_dir s in + let b = Filename.concat dir "player" in let st = Unix.stat b in if (st.st_kind = S_REG || st.st_kind = S_LNK) && (st.st_perm land 0o100 <> 0) then begin Format.printf "- %s@." s; (* open log output for player *) - let p_log_file = Filename.concat (Filename.concat !game_dir s) "stderr.log" in + let p_log_file = Filename.concat dir "stderr.log" in let p_log_out = Unix.openfile p_log_file [O_APPEND; O_CREAT; O_WRONLY] 0o644 in let f = Format.formatter_of_out_channel (out_channel_of_descr p_log_out) in Format.fprintf f "---- Begin session %s@." date; Hashtbl.add players s { name = s; binary = b; + dir; log_out = p_log_out; score = 0; } end @@ -188,12 +191,13 @@ module C (G: GAME) : CORE = struct Format.printf "Launching match: %s vs. %s@." p1 p2; let open_c p = - let f =Format.formatter_of_out_channel (out_channel_of_descr p.log_out) in + let f = Format.formatter_of_out_channel (out_channel_of_descr p.log_out) in Format.fprintf f "--- Begin game (%s vs. %s)@." p1 p2; let (j2p_i, j2p_o) = pipe () in let (p2j_i, p2j_o) = pipe () in let pid = fork() in if pid = 0 then begin + chdir p.dir; dup2 j2p_i stdin; dup2 p2j_o stdout; dup2 p.log_out stderr; |