From bb4ff84a4a88272df3ab79009d92617307529c64 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 16 May 2023 11:52:02 +0100 Subject: [PATCH] Add extra mutex for error block stuff --- src/error.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/error.cpp b/src/error.cpp index 6314c43bb..defc2593f 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -8,8 +8,9 @@ struct ErrorCollector { BlockingMutex string_mutex; RecursiveMutex block_mutex; - Array error_buffer; - Array errors; + RecursiveMutex error_buffer_mutex; + Array error_buffer; + Array errors; }; gb_global ErrorCollector global_error_collector; @@ -119,6 +120,7 @@ gb_internal void begin_error_block(void) { } gb_internal void end_error_block(void) { + mutex_lock(&global_error_collector.error_buffer_mutex); isize n = global_error_collector.error_buffer.count; if (n > 0) { u8 *text = global_error_collector.error_buffer.data; @@ -150,11 +152,16 @@ gb_internal void end_error_block(void) { text = gb_alloc_array(permanent_allocator(), u8, n+1); gb_memmove(text, global_error_collector.error_buffer.data, n); text[n] = 0; + + + mutex_lock(&global_error_collector.error_out_mutex); String s = {text, n}; array_add(&global_error_collector.errors, s); + mutex_unlock(&global_error_collector.error_out_mutex); + global_error_collector.error_buffer.count = 0; } - + mutex_unlock(&global_error_collector.error_buffer_mutex); global_error_collector.in_block.store(false); mutex_unlock(&global_error_collector.block_mutex); } @@ -172,11 +179,15 @@ gb_internal ERROR_OUT_PROC(default_error_out_va) { isize len = gb_snprintf_va(buf, gb_size_of(buf), fmt, va); isize n = len-1; if (global_error_collector.in_block) { + mutex_lock(&global_error_collector.error_buffer_mutex); + isize cap = global_error_collector.error_buffer.count + n; array_reserve(&global_error_collector.error_buffer, cap); u8 *data = global_error_collector.error_buffer.data + global_error_collector.error_buffer.count; gb_memmove(data, buf, n); global_error_collector.error_buffer.count += n; + + mutex_unlock(&global_error_collector.error_buffer_mutex); } else { mutex_lock(&global_error_collector.error_out_mutex); {