mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
Add extra mutex for error block stuff
This commit is contained in:
+14
-3
@@ -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);
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user