authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-21 18:32:01-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-22 11:32:14-07:00
log7b3556a8cff1edb63a331c5068902254b0b2126c
treefde806d25ef94b0d35dda421a1a491d5e268cf4a
parentf6549a956d640c1de2dc99340582950f9dc18c60

std.fs: make deleteTree use ArrayList instead of BoundedArray

We definitely want ArrayList in the standard library. Do we want BoundedArray? Maybe, maybe not. But that makes ArrayList a more stable dependency for std.fs.

1 files changed, 15 insertions(+), 14 deletions(-)

lib/std/fs.zig+15-14
...@@ -2204,28 +2204,29 @@ pub const Dir = struct {...@@ -2204,28 +2204,29 @@ pub const Dir = struct {
2204 name: []const u8,2204 name: []const u8,
2205 parent_dir: Dir,2205 parent_dir: Dir,
2206 iter: IterableDir.Iterator,2206 iter: IterableDir.Iterator,
2207 };
22082207
2209 var stack = std.BoundedArray(StackItem, 16){};2208 fn closeAll(items: []@This()) void {
2210 defer {2209 for (items) |*item| item.iter.dir.close();
2211 for (stack.slice()) |*item| {
2212 item.iter.dir.close();
2213 }2210 }
2214 }2211 };
22152212
2216 stack.appendAssumeCapacity(StackItem{2213 var stack_buffer: [16]StackItem = undefined;
2214 var stack = std.ArrayListUnmanaged(StackItem).initBuffer(&stack_buffer);
2215 defer StackItem.closeAll(stack.items);
2216
2217 stack.appendAssumeCapacity(.{
2217 .name = sub_path,2218 .name = sub_path,
2218 .parent_dir = self,2219 .parent_dir = self,
2219 .iter = initial_iterable_dir.iterateAssumeFirstIteration(),2220 .iter = initial_iterable_dir.iterateAssumeFirstIteration(),
2220 });2221 });
22212222
2222 process_stack: while (stack.len != 0) {2223 process_stack: while (stack.items.len != 0) {
2223 var top = &(stack.slice()[stack.len - 1]);2224 var top = &stack.items[stack.items.len - 1];
2224 while (try top.iter.next()) |entry| {2225 while (try top.iter.next()) |entry| {
2225 var treat_as_dir = entry.kind == .directory;2226 var treat_as_dir = entry.kind == .directory;
2226 handle_entry: while (true) {2227 handle_entry: while (true) {
2227 if (treat_as_dir) {2228 if (treat_as_dir) {
2228 if (stack.ensureUnusedCapacity(1)) {2229 if (stack.unusedCapacitySlice().len >= 1) {
2229 var iterable_dir = top.iter.dir.openIterableDir(entry.name, .{ .no_follow = true }) catch |err| switch (err) {2230 var iterable_dir = top.iter.dir.openIterableDir(entry.name, .{ .no_follow = true }) catch |err| switch (err) {
2230 error.NotDir => {2231 error.NotDir => {
2231 treat_as_dir = false;2232 treat_as_dir = false;
...@@ -2251,13 +2252,13 @@ pub const Dir = struct {...@@ -2251,13 +2252,13 @@ pub const Dir = struct {
2251 error.DeviceBusy,2252 error.DeviceBusy,
2252 => |e| return e,2253 => |e| return e,
2253 };2254 };
2254 stack.appendAssumeCapacity(StackItem{2255 stack.appendAssumeCapacity(.{
2255 .name = entry.name,2256 .name = entry.name,
2256 .parent_dir = top.iter.dir,2257 .parent_dir = top.iter.dir,
2257 .iter = iterable_dir.iterateAssumeFirstIteration(),2258 .iter = iterable_dir.iterateAssumeFirstIteration(),
2258 });2259 });
2259 continue :process_stack;2260 continue :process_stack;
2260 } else |_| {2261 } else {
2261 try top.iter.dir.deleteTreeMinStackSizeWithKindHint(entry.name, entry.kind);2262 try top.iter.dir.deleteTreeMinStackSizeWithKindHint(entry.name, entry.kind);
2262 break :handle_entry;2263 break :handle_entry;
2263 }2264 }
...@@ -2301,7 +2302,7 @@ pub const Dir = struct {...@@ -2301,7 +2302,7 @@ pub const Dir = struct {
2301 // pop the value from the stack.2302 // pop the value from the stack.
2302 const parent_dir = top.parent_dir;2303 const parent_dir = top.parent_dir;
2303 const name = top.name;2304 const name = top.name;
2304 _ = stack.pop();2305 stack.items.len -= 1;
23052306
2306 var need_to_retry: bool = false;2307 var need_to_retry: bool = false;
2307 parent_dir.deleteDir(name) catch |err| switch (err) {2308 parent_dir.deleteDir(name) catch |err| switch (err) {
...@@ -2374,7 +2375,7 @@ pub const Dir = struct {...@@ -2374,7 +2375,7 @@ pub const Dir = struct {
2374 };2375 };
2375 // We know there is room on the stack since we are just re-adding2376 // We know there is room on the stack since we are just re-adding
2376 // the StackItem that we previously popped.2377 // the StackItem that we previously popped.
2377 stack.appendAssumeCapacity(StackItem{2378 stack.appendAssumeCapacity(.{
2378 .name = name,2379 .name = name,
2379 .parent_dir = parent_dir,2380 .parent_dir = parent_dir,
2380 .iter = iterable_dir.iterateAssumeFirstIteration(),2381 .iter = iterable_dir.iterateAssumeFirstIteration(),