aboutsummaryrefslogtreecommitdiff
path: root/src/error.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-05-18 11:26:57 +0100
committergingerBill <bill@gingerbill.org>2023-05-18 11:26:57 +0100
commit49d1f6aca03672469d8fda0dedd27e330e698edc (patch)
treef762ab6c9b9d5ae0d374eda0b31a3c164fc94455 /src/error.cpp
parente82146bf17908dcc3619c8ec34bb0e902d7c213d (diff)
parent49cd9648b05c6eda252122104cb9b1faa2502602 (diff)
Merge branch 'master' into separate-int-word-sizes
Diffstat (limited to 'src/error.cpp')
-rw-r--r--src/error.cpp17
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);
{