authorgravatar for clebs@users.noreply.github.comBorja Clemente <clebs@users.noreply.github.com> 2023-04-22 13:09:44+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-04-22 14:09:44+03:00
logbd801dc489ee4642050b1b6f11afb976c47425b8
tree0578ec3908dfd51c54dff010d2cfce7f644d34f7
parent3f259d35502ed5a8bdb6bbc22f9adb39d610b006
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

std: GPA deinit return an enum instead of a bool


4 files changed, 28 insertions(+), 25 deletions(-)

lib/std/heap.zig+1
......@@ -16,6 +16,7 @@ pub const LogToWriterAllocator = @import("heap/log_to_writer_allocator.zig").Log
1616pub const logToWriterAllocator = @import("heap/log_to_writer_allocator.zig").logToWriterAllocator;
1717pub const ArenaAllocator = @import("heap/arena_allocator.zig").ArenaAllocator;
1818pub const GeneralPurposeAllocator = @import("heap/general_purpose_allocator.zig").GeneralPurposeAllocator;
19pub const Check = @import("heap/general_purpose_allocator.zig").Check;
1920pub const WasmAllocator = @import("heap/WasmAllocator.zig");
2021pub const WasmPageAllocator = @import("heap/WasmPageAllocator.zig");
2122pub const PageAllocator = @import("heap/PageAllocator.zig");
lib/std/heap/general_purpose_allocator.zig+23-21
......@@ -155,6 +155,8 @@ pub const Config = struct {
155155 verbose_log: bool = false,
156156};
157157
158pub const Check = enum { ok, leak };
159
158160pub fn GeneralPurposeAllocator(comptime config: Config) type {
159161 return struct {
160162 backing_allocator: Allocator = std.heap.page_allocator,
......@@ -431,7 +433,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
431433 } else struct {};
432434
433435 /// Returns true if there were leaks; false otherwise.
434 pub fn deinit(self: *Self) bool {
436 pub fn deinit(self: *Self) Check {
435437 const leaks = if (config.safety) self.detectLeaks() else false;
436438 if (config.retain_metadata) {
437439 self.freeRetainedMetadata();
......@@ -441,7 +443,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
441443 self.small_allocations.deinit(self.backing_allocator);
442444 }
443445 self.* = undefined;
444 return leaks;
446 return @intToEnum(Check, @boolToInt(leaks));
445447 }
446448
447449 fn collectStackTrace(first_trace_addr: usize, addresses: *[stack_n]usize) void {
......@@ -1024,7 +1026,7 @@ const test_config = Config{};
10241026
10251027test "small allocations - free in same order" {
10261028 var gpa = GeneralPurposeAllocator(test_config){};
1027 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1029 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
10281030 const allocator = gpa.allocator();
10291031
10301032 var list = std.ArrayList(*u64).init(std.testing.allocator);
......@@ -1043,7 +1045,7 @@ test "small allocations - free in same order" {
10431045
10441046test "small allocations - free in reverse order" {
10451047 var gpa = GeneralPurposeAllocator(test_config){};
1046 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1048 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
10471049 const allocator = gpa.allocator();
10481050
10491051 var list = std.ArrayList(*u64).init(std.testing.allocator);
......@@ -1062,7 +1064,7 @@ test "small allocations - free in reverse order" {
10621064
10631065test "large allocations" {
10641066 var gpa = GeneralPurposeAllocator(test_config){};
1065 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1067 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
10661068 const allocator = gpa.allocator();
10671069
10681070 const ptr1 = try allocator.alloc(u64, 42768);
......@@ -1075,7 +1077,7 @@ test "large allocations" {
10751077
10761078test "very large allocation" {
10771079 var gpa = GeneralPurposeAllocator(test_config){};
1078 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1080 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
10791081 const allocator = gpa.allocator();
10801082
10811083 try std.testing.expectError(error.OutOfMemory, allocator.alloc(u8, math.maxInt(usize)));
......@@ -1083,7 +1085,7 @@ test "very large allocation" {
10831085
10841086test "realloc" {
10851087 var gpa = GeneralPurposeAllocator(test_config){};
1086 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1088 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
10871089 const allocator = gpa.allocator();
10881090
10891091 var slice = try allocator.alignedAlloc(u8, @alignOf(u32), 1);
......@@ -1105,7 +1107,7 @@ test "realloc" {
11051107
11061108test "shrink" {
11071109 var gpa = GeneralPurposeAllocator(test_config){};
1108 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1110 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
11091111 const allocator = gpa.allocator();
11101112
11111113 var slice = try allocator.alloc(u8, 20);
......@@ -1130,7 +1132,7 @@ test "shrink" {
11301132
11311133test "large object - grow" {
11321134 var gpa = GeneralPurposeAllocator(test_config){};
1133 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1135 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
11341136 const allocator = gpa.allocator();
11351137
11361138 var slice1 = try allocator.alloc(u8, page_size * 2 - 20);
......@@ -1148,7 +1150,7 @@ test "large object - grow" {
11481150
11491151test "realloc small object to large object" {
11501152 var gpa = GeneralPurposeAllocator(test_config){};
1151 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1153 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
11521154 const allocator = gpa.allocator();
11531155
11541156 var slice = try allocator.alloc(u8, 70);
......@@ -1165,7 +1167,7 @@ test "realloc small object to large object" {
11651167
11661168test "shrink large object to large object" {
11671169 var gpa = GeneralPurposeAllocator(test_config){};
1168 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1170 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
11691171 const allocator = gpa.allocator();
11701172
11711173 var slice = try allocator.alloc(u8, page_size * 2 + 50);
......@@ -1190,7 +1192,7 @@ test "shrink large object to large object" {
11901192
11911193test "shrink large object to large object with larger alignment" {
11921194 var gpa = GeneralPurposeAllocator(test_config){};
1193 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1195 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
11941196 const allocator = gpa.allocator();
11951197
11961198 var debug_buffer: [1000]u8 = undefined;
......@@ -1226,7 +1228,7 @@ test "shrink large object to large object with larger alignment" {
12261228
12271229test "realloc large object to small object" {
12281230 var gpa = GeneralPurposeAllocator(test_config){};
1229 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1231 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
12301232 const allocator = gpa.allocator();
12311233
12321234 var slice = try allocator.alloc(u8, page_size * 2 + 50);
......@@ -1244,7 +1246,7 @@ test "overrideable mutexes" {
12441246 .backing_allocator = std.testing.allocator,
12451247 .mutex = std.Thread.Mutex{},
12461248 };
1247 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1249 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
12481250 const allocator = gpa.allocator();
12491251
12501252 const ptr = try allocator.create(i32);
......@@ -1253,7 +1255,7 @@ test "overrideable mutexes" {
12531255
12541256test "non-page-allocator backing allocator" {
12551257 var gpa = GeneralPurposeAllocator(.{}){ .backing_allocator = std.testing.allocator };
1256 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1258 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
12571259 const allocator = gpa.allocator();
12581260
12591261 const ptr = try allocator.create(i32);
......@@ -1262,7 +1264,7 @@ test "non-page-allocator backing allocator" {
12621264
12631265test "realloc large object to larger alignment" {
12641266 var gpa = GeneralPurposeAllocator(test_config){};
1265 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1267 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
12661268 const allocator = gpa.allocator();
12671269
12681270 var debug_buffer: [1000]u8 = undefined;
......@@ -1304,7 +1306,7 @@ test "realloc large object to larger alignment" {
13041306test "large object shrinks to small but allocation fails during shrink" {
13051307 var failing_allocator = std.testing.FailingAllocator.init(std.heap.page_allocator, 3);
13061308 var gpa = GeneralPurposeAllocator(.{}){ .backing_allocator = failing_allocator.allocator() };
1307 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1309 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
13081310 const allocator = gpa.allocator();
13091311
13101312 var slice = try allocator.alloc(u8, page_size * 2 + 50);
......@@ -1322,7 +1324,7 @@ test "large object shrinks to small but allocation fails during shrink" {
13221324
13231325test "objects of size 1024 and 2048" {
13241326 var gpa = GeneralPurposeAllocator(test_config){};
1325 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1327 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
13261328 const allocator = gpa.allocator();
13271329
13281330 const slice = try allocator.alloc(u8, 1025);
......@@ -1334,7 +1336,7 @@ test "objects of size 1024 and 2048" {
13341336
13351337test "setting a memory cap" {
13361338 var gpa = GeneralPurposeAllocator(.{ .enable_memory_limit = true }){};
1337 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1339 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
13381340 const allocator = gpa.allocator();
13391341
13401342 gpa.setRequestedMemoryLimit(1010);
......@@ -1361,11 +1363,11 @@ test "setting a memory cap" {
13611363test "double frees" {
13621364 // use a GPA to back a GPA to check for leaks of the latter's metadata
13631365 var backing_gpa = GeneralPurposeAllocator(.{ .safety = true }){};
1364 defer std.testing.expect(!backing_gpa.deinit()) catch @panic("leak");
1366 defer std.testing.expect(backing_gpa.deinit() == .ok) catch @panic("leak");
13651367
13661368 const GPA = GeneralPurposeAllocator(.{ .safety = true, .never_unmap = true, .retain_metadata = true });
13671369 var gpa = GPA{ .backing_allocator = backing_gpa.allocator() };
1368 defer std.testing.expect(!gpa.deinit()) catch @panic("leak");
1370 defer std.testing.expect(gpa.deinit() == .ok) catch @panic("leak");
13691371 const allocator = gpa.allocator();
13701372
13711373 // detect a small allocation double free, even though bucket is emptied
lib/test_runner.zig+3-3
......@@ -56,7 +56,7 @@ fn mainServer() !void {
5656 },
5757 .query_test_metadata => {
5858 std.testing.allocator_instance = .{};
59 defer if (std.testing.allocator_instance.deinit()) {
59 defer if (std.testing.allocator_instance.deinit() == .leak) {
6060 @panic("internal test runner memory leak");
6161 };
6262
......@@ -108,7 +108,7 @@ fn mainServer() !void {
108108 }
109109 },
110110 };
111 leak = std.testing.allocator_instance.deinit();
111 leak = std.testing.allocator_instance.deinit() == .leak;
112112 try server.serveTestResults(.{
113113 .index = index,
114114 .flags = .{
......@@ -148,7 +148,7 @@ fn mainTerminal() void {
148148 for (test_fn_list, 0..) |test_fn, i| {
149149 std.testing.allocator_instance = .{};
150150 defer {
151 if (std.testing.allocator_instance.deinit()) {
151 if (std.testing.allocator_instance.deinit() == .leak) {
152152 leaks += 1;
153153 }
154154 }
test/standalone/windows_spawn/main.zig+1-1
......@@ -4,7 +4,7 @@ const utf16Literal = std.unicode.utf8ToUtf16LeStringLiteral;
44
55pub fn main() anyerror!void {
66 var gpa = std.heap.GeneralPurposeAllocator(.{}){};
7 defer if (gpa.deinit()) @panic("found memory leaks");
7 defer if (gpa.deinit() == .leak) @panic("found memory leaks");
88 const allocator = gpa.allocator();
99
1010 var it = try std.process.argsWithAllocator(allocator);