Преглед на файлове

remove get_error_line_if_exists and slightly rework find_file for thread-safety

see #12205
Simon Krajewski преди 6 месеца
родител
ревизия
d548059a94
променени са 3 файла, в които са добавени 17 реда и са изтрити 14 реда
  1. 12 0
      src/core/ds/threadSafeHashtbl.ml
  2. 1 1
      src/generators/genjvm.ml
  3. 4 13
      src/syntax/lexer.ml

+ 12 - 0
src/core/ds/threadSafeHashtbl.ml

@@ -17,6 +17,18 @@ let replace h k v =
 let find h k =
 	Mutex.protect h.mutex (fun () -> Hashtbl.find h.h) k
 
+let find_or_add h k f =
+	Mutex.lock h.mutex;
+	try
+		let r = Hashtbl.find h.h k in
+		Mutex.unlock h.mutex;
+		r
+	with Not_found ->
+		let r = f () in
+		Hashtbl.add h.h k r;
+		Mutex.unlock h.mutex;
+		r
+
 let mem h k =
 	Mutex.protect h.mutex (fun () -> Hashtbl.mem h.h) k
 

+ 1 - 1
src/generators/genjvm.ml

@@ -1963,7 +1963,7 @@ class texpr_to_jvm
 		if not jm#is_terminated then self#texpr' ret e
 
 	method texpr' ret e =
-		code#set_line (Lexer.get_error_line_if_exists e.epos);
+		code#set_line (Lexer.get_error_line e.epos);
 		match e.eexpr with
 		| TVar(v,Some e1) ->
 			self#texpr (rvalue_type gctx v.v_type (Some v.v_name)) e1;

+ 4 - 13
src/syntax/lexer.ml

@@ -270,15 +270,13 @@ let resolve_file_pos file =
 		f
 
 let find_file file =
-	try
-		ThreadSafeHashtbl.find all_files file
-	with Not_found ->
+	ThreadSafeHashtbl.find_or_add all_files file (fun () ->
 		try
-			let f = resolve_file_pos file in
-			ThreadSafeHashtbl.add all_files file f;
-			f
+			(* TODO: It's actually stupid to block the entire Hashtbl while we're reading a file... *)
+			resolve_file_pos file
 		with Sys_error _ ->
 			make_file file
+	)
 
 let find_pos p =
 	find_line p.pmin (find_file p.pfile)
@@ -287,13 +285,6 @@ let get_error_line p =
 	let l, _ = find_pos p in
 	l
 
-let get_error_line_if_exists p =
-	try
-		let file = ThreadSafeHashtbl.find all_files p.pfile in
-		fst (find_line p.pmin file)
-	with Not_found ->
-		0
-
 let get_pos_coords p =
 	let file = find_file p.pfile in
 	let l1, p1 = find_line p.pmin file in