Correct race condition and incorrect usage of condition_signal outside of a mutex lock

This commit is contained in:
gingerBill
2021-08-26 22:17:51 +01:00
parent 726788a483
commit b33bf3f704
5 changed files with 10 additions and 1 deletions

View File

@@ -704,6 +704,7 @@ void add_constant_switch_case(CheckerContext *ctx, Map<TypeAndToken> *seen, Oper
if (operand.value.kind == ExactValue_Invalid) {
return;
}
HashKey key = hash_exact_value(operand.value);
TypeAndToken *found = map_get(seen, key);
if (found != nullptr) {

View File

@@ -3,6 +3,8 @@
// TODO(bill): Big numbers
// IMPORTANT TODO(bill): This needs to be completely fixed!!!!!!!!
gb_global BlockingMutex hash_exact_value_mutex;
struct Ast;
struct HashKey;
struct Type;
@@ -62,6 +64,9 @@ struct ExactValue {
gb_global ExactValue const empty_exact_value = {};
HashKey hash_exact_value(ExactValue v) {
mutex_lock(&hash_exact_value_mutex);
defer (mutex_unlock(&hash_exact_value_mutex));
HashKey empty = {};
switch (v.kind) {
case ExactValue_Invalid:

View File

@@ -676,6 +676,8 @@ lbValue lb_emit_call_internal(lbProcedure *p, lbValue value, lbValue return_ptr,
for (unsigned i = 0; i < param_count; i++) {
LLVMTypeRef param_type = param_types[i];
LLVMTypeRef arg_type = LLVMTypeOf(args[i]);
// LLVMTypeKind param_kind = LLVMGetTypeKind(param_type);
// LLVMTypeKind arg_kind = LLVMGetTypeKind(arg_type);
GB_ASSERT_MSG(
arg_type == param_type,
"Parameter types do not match: %s != %s, argument: %s",

View File

@@ -2018,6 +2018,7 @@ int main(int arg_count, char const **arg_ptr) {
virtual_memory_init();
mutex_init(&fullpath_mutex);
mutex_init(&hash_exact_value_mutex);
init_string_buffer_memory();
init_string_interner();

View File

@@ -93,8 +93,8 @@ bool thread_pool_add_task(ThreadPool *pool, WorkerTaskProc *proc, void *data) {
thread_pool_queue_push(pool, task);
GB_ASSERT(pool->ready >= 0);
pool->ready++;
mutex_unlock(&pool->mutex);
condition_signal(&pool->task_cond);
mutex_unlock(&pool->mutex);
return true;
}