]> matita.cs.unibo.it Git - helm.git/commitdiff
fixed memory leak (workaround)
authorEnrico Tassi <enrico.tassi@inria.fr>
Thu, 12 May 2005 09:20:48 +0000 (09:20 +0000)
committerEnrico Tassi <enrico.tassi@inria.fr>
Thu, 12 May 2005 09:20:48 +0000 (09:20 +0000)
helm/ocaml/cic/cicPushParser.ml

index c6f56dad9368beef7cc4d061e2464458bb2d4553..a76105deb6ed5a651760d5b37e321b29e812c0ac 100644 (file)
@@ -638,8 +638,19 @@ let parse uri filename =
   let xml_parser = P.create_parser callbacks in
   ctxt.xml_parser <- Some xml_parser;
   try
-    P.parse xml_parser (`Gzip_file filename);
+    (try
+      P.parse xml_parser (`Gzip_file filename);
+    with exn ->
+      ctxt.xml_parser <- None;
+      (* ZACK: the above "<- None" is vital for garbage collection. Without it
+       * we keep in memory a circular structure parser -> callbacks -> ctxt ->
+       * parser. I don't know if the ocaml garbage collector is supposed to
+       * collect such structures, but for sure the expat bindings will (orribly)
+       * leak when used in conjunction with such structures *)
+      raise exn);
+    ctxt.xml_parser <- None; (* ZACK: same comment as above *)
 (*    debug_print (string_of_stack stack);*)
+    (* assert (List.length ctxt.stack = 1) *)
     List.hd ctxt.stack
   with
   | Failure "int_of_string" -> parse_error ctxt "integer number expected"