From 677755c799c1b6b942349c7d9de836335c7bbf55 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Fri, 3 Feb 2023 11:32:52 -0700 Subject: btrfsitem: Have all Item implementations be pointers to structs --- lib/btrfs/btrfsitem/item_inoderef.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'lib/btrfs/btrfsitem/item_inoderef.go') diff --git a/lib/btrfs/btrfsitem/item_inoderef.go b/lib/btrfs/btrfsitem/item_inoderef.go index 083f19e..c90fe44 100644 --- a/lib/btrfs/btrfsitem/item_inoderef.go +++ b/lib/btrfs/btrfsitem/item_inoderef.go @@ -1,4 +1,4 @@ -// Copyright (C) 2022 Luke Shumaker +// Copyright (C) 2022-2023 Luke Shumaker // // SPDX-License-Identifier: GPL-2.0-or-later @@ -16,10 +16,12 @@ import ( // // Might have multiple entries if the same file has multiple hardlinks // in the same directory. -type InodeRefs []InodeRef // INODE_REF=12 +type InodeRefs struct { // INODE_REF=12 + Refs []InodeRef +} func (o *InodeRefs) UnmarshalBinary(dat []byte) (int, error) { - *o = nil + o.Refs = nil n := 0 for n < len(dat) { var ref InodeRef @@ -28,14 +30,14 @@ func (o *InodeRefs) UnmarshalBinary(dat []byte) (int, error) { if err != nil { return n, err } - *o = append(*o, ref) + o.Refs = append(o.Refs, ref) } return n, nil } func (o InodeRefs) MarshalBinary() ([]byte, error) { var dat []byte - for _, ref := range o { + for _, ref := range o.Refs { _dat, err := binstruct.Marshal(ref) dat = append(dat, _dat...) if err != nil { -- cgit v1.2.3-2-g168b From 21e92e5dea4d8efc65403eeaee91b32856b86cb6 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Fri, 3 Feb 2023 13:04:17 -0700 Subject: btrfsitem: Add `Free` and `CloneItem` methods to Items --- lib/btrfs/btrfsitem/item_inoderef.go | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'lib/btrfs/btrfsitem/item_inoderef.go') diff --git a/lib/btrfs/btrfsitem/item_inoderef.go b/lib/btrfs/btrfsitem/item_inoderef.go index c90fe44..074b26d 100644 --- a/lib/btrfs/btrfsitem/item_inoderef.go +++ b/lib/btrfs/btrfsitem/item_inoderef.go @@ -9,6 +9,7 @@ import ( "git.lukeshu.com/btrfs-progs-ng/lib/binstruct" "git.lukeshu.com/btrfs-progs-ng/lib/binstruct/binutil" + "git.lukeshu.com/btrfs-progs-ng/lib/containers" ) // key.objectid = inode number of the file @@ -16,12 +17,37 @@ import ( // // Might have multiple entries if the same file has multiple hardlinks // in the same directory. -type InodeRefs struct { // INODE_REF=12 +type InodeRefs struct { // complex INODE_REF=12 Refs []InodeRef } +var inodeRefPool containers.SlicePool[InodeRef] + +func (o *InodeRefs) Free() { + for i := range o.Refs { + bytePool.Put(o.Refs[i].Name) + o.Refs[i] = InodeRef{} + } + inodeRefPool.Put(o.Refs) + *o = InodeRefs{} + inodeRefsPool.Put(o) +} + +func (o InodeRefs) Clone() InodeRefs { + var ret InodeRefs + ret.Refs = inodeRefPool.Get(len(o.Refs)) + copy(ret.Refs, o.Refs) + for i := range ret.Refs { + ret.Refs[i].Name = cloneBytes(o.Refs[i].Name) + } + return ret +} + func (o *InodeRefs) UnmarshalBinary(dat []byte) (int, error) { o.Refs = nil + if len(dat) > 0 { + o.Refs = inodeRefPool.Get(1)[:0] + } n := 0 for n < len(dat) { var ref InodeRef @@ -70,7 +96,7 @@ func (o *InodeRef) UnmarshalBinary(dat []byte) (int, error) { return 0, err } dat = dat[n:] - o.Name = dat[:o.NameLen] + o.Name = cloneBytes(dat[:o.NameLen]) n += int(o.NameLen) return n, nil } -- cgit v1.2.3-2-g168b