diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2023-02-12 16:17:02 -0700 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2023-02-12 16:17:02 -0700 |
commit | cfcc753dc8906817e15b1b7c36b4dc12462d12e4 (patch) | |
tree | f5d2aa0caaa4cb336017ba7595c3425f4aa00bfc /lib/btrfs/btrfsitem/item_chunk.go | |
parent | 29b6b9f997913f13a0bff8bb1278a61302413615 (diff) | |
parent | f76faa4b8debd9c94751a03dd65e46c80a340a82 (diff) |
Merge branch 'lukeshu/fast'
Diffstat (limited to 'lib/btrfs/btrfsitem/item_chunk.go')
-rw-r--r-- | lib/btrfs/btrfsitem/item_chunk.go | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/lib/btrfs/btrfsitem/item_chunk.go b/lib/btrfs/btrfsitem/item_chunk.go index 1f1d577..2280a0b 100644 --- a/lib/btrfs/btrfsitem/item_chunk.go +++ b/lib/btrfs/btrfsitem/item_chunk.go @@ -1,4 +1,4 @@ -// Copyright (C) 2022 Luke Shumaker <lukeshu@lukeshu.com> +// Copyright (C) 2022-2023 Luke Shumaker <lukeshu@lukeshu.com> // // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,7 +15,7 @@ import ( // // key.objectid = BTRFS_FIRST_CHUNK_TREE_OBJECTID // key.offset = logical_addr -type Chunk struct { // CHUNK_ITEM=228 +type Chunk struct { // complex CHUNK_ITEM=228 Head ChunkHeader Stripes []ChunkStripe } @@ -60,20 +60,36 @@ func (chunk Chunk) Mappings(key btrfsprim.Key) []btrfsvol.Mapping { return ret } +var chunkStripePool containers.SlicePool[ChunkStripe] + +func (chunk *Chunk) Free() { + for i := range chunk.Stripes { + chunk.Stripes[i] = ChunkStripe{} + } + chunkStripePool.Put(chunk.Stripes) + *chunk = Chunk{} + chunkPool.Put(chunk) +} + +func (chunk Chunk) Clone() Chunk { + ret := chunk + ret.Stripes = chunkStripePool.Get(len(chunk.Stripes)) + copy(ret.Stripes, chunk.Stripes) + return ret +} + func (chunk *Chunk) UnmarshalBinary(dat []byte) (int, error) { n, err := binstruct.Unmarshal(dat, &chunk.Head) if err != nil { return n, err } - chunk.Stripes = nil - for i := 0; i < int(chunk.Head.NumStripes); i++ { - var stripe ChunkStripe - _n, err := binstruct.Unmarshal(dat[n:], &stripe) + chunk.Stripes = chunkStripePool.Get(int(chunk.Head.NumStripes)) + for i := range chunk.Stripes { + _n, err := binstruct.Unmarshal(dat[n:], &chunk.Stripes[i]) n += _n if err != nil { return n, err } - chunk.Stripes = append(chunk.Stripes, stripe) } return n, nil } |