aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-12-24 13:31:29 -0800
committerAndrew Kelley <andrew@ziglang.org>2025-12-26 19:58:56 -0800
commitb243e8f8cc7ee27dfa7318d1c3698d01582e84ae (patch)
treef4e80f83869b42e0a2f1624019f53c238f3a8df3 /lib/std
parenta72c411fdbafc206115c4f9eb19216d504c36a31 (diff)
downloadzig-b243e8f8cc7ee27dfa7318d1c3698d01582e84ae.tar.gz
zig-b243e8f8cc7ee27dfa7318d1c3698d01582e84ae.zip
std: integrate DebugAllocator with terminal mode
by adding a new std.Option for log.terminalMode this is an alternative to the approach that was deleted in aa57793b680b3da05f1d888b4df15807905e57c8
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/heap/debug_allocator.zig72
-rw-r--r--lib/std/log.zig8
-rw-r--r--lib/std/std.zig2
3 files changed, 68 insertions, 14 deletions
diff --git a/lib/std/heap/debug_allocator.zig b/lib/std/heap/debug_allocator.zig
index 66ff59a711..24f1554544 100644
--- a/lib/std/heap/debug_allocator.zig
+++ b/lib/std/heap/debug_allocator.zig
@@ -84,7 +84,7 @@ const builtin = @import("builtin");
const StackTrace = std.builtin.StackTrace;
const std = @import("std");
-const log = std.log.scoped(.gpa);
+const log = std.log.scoped(.DebugAllocator);
const math = std.math;
const assert = std.debug.assert;
const mem = std.mem;
@@ -441,7 +441,11 @@ pub fn DebugAllocator(comptime config: Config) type {
const page_addr = @intFromPtr(bucket) & ~(page_size - 1);
const addr = page_addr + slot_index * size_class;
log.err("memory address 0x{x} leaked: {f}", .{
- addr, std.debug.FormatStackTrace{ .stack_trace = stack_trace },
+ addr,
+ std.debug.FormatStackTrace{
+ .stack_trace = stack_trace,
+ .terminal_mode = std.log.terminalMode(),
+ },
});
leaks += 1;
}
@@ -471,7 +475,10 @@ pub fn DebugAllocator(comptime config: Config) type {
const stack_trace = large_alloc.getStackTrace(.alloc);
log.err("memory address 0x{x} leaked: {f}", .{
@intFromPtr(large_alloc.bytes.ptr),
- std.debug.FormatStackTrace{ .stack_trace = stack_trace },
+ std.debug.FormatStackTrace{
+ .stack_trace = stack_trace,
+ .terminal_mode = std.log.terminalMode(),
+ },
});
leaks += 1;
}
@@ -528,9 +535,18 @@ pub fn DebugAllocator(comptime config: Config) type {
var addr_buf: [stack_n]usize = undefined;
const second_free_stack_trace = std.debug.captureCurrentStackTrace(.{ .first_address = ret_addr }, &addr_buf);
log.err("Double free detected. Allocation: {f} First free: {f} Second free: {f}", .{
- std.debug.FormatStackTrace{ .stack_trace = alloc_stack_trace },
- std.debug.FormatStackTrace{ .stack_trace = free_stack_trace },
- std.debug.FormatStackTrace{ .stack_trace = second_free_stack_trace },
+ std.debug.FormatStackTrace{
+ .stack_trace = alloc_stack_trace,
+ .terminal_mode = std.log.terminalMode(),
+ },
+ std.debug.FormatStackTrace{
+ .stack_trace = free_stack_trace,
+ .terminal_mode = std.log.terminalMode(),
+ },
+ std.debug.FormatStackTrace{
+ .stack_trace = second_free_stack_trace,
+ .terminal_mode = std.log.terminalMode(),
+ },
});
}
@@ -575,8 +591,14 @@ pub fn DebugAllocator(comptime config: Config) type {
log.err("Allocation size {d} bytes does not match free size {d}. Allocation: {f} Free: {f}", .{
entry.value_ptr.bytes.len,
old_mem.len,
- std.debug.FormatStackTrace{ .stack_trace = entry.value_ptr.getStackTrace(.alloc) },
- std.debug.FormatStackTrace{ .stack_trace = free_stack_trace },
+ std.debug.FormatStackTrace{
+ .stack_trace = entry.value_ptr.getStackTrace(.alloc),
+ .terminal_mode = std.log.terminalMode(),
+ },
+ std.debug.FormatStackTrace{
+ .stack_trace = free_stack_trace,
+ .terminal_mode = std.log.terminalMode(),
+ },
});
}
@@ -682,8 +704,14 @@ pub fn DebugAllocator(comptime config: Config) type {
log.err("Allocation size {d} bytes does not match free size {d}. Allocation: {f} Free: {f}", .{
entry.value_ptr.bytes.len,
old_mem.len,
- std.debug.FormatStackTrace{ .stack_trace = entry.value_ptr.getStackTrace(.alloc) },
- std.debug.FormatStackTrace{ .stack_trace = free_stack_trace },
+ std.debug.FormatStackTrace{
+ .stack_trace = entry.value_ptr.getStackTrace(.alloc),
+ .terminal_mode = std.log.terminalMode(),
+ },
+ std.debug.FormatStackTrace{
+ .stack_trace = free_stack_trace,
+ .terminal_mode = std.log.terminalMode(),
+ },
});
}
@@ -910,8 +938,12 @@ pub fn DebugAllocator(comptime config: Config) type {
old_memory.len,
std.debug.FormatStackTrace{
.stack_trace = bucketStackTrace(bucket, slot_count, slot_index, .alloc),
+ .terminal_mode = std.log.terminalMode(),
+ },
+ std.debug.FormatStackTrace{
+ .stack_trace = free_stack_trace,
+ .terminal_mode = std.log.terminalMode(),
},
- std.debug.FormatStackTrace{ .stack_trace = free_stack_trace },
});
}
if (alignment != slot_alignment) {
@@ -921,8 +953,12 @@ pub fn DebugAllocator(comptime config: Config) type {
alignment.toByteUnits(),
std.debug.FormatStackTrace{
.stack_trace = bucketStackTrace(bucket, slot_count, slot_index, .alloc),
+ .terminal_mode = std.log.terminalMode(),
+ },
+ std.debug.FormatStackTrace{
+ .stack_trace = free_stack_trace,
+ .terminal_mode = std.log.terminalMode(),
},
- std.debug.FormatStackTrace{ .stack_trace = free_stack_trace },
});
}
}
@@ -1011,8 +1047,12 @@ pub fn DebugAllocator(comptime config: Config) type {
memory.len,
std.debug.FormatStackTrace{
.stack_trace = bucketStackTrace(bucket, slot_count, slot_index, .alloc),
+ .terminal_mode = std.log.terminalMode(),
+ },
+ std.debug.FormatStackTrace{
+ .stack_trace = free_stack_trace,
+ .terminal_mode = std.log.terminalMode(),
},
- std.debug.FormatStackTrace{ .stack_trace = free_stack_trace },
});
}
if (alignment != slot_alignment) {
@@ -1022,8 +1062,12 @@ pub fn DebugAllocator(comptime config: Config) type {
alignment.toByteUnits(),
std.debug.FormatStackTrace{
.stack_trace = bucketStackTrace(bucket, slot_count, slot_index, .alloc),
+ .terminal_mode = std.log.terminalMode(),
+ },
+ std.debug.FormatStackTrace{
+ .stack_trace = free_stack_trace,
+ .terminal_mode = std.log.terminalMode(),
},
- std.debug.FormatStackTrace{ .stack_trace = free_stack_trace },
});
}
}
diff --git a/lib/std/log.zig b/lib/std/log.zig
index 81bfc4ebb6..df11fe205b 100644
--- a/lib/std/log.zig
+++ b/lib/std/log.zig
@@ -80,6 +80,14 @@ pub fn logEnabled(comptime level: Level, comptime scope: @EnumLiteral()) bool {
return @intFromEnum(level) <= @intFromEnum(std.options.log_level);
}
+pub const terminalMode = std.options.logTerminalMode;
+
+pub fn defaultTerminalMode() std.Io.Terminal.Mode {
+ const stderr = std.debug.lockStderr(&.{}).terminal();
+ std.debug.unlockStderr();
+ return stderr.mode;
+}
+
/// The default implementation for the log function. Custom log functions may
/// forward log messages to this function.
///
diff --git a/lib/std/std.zig b/lib/std/std.zig
index 93d83b4807..6ec39306ea 100644
--- a/lib/std/std.zig
+++ b/lib/std/std.zig
@@ -129,6 +129,8 @@ pub const Options = struct {
args: anytype,
) void = log.defaultLog,
+ logTerminalMode: fn () Io.Terminal.Mode = log.defaultTerminalMode,
+
/// Overrides `std.heap.page_size_min`.
page_size_min: ?usize = null,
/// Overrides `std.heap.page_size_max`.