Browse Source

Add extra mutex guards around module value access

gingerBill 2 years ago
parent
commit
62031c24a2
2 changed files with 11 additions and 0 deletions
  1. 3 0
      src/llvm_backend_general.cpp
  2. 8 0
      src/llvm_backend_stmt.cpp

+ 3 - 0
src/llvm_backend_general.cpp

@@ -2730,7 +2730,10 @@ gb_internal lbValue lb_find_procedure_value_from_entity(lbModule *m, Entity *e)
 	} else {
 	} else {
 		array_add(&m->missing_procedures_to_check, missing_proc);
 		array_add(&m->missing_procedures_to_check, missing_proc);
 	}
 	}
+
+	rw_mutex_shared_lock(&m->values_mutex);
 	found = map_get(&m->values, e);
 	found = map_get(&m->values, e);
+	rw_mutex_shared_unlock(&m->values_mutex);
 	if (found) {
 	if (found) {
 		return *found;
 		return *found;
 	}
 	}

+ 8 - 0
src/llvm_backend_stmt.cpp

@@ -1878,7 +1878,9 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice<Ast *> const &return
 	} else if (return_count == 1) {
 	} else if (return_count == 1) {
 		Entity *e = tuple->variables[0];
 		Entity *e = tuple->variables[0];
 		if (res_count == 0) {
 		if (res_count == 0) {
+			rw_mutex_shared_lock(&p->module->values_mutex);
 			lbValue found = map_must_get(&p->module->values, e);
 			lbValue found = map_must_get(&p->module->values, e);
+			rw_mutex_shared_unlock(&p->module->values_mutex);
 			res = lb_emit_load(p, found);
 			res = lb_emit_load(p, found);
 		} else {
 		} else {
 			res = lb_build_expr(p, return_results[0]);
 			res = lb_build_expr(p, return_results[0]);
@@ -1887,7 +1889,9 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice<Ast *> const &return
 		if (p->type->Proc.has_named_results) {
 		if (p->type->Proc.has_named_results) {
 			// NOTE(bill): store the named values before returning
 			// NOTE(bill): store the named values before returning
 			if (e->token.string != "") {
 			if (e->token.string != "") {
+				rw_mutex_shared_lock(&p->module->values_mutex);
 				lbValue found = map_must_get(&p->module->values, e);
 				lbValue found = map_must_get(&p->module->values, e);
+				rw_mutex_shared_unlock(&p->module->values_mutex);
 				lb_emit_store(p, found, lb_emit_conv(p, res, e->type));
 				lb_emit_store(p, found, lb_emit_conv(p, res, e->type));
 			}
 			}
 		}
 		}
@@ -1903,7 +1907,9 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice<Ast *> const &return
 		} else {
 		} else {
 			for (isize res_index = 0; res_index < return_count; res_index++) {
 			for (isize res_index = 0; res_index < return_count; res_index++) {
 				Entity *e = tuple->variables[res_index];
 				Entity *e = tuple->variables[res_index];
+				rw_mutex_shared_lock(&p->module->values_mutex);
 				lbValue found = map_must_get(&p->module->values, e);
 				lbValue found = map_must_get(&p->module->values, e);
+				rw_mutex_shared_unlock(&p->module->values_mutex);
 				lbValue res = lb_emit_load(p, found);
 				lbValue res = lb_emit_load(p, found);
 				array_add(&results, res);
 				array_add(&results, res);
 			}
 			}
@@ -1925,7 +1931,9 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice<Ast *> const &return
 				if (e->token.string == "") {
 				if (e->token.string == "") {
 					continue;
 					continue;
 				}
 				}
+				rw_mutex_shared_lock(&p->module->values_mutex);
 				named_results[i] = map_must_get(&p->module->values, e);
 				named_results[i] = map_must_get(&p->module->values, e);
+				rw_mutex_shared_unlock(&p->module->values_mutex);
 				values[i] = lb_emit_conv(p, results[i], e->type);
 				values[i] = lb_emit_conv(p, results[i], e->type);
 			}
 			}