diff options
| author | gingerBill <bill@gingerbill.org> | 2023-05-16 11:52:02 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2023-05-16 11:52:02 +0100 |
| commit | bb4ff84a4a88272df3ab79009d92617307529c64 (patch) | |
| tree | f9c4355cda77e4e466bc910a1dc505e1309ebd63 /src/error.cpp | |
| parent | 5d2c1b175e68fb33e72d5be80ba532c44794cb66 (diff) | |
Add extra mutex for error block stuff
Diffstat (limited to 'src/error.cpp')
| -rw-r--r-- | src/error.cpp | 17 |
1 files 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<u8> error_buffer; - Array<String> errors; + RecursiveMutex error_buffer_mutex; + Array<u8> error_buffer; + Array<String> 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); { |