FailingAllocator: Only capture the stack trace of the first induced allocation failure

This is a precaution to avoid confusing stack traces on the off chance that FailingAllocator continues to try to allocate after the first failure.
This commit is contained in:
Ryan Liptak 2022-06-23 17:27:55 -07:00
parent c321b2f2a0
commit 19d7f4dd82

View File

@ -56,6 +56,7 @@ pub const FailingAllocator = struct {
return_address: usize, return_address: usize,
) error{OutOfMemory}![]u8 { ) error{OutOfMemory}![]u8 {
if (self.index == self.fail_index) { if (self.index == self.fail_index) {
if (!self.has_induced_failure) {
mem.set(usize, &self.stack_addresses, 0); mem.set(usize, &self.stack_addresses, 0);
var stack_trace = std.builtin.StackTrace{ var stack_trace = std.builtin.StackTrace{
.instruction_addresses = &self.stack_addresses, .instruction_addresses = &self.stack_addresses,
@ -63,6 +64,7 @@ pub const FailingAllocator = struct {
}; };
std.debug.captureStackTrace(return_address, &stack_trace); std.debug.captureStackTrace(return_address, &stack_trace);
self.has_induced_failure = true; self.has_induced_failure = true;
}
return error.OutOfMemory; return error.OutOfMemory;
} }
const result = try self.internal_allocator.rawAlloc(len, ptr_align, len_align, return_address); const result = try self.internal_allocator.rawAlloc(len, ptr_align, len_align, return_address);