From 084745ffe51234e366ed6627d9f697c47d87bb4a Mon Sep 17 00:00:00 2001 From: Alex AUVOLAT Date: Thu, 20 Mar 2014 15:58:02 +0100 Subject: Work on KHB/KHS --- khb/khs_exec_local.ml | 37 +++++++++---------------------------- khb/test.ml | 2 +- 2 files changed, 10 insertions(+), 29 deletions(-) diff --git a/khb/khs_exec_local.ml b/khb/khs_exec_local.ml index fb97b47..09f14a8 100644 --- a/khb/khs_exec_local.ml +++ b/khb/khs_exec_local.ml @@ -12,30 +12,6 @@ let wait_childs () = List.iter (fun pid -> ignore (Unix.waitpid [] pid)) !childs) () -let max_chans = 12 -let ochans = Hashtbl.create 12 -let ochans_time = ref Smap.empty -let get_chan id = - ochans_time := Smap.map (fun v -> v+1) !ochans_time; - ochans_time := Smap.add id 0 !ochans_time; - if Smap.cardinal !ochans_time > max_chans then begin - let maxchan, _ = - Smap.fold - (fun k v (mk, mv) -> if v > mv then (k, v) else (mk, mv)) - !ochans_time ("", 0) in - let i_fd, o_fd = Hashtbl.find ochans maxchan in - Unix.close i_fd; Unix.close o_fd; - Hashtbl.remove ochans maxchan; - ochans_time := Smap.remove maxchan !ochans_time - end; - try - Hashtbl.find ochans id - with Not_found -> - let i, o = Unix.openfile ("/tmp/"^id) [Unix.O_RDONLY] 0, - Unix.openfile ("/tmp/"^id) [Unix.O_WRONLY] 0 in - Hashtbl.add ochans id (i, o); - i, o - let newchan proc = let id = "khs_ch_" ^ string_of_int (Random.int 1000000) ^ "-" ^ string_of_int (Random.int 1000000) in @@ -50,17 +26,22 @@ let exec_proc proc = | PSExec | PSExecRecvd _ -> exec_stmt proc | PSSend(c, kv) -> + let c = str_of_kbval c in proc.xstatus <- PSExec; begin if c == "stdout" then Format.printf "%s@." (kval_descr kv) else - let _, c_out = get_chan c in - Marshal.to_channel (Unix.out_channel_of_descr c_out) kv [] + let c_out = Unix.openfile ("/tmp/"^c) [Unix.O_WRONLY] 0 in + Marshal.to_channel (Unix.out_channel_of_descr c_out) kv []; + Unix.close c_out end | PSRecv c -> - let c_in, _ = get_chan c in - proc.xstatus <- PSExecRecvd (Marshal.from_channel (Unix.in_channel_of_descr c_in)) + let c = str_of_kbval c in + let c_in = Unix.openfile ("/tmp/"^c) [Unix.O_RDONLY] 0 in + let data = Marshal.from_channel (Unix.in_channel_of_descr c_in) in + proc.xstatus <- PSExecRecvd data; + Unix.close c_in done let spawn proc pos = diff --git a/khb/test.ml b/khb/test.ml index 68e3697..edc155e 100644 --- a/khb/test.ml +++ b/khb/test.ml @@ -98,4 +98,4 @@ let primes_khs = [| let () = Array.iter Ksh_print.print_stmt primes_khs; - Khs_exec_seq.exec_program (load_program primes_khs) + Khs_exec_local.exec_program (load_program primes_khs) -- cgit v1.2.3