Add extra mutex for error block stuff

This commit is contained in:
gingerBill
2023-05-16 11:52:02 +01:00
parent 5d2c1b175e
commit bb4ff84a4a
+14 -3
View File
@@ -8,8 +8,9 @@ struct ErrorCollector {
BlockingMutex string_mutex; BlockingMutex string_mutex;
RecursiveMutex block_mutex; RecursiveMutex block_mutex;
Array<u8> error_buffer; RecursiveMutex error_buffer_mutex;
Array<String> errors; Array<u8> error_buffer;
Array<String> errors;
}; };
gb_global ErrorCollector global_error_collector; gb_global ErrorCollector global_error_collector;
@@ -119,6 +120,7 @@ gb_internal void begin_error_block(void) {
} }
gb_internal void end_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; isize n = global_error_collector.error_buffer.count;
if (n > 0) { if (n > 0) {
u8 *text = global_error_collector.error_buffer.data; 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); text = gb_alloc_array(permanent_allocator(), u8, n+1);
gb_memmove(text, global_error_collector.error_buffer.data, n); gb_memmove(text, global_error_collector.error_buffer.data, n);
text[n] = 0; text[n] = 0;
mutex_lock(&global_error_collector.error_out_mutex);
String s = {text, n}; String s = {text, n};
array_add(&global_error_collector.errors, s); array_add(&global_error_collector.errors, s);
mutex_unlock(&global_error_collector.error_out_mutex);
global_error_collector.error_buffer.count = 0; global_error_collector.error_buffer.count = 0;
} }
mutex_unlock(&global_error_collector.error_buffer_mutex);
global_error_collector.in_block.store(false); global_error_collector.in_block.store(false);
mutex_unlock(&global_error_collector.block_mutex); 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 len = gb_snprintf_va(buf, gb_size_of(buf), fmt, va);
isize n = len-1; isize n = len-1;
if (global_error_collector.in_block) { if (global_error_collector.in_block) {
mutex_lock(&global_error_collector.error_buffer_mutex);
isize cap = global_error_collector.error_buffer.count + n; isize cap = global_error_collector.error_buffer.count + n;
array_reserve(&global_error_collector.error_buffer, cap); array_reserve(&global_error_collector.error_buffer, cap);
u8 *data = global_error_collector.error_buffer.data + global_error_collector.error_buffer.count; u8 *data = global_error_collector.error_buffer.data + global_error_collector.error_buffer.count;
gb_memmove(data, buf, n); gb_memmove(data, buf, n);
global_error_collector.error_buffer.count += n; global_error_collector.error_buffer.count += n;
mutex_unlock(&global_error_collector.error_buffer_mutex);
} else { } else {
mutex_lock(&global_error_collector.error_out_mutex); mutex_lock(&global_error_collector.error_out_mutex);
{ {