diff options
Diffstat (limited to 'src/storage/image-manager/root.zig')
| -rw-r--r-- | src/storage/image-manager/root.zig | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/storage/image-manager/root.zig b/src/storage/image-manager/root.zig index 4188b88..c99ac00 100644 --- a/src/storage/image-manager/root.zig +++ b/src/storage/image-manager/root.zig @@ -103,3 +103,37 @@ pub fn first_by_timestamp(self: *Self) memora.locked.Shared(?*Timestamp) { .rw_lock = &self.rw_lock, }; } + +pub fn delete(self: *Self, storage: *Storage, id: []const u8) !void { + self.rw_lock.lock(); + defer self.rw_lock.unlock(); + + const index = index: { + for (self.items.items, 0..) |image, index| { + if (std.mem.eql(u8, image.id, id)) { + break :index index; + } + } + break :index null; + }; + + if (index) |idx| { + try self.items.items[idx].delete(storage); + const old_index = self.items.items.len - 1; + _ = self.items.swapRemove(idx); + + var current: ?*Timestamp = if (self.timestamp_order.first) |c| @fieldParentPtr("node", c) else null; + + while (current) |c| { + if (c.index == idx) { + self.timestamp_order.remove(&c.node); + storage.allocator.destroy(c); + } else if (c.index == old_index) { + c.index = idx; + break; + } + + current = c.next(); + } + } +} |