Skip to content

Commit e70ef58

Browse files
committed
allocgate: change resize to return optional instead of error
1 parent 5e54d5b commit e70ef58

File tree

10 files changed

+102
-182
lines changed

10 files changed

+102
-182
lines changed

lib/std/heap.zig

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ const CAllocator = struct {
129129
new_len: usize,
130130
len_align: u29,
131131
return_address: usize,
132-
) Allocator.Error!usize {
132+
) ?usize {
133133
_ = buf_align;
134134
_ = return_address;
135135
if (new_len <= buf.len) {
@@ -141,7 +141,7 @@ const CAllocator = struct {
141141
return mem.alignAllocLen(full_len, new_len, len_align);
142142
}
143143
}
144-
return error.OutOfMemory;
144+
return null;
145145
}
146146

147147
fn free(
@@ -205,13 +205,13 @@ fn rawCResize(
205205
new_len: usize,
206206
len_align: u29,
207207
ret_addr: usize,
208-
) Allocator.Error!usize {
208+
) ?usize {
209209
_ = old_align;
210210
_ = ret_addr;
211211
if (new_len <= buf.len) {
212212
return mem.alignAllocLen(buf.len, new_len, len_align);
213213
}
214-
return error.OutOfMemory;
214+
return null;
215215
}
216216

217217
fn rawCFree(
@@ -361,7 +361,7 @@ const PageAllocator = struct {
361361
new_size: usize,
362362
len_align: u29,
363363
return_address: usize,
364-
) Allocator.Error!usize {
364+
) ?usize {
365365
_ = buf_align;
366366
_ = return_address;
367367
const new_size_aligned = mem.alignForward(new_size, mem.page_size);
@@ -387,7 +387,7 @@ const PageAllocator = struct {
387387
if (new_size_aligned <= old_size_aligned) {
388388
return alignPageAllocLen(new_size_aligned, new_size, len_align);
389389
}
390-
return error.OutOfMemory;
390+
return null;
391391
}
392392

393393
const buf_aligned_len = mem.alignForward(buf_unaligned.len, mem.page_size);
@@ -403,7 +403,7 @@ const PageAllocator = struct {
403403

404404
// TODO: call mremap
405405
// TODO: if the next_mmap_addr_hint is within the remapped range, update it
406-
return error.OutOfMemory;
406+
return null;
407407
}
408408

409409
fn free(_: *c_void, buf_unaligned: []u8, buf_align: u29, return_address: usize) void {
@@ -579,11 +579,11 @@ const WasmPageAllocator = struct {
579579
new_len: usize,
580580
len_align: u29,
581581
return_address: usize,
582-
) error{OutOfMemory}!usize {
582+
) ?usize {
583583
_ = buf_align;
584584
_ = return_address;
585585
const aligned_len = mem.alignForward(buf.len, mem.page_size);
586-
if (new_len > aligned_len) return error.OutOfMemory;
586+
if (new_len > aligned_len) return null;
587587
const current_n = nPages(aligned_len);
588588
const new_n = nPages(new_len);
589589
if (new_n != current_n) {
@@ -674,7 +674,7 @@ pub const HeapAllocator = switch (builtin.os.tag) {
674674
new_size: usize,
675675
len_align: u29,
676676
return_address: usize,
677-
) error{OutOfMemory}!usize {
677+
) ?usize {
678678
_ = buf_align;
679679
_ = return_address;
680680

@@ -686,7 +686,7 @@ pub const HeapAllocator = switch (builtin.os.tag) {
686686
os.windows.HEAP_REALLOC_IN_PLACE_ONLY,
687687
@intToPtr(*c_void, root_addr),
688688
amt,
689-
) orelse return error.OutOfMemory;
689+
) orelse return null;
690690
assert(new_ptr == @intToPtr(*c_void, root_addr));
691691
const return_len = init: {
692692
if (len_align == 0) break :init new_size;
@@ -788,14 +788,13 @@ pub const FixedBufferAllocator = struct {
788788
new_size: usize,
789789
len_align: u29,
790790
return_address: usize,
791-
) Allocator.Error!usize {
791+
) ?usize {
792792
_ = buf_align;
793793
_ = return_address;
794794
assert(self.ownsSlice(buf)); // sanity check
795795

796796
if (!self.isLastAllocation(buf)) {
797-
if (new_size > buf.len)
798-
return error.OutOfMemory;
797+
if (new_size > buf.len) return null;
799798
return mem.alignAllocLen(buf.len, new_size, len_align);
800799
}
801800

@@ -806,9 +805,8 @@ pub const FixedBufferAllocator = struct {
806805
}
807806

808807
const add = new_size - buf.len;
809-
if (add + self.end_index > self.buffer.len) {
810-
return error.OutOfMemory;
811-
}
808+
if (add + self.end_index > self.buffer.len) return null;
809+
812810
self.end_index += add;
813811
return new_size;
814812
}
@@ -891,7 +889,7 @@ pub fn StackFallbackAllocator(comptime size: usize) type {
891889
new_len: usize,
892890
len_align: u29,
893891
return_address: usize,
894-
) error{OutOfMemory}!usize {
892+
) ?usize {
895893
if (self.fixed_buffer_allocator.ownsPtr(buf.ptr)) {
896894
return FixedBufferAllocator.resize(&self.fixed_buffer_allocator, buf, buf_align, new_len, len_align, return_address);
897895
} else {

lib/std/heap/arena_allocator.zig

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,26 +78,23 @@ pub const ArenaAllocator = struct {
7878

7979
const bigger_buf_size = @sizeOf(BufNode) + new_end_index;
8080
// Try to grow the buffer in-place
81-
cur_node.data = self.child_allocator.resize(cur_node.data, bigger_buf_size) catch |err| switch (err) {
82-
error.OutOfMemory => {
83-
// Allocate a new node if that's not possible
84-
cur_node = try self.createNode(cur_buf.len, n + ptr_align);
85-
continue;
86-
},
81+
cur_node.data = self.child_allocator.resize(cur_node.data, bigger_buf_size) orelse {
82+
// Allocate a new node if that's not possible
83+
cur_node = try self.createNode(cur_buf.len, n + ptr_align);
84+
continue;
8785
};
8886
}
8987
}
9088

91-
fn resize(self: *ArenaAllocator, buf: []u8, buf_align: u29, new_len: usize, len_align: u29, ret_addr: usize) Allocator.Error!usize {
89+
fn resize(self: *ArenaAllocator, buf: []u8, buf_align: u29, new_len: usize, len_align: u29, ret_addr: usize) ?usize {
9290
_ = buf_align;
9391
_ = len_align;
9492
_ = ret_addr;
9593

96-
const cur_node = self.state.buffer_list.first orelse return error.OutOfMemory;
94+
const cur_node = self.state.buffer_list.first orelse return null;
9795
const cur_buf = cur_node.data[@sizeOf(BufNode)..];
9896
if (@ptrToInt(cur_buf.ptr) + self.state.end_index != @ptrToInt(buf.ptr) + buf.len) {
99-
if (new_len > buf.len)
100-
return error.OutOfMemory;
97+
if (new_len > buf.len) return null;
10198
return new_len;
10299
}
103100

@@ -108,7 +105,7 @@ pub const ArenaAllocator = struct {
108105
self.state.end_index += new_len - buf.len;
109106
return new_len;
110107
} else {
111-
return error.OutOfMemory;
108+
return null;
112109
}
113110
}
114111

lib/std/heap/general_purpose_allocator.zig

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
517517
new_size: usize,
518518
len_align: u29,
519519
ret_addr: usize,
520-
) Error!usize {
520+
) ?usize {
521521
const entry = self.large_allocations.getEntry(@ptrToInt(old_mem.ptr)) orelse {
522522
if (config.safety) {
523523
@panic("Invalid free");
@@ -557,15 +557,15 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
557557
if (config.enable_memory_limit) {
558558
const new_req_bytes = prev_req_bytes + new_size - entry.value_ptr.requested_size;
559559
if (new_req_bytes > prev_req_bytes and new_req_bytes > self.requested_memory_limit) {
560-
return error.OutOfMemory;
560+
return null;
561561
}
562562
self.total_requested_bytes = new_req_bytes;
563563
}
564564
errdefer if (config.enable_memory_limit) {
565565
self.total_requested_bytes = prev_req_bytes;
566566
};
567567

568-
const result_len = try self.backing_allocator.rawResize(old_mem, old_align, new_size, len_align, ret_addr);
568+
const result_len = self.backing_allocator.rawResize(old_mem, old_align, new_size, len_align, ret_addr) orelse return null;
569569

570570
if (config.enable_memory_limit) {
571571
entry.value_ptr.requested_size = new_size;
@@ -650,7 +650,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
650650
new_size: usize,
651651
len_align: u29,
652652
ret_addr: usize,
653-
) Error!usize {
653+
) ?usize {
654654
self.mutex.lock();
655655
defer self.mutex.unlock();
656656

@@ -705,7 +705,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
705705
if (config.enable_memory_limit) {
706706
const new_req_bytes = prev_req_bytes + new_size - old_mem.len;
707707
if (new_req_bytes > prev_req_bytes and new_req_bytes > self.requested_memory_limit) {
708-
return error.OutOfMemory;
708+
return null;
709709
}
710710
self.total_requested_bytes = new_req_bytes;
711711
}
@@ -726,7 +726,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
726726
}
727727
return new_size;
728728
}
729-
return error.OutOfMemory;
729+
return null;
730730
}
731731

732732
fn free(
@@ -1065,7 +1065,7 @@ test "shrink large object to large object" {
10651065
slice[0] = 0x12;
10661066
slice[60] = 0x34;
10671067

1068-
slice = try allocator.resize(slice, page_size * 2 + 1);
1068+
slice = allocator.resize(slice, page_size * 2 + 1) orelse return;
10691069
try std.testing.expect(slice[0] == 0x12);
10701070
try std.testing.expect(slice[60] == 0x34);
10711071

lib/std/heap/log_to_writer_allocator.zig

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,22 +45,23 @@ pub fn LogToWriterAllocator(comptime Writer: type) type {
4545
new_len: usize,
4646
len_align: u29,
4747
ra: usize,
48-
) error{OutOfMemory}!usize {
48+
) ?usize {
4949
if (new_len <= buf.len) {
5050
self.writer.print("shrink: {} to {}\n", .{ buf.len, new_len }) catch {};
5151
} else {
5252
self.writer.print("expand: {} to {}", .{ buf.len, new_len }) catch {};
5353
}
54+
5455
if (self.parent_allocator.rawResize(buf, buf_align, new_len, len_align, ra)) |resized_len| {
5556
if (new_len > buf.len) {
5657
self.writer.print(" success!\n", .{}) catch {};
5758
}
5859
return resized_len;
59-
} else |e| {
60-
std.debug.assert(new_len > buf.len);
61-
self.writer.print(" failure!\n", .{}) catch {};
62-
return e;
6360
}
61+
62+
std.debug.assert(new_len > buf.len);
63+
self.writer.print(" failure!\n", .{}) catch {};
64+
return null;
6465
}
6566

6667
fn free(
@@ -95,7 +96,7 @@ test "LogToWriterAllocator" {
9596
var a = try allocator.alloc(u8, 10);
9697
a = allocator.shrink(a, 5);
9798
try std.testing.expect(a.len == 5);
98-
try std.testing.expectError(error.OutOfMemory, allocator.resize(a, 20));
99+
try std.testing.expect(allocator.resize(a, 20) == null);
99100
allocator.free(a);
100101

101102
try std.testing.expectEqualSlices(u8,

lib/std/heap/logging_allocator.zig

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ pub fn ScopedLoggingAllocator(
7777
new_len: usize,
7878
len_align: u29,
7979
ra: usize,
80-
) error{OutOfMemory}!usize {
80+
) ?usize {
8181
if (self.parent_allocator.rawResize(buf, buf_align, new_len, len_align, ra)) |resized_len| {
8282
if (new_len <= buf.len) {
8383
logHelper(
@@ -94,15 +94,15 @@ pub fn ScopedLoggingAllocator(
9494
}
9595

9696
return resized_len;
97-
} else |err| {
98-
std.debug.assert(new_len > buf.len);
99-
logHelper(
100-
failure_log_level,
101-
"expand - failure: {s} - {} to {}, len_align: {}, buf_align: {}",
102-
.{ @errorName(err), buf.len, new_len, len_align, buf_align },
103-
);
104-
return err;
10597
}
98+
99+
std.debug.assert(new_len > buf.len);
100+
logHelper(
101+
failure_log_level,
102+
"expand - failure - {} to {}, len_align: {}, buf_align: {}",
103+
.{ buf.len, new_len, len_align, buf_align },
104+
);
105+
return null;
106106
}
107107

108108
fn free(

lib/std/mem.zig

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,14 @@ pub fn ValidationAllocator(comptime T: type) type {
8888
new_len: usize,
8989
len_align: u29,
9090
ret_addr: usize,
91-
) Allocator.Error!usize {
91+
) ?usize {
9292
assert(buf.len > 0);
9393
if (len_align != 0) {
9494
assert(mem.isAlignedAnyAlign(new_len, len_align));
9595
assert(new_len >= len_align);
9696
}
9797
const underlying = self.getUnderlyingAllocatorPtr();
98-
const result = try underlying.rawResize(buf, buf_align, new_len, len_align, ret_addr);
98+
const result = underlying.rawResize(buf, buf_align, new_len, len_align, ret_addr) orelse return null;
9999
if (len_align == 0) {
100100
assert(result == new_len);
101101
} else {
@@ -188,7 +188,7 @@ test "Allocator.resize" {
188188
defer testing.allocator.free(values);
189189

190190
for (values) |*v, i| v.* = @intCast(T, i);
191-
values = try testing.allocator.resize(values, values.len + 10);
191+
values = testing.allocator.resize(values, values.len + 10) orelse return error.OutOfMemory;
192192
try testing.expect(values.len == 110);
193193
}
194194

@@ -203,7 +203,7 @@ test "Allocator.resize" {
203203
defer testing.allocator.free(values);
204204

205205
for (values) |*v, i| v.* = @intToFloat(T, i);
206-
values = try testing.allocator.resize(values, values.len + 10);
206+
values = testing.allocator.resize(values, values.len + 10) orelse return error.OutOfMemory;
207207
try testing.expect(values.len == 110);
208208
}
209209
}

0 commit comments

Comments
 (0)