Bläddra i källkod

[java] close file descriptors on flush

Caue Waneck 12 år sedan
förälder
incheckning
1c269d6449
2 ändrade filer med 18 tillägg och 6 borttagningar
  1. 13 6
      genjava.ml
  2. 5 0
      main.ml

+ 13 - 6
genjava.ml

@@ -2751,20 +2751,27 @@ let add_java_lib com file std =
         with
           | _ -> None), (fun () -> ()), (fun () -> let ret = ref [] in get_classes_dir [] file ret; !ret)
     | _ -> (* open zip file *)
-      let zip = Zip.open_in file in
       let closed = ref false in
+      let zip = ref (Zip.open_in file) in
+      let check_open () =
+        if !closed then begin
+          prerr_endline ("JAR file " ^ file ^ " already closed"); (* if this happens, find when *)
+          zip := Zip.open_in file;
+          closed := false
+        end
+      in
       (fun (pack, name) ->
-        if !closed then failwith ("JAR file " ^ file ^ " already closed");
+        check_open();
         try
           let location = (String.concat "/" (pack @ [name]) ^ ".class") in
-          let entry = Zip.find_entry zip location in
-          let data = Zip.read_entry zip entry in
+          let entry = Zip.find_entry !zip location in
+          let data = Zip.read_entry !zip entry in
           Some(JReader.parse_class (IO.input_string data), file, file ^ "@" ^ location)
         with
           | Not_found ->
             None),
-      (fun () -> closed := true; Zip.close_in zip),
-      (fun () -> get_classes_zip zip)
+      (fun () -> if not !closed then begin closed := true; Zip.close_in !zip end),
+      (fun () -> check_open(); get_classes_zip !zip)
   in
   let cached_types = Hashtbl.create 12 in
   let get_raw_class path =

+ 5 - 0
main.ml

@@ -1160,6 +1160,11 @@ try
 			Gencs.before_generate com;
 			add_std "cs"; "cs"
 		| Java ->
+      let old_flush = ctx.flush in
+      ctx.flush <- (fun () ->
+        List.iter (fun (_,_,close,_,_) -> close()) com.java_libs;
+        old_flush()
+      );
 			Genjava.before_generate com;
 			add_std "java"; "java"
 	) in