Skip to content

Commit 089ef53

Browse files
committed
Revert changes to fullreader
1 parent 658e5c9 commit 089ef53

File tree

2 files changed

+86
-121
lines changed

2 files changed

+86
-121
lines changed

internal/data/fullreader.go

Lines changed: 85 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package data
22

33
import (
44
"io"
5-
"sync"
65

76
"github.com/CalebQ42/squashfs/internal/decompress"
87
"github.com/CalebQ42/squashfs/internal/toreader"
@@ -27,9 +26,9 @@ func NewFullReader(r io.ReaderAt, start uint64, d decompress.Decompressor, block
2726
}
2827
}
2928

30-
func (r *FullReader) AddFragment(rdr func() (io.Reader, error), size uint32) {
29+
func (r *FullReader) AddFragment(rdr func() (io.Reader, error)) {
3130
r.fragRdr = rdr
32-
r.sizes = append(r.sizes, size)
31+
r.sizes = append(r.sizes, 0)
3332
}
3433

3534
type outDat struct {
@@ -38,50 +37,49 @@ type outDat struct {
3837
i int
3938
}
4039

41-
func (r FullReader) process(index int, offset int64, od *outDat, out chan *outDat) {
42-
defer func() {
43-
out <- od
44-
}()
45-
od.i = index
40+
func (r FullReader) process(index int, offset int64, out chan outDat) {
41+
var err error
42+
var dat []byte
43+
var rdr io.ReadCloser
4644
size := realSize(r.sizes[index])
4745
if size == 0 {
48-
od.err = nil
49-
od.data = make([]byte, r.blockSize)
46+
out <- outDat{
47+
i: index,
48+
err: nil,
49+
data: make([]byte, r.blockSize),
50+
}
5051
return
5152
}
53+
// rdr := io.LimitReader(toreader.NewReader(r.r, offset), int64(size))
5254
if size == r.sizes[index] {
5355
if dec, ok := r.d.(decompress.Decoder); ok {
54-
dat := make([]byte, size)
55-
_, od.err = r.r.ReadAt(dat, offset)
56-
if od.err != nil {
57-
return
56+
dat = make([]byte, size)
57+
_, err = r.r.ReadAt(dat, offset)
58+
if err == nil {
59+
dat, err = dec.Decode(dat, int(r.blockSize))
60+
}
61+
} else {
62+
rdr, err = r.d.Reader(io.LimitReader(toreader.NewReader(r.r, offset), int64(size)))
63+
if err == nil {
64+
dat, err = io.ReadAll(rdr)
5865
}
59-
od.data, od.err = dec.Decode(dat, int(r.blockSize))
60-
return
61-
}
62-
var rdr io.ReadCloser
63-
rdr, od.err = r.d.Reader(io.LimitReader(toreader.NewReader(r.r, offset), int64(size)))
64-
if od.err != nil {
65-
return
6666
}
67-
od.data = make([]byte, r.blockSize)
68-
var read int
69-
read, od.err = rdr.Read(od.data)
70-
od.data = od.data[:read]
71-
rdr.Close()
7267
} else {
73-
od.data = make([]byte, size)
74-
_, od.err = r.r.ReadAt(od.data, offset)
68+
dat = make([]byte, size)
69+
_, err = r.r.ReadAt(dat, offset)
70+
}
71+
out <- outDat{
72+
i: index,
73+
err: err,
74+
data: dat,
75+
}
76+
if clr, ok := rdr.(io.Closer); ok {
77+
clr.Close()
7578
}
7679
}
7780

7881
func (r FullReader) ReadAt(p []byte, off int64) (n int, err error) {
79-
pol := &sync.Pool{
80-
New: func() any {
81-
return new(outDat)
82-
},
83-
}
84-
out := make(chan *outDat, len(r.sizes))
82+
out := make(chan outDat, len(r.sizes))
8583
offset := r.start
8684
num := len(r.sizes)
8785
start := off / int64(r.blockSize)
@@ -101,42 +99,40 @@ func (r FullReader) ReadAt(p []byte, off int64) (n int, err error) {
10199
offset += uint64(realSize(r.sizes[i]))
102100
continue
103101
}
104-
od := pol.Get().(*outDat)
105102
if i == num-1 && r.fragRdr != nil {
106103
go func() {
107-
defer func() {
108-
out <- od
109-
}()
110104
rdr, e := r.fragRdr()
111105
if err != nil {
112-
od.i = num - 1
113-
od.err = e
106+
out <- outDat{
107+
i: num - 1,
108+
err: e,
109+
}
114110
return
115111
}
116-
od.data = make([]byte, r.sizes[num-1])
117-
_, e = rdr.Read(od.data)
118-
od.i = num - 1
119-
od.err = e
112+
dat, e := io.ReadAll(rdr)
113+
out <- outDat{
114+
i: num - 1,
115+
err: e,
116+
data: dat,
117+
}
120118
if clr, ok := rdr.(io.Closer); ok {
121119
clr.Close()
122120
}
123121
}()
124122
continue
125123
}
126-
go r.process(i, int64(offset), od, out)
124+
go r.process(i, int64(offset), out)
127125
offset += uint64(realSize(r.sizes[i]))
128126
}
129-
cur := start
130127
cache := make(map[int]outDat)
131-
for dat := range out {
128+
for cur := start; cur < int64(end); {
129+
dat := <-out
132130
if dat.err != nil {
133131
err = dat.err
134-
pol.Put(dat)
135132
return
136133
}
137134
if dat.i != int(cur) {
138-
cache[dat.i] = *dat
139-
pol.Put(dat)
135+
cache[dat.i] = dat
140136
continue
141137
}
142138
if cur == start {
@@ -147,18 +143,16 @@ func (r FullReader) ReadAt(p []byte, off int64) (n int, err error) {
147143
}
148144
n += len(dat.data)
149145
cur++
150-
pol.Put(dat)
151146
var ok bool
152-
var curDat outDat
153147
for {
154-
curDat, ok = cache[int(cur)]
148+
dat, ok = cache[int(cur)]
155149
if !ok {
156150
break
157151
}
158-
for i := range curDat.data {
159-
p[n+i] = curDat.data[i]
152+
for i := range dat.data {
153+
p[n+i] = dat.data[i]
160154
}
161-
n += len(curDat.data)
155+
n += len(dat.data)
162156
cur++
163157
delete(cache, int(cur))
164158
}
@@ -170,94 +164,65 @@ func (r FullReader) ReadAt(p []byte, off int64) (n int, err error) {
170164
}
171165

172166
func (r FullReader) WriteTo(w io.Writer) (n int64, err error) {
173-
pol := &sync.Pool{
174-
New: func() any {
175-
return new(outDat)
176-
},
177-
}
178-
out := make(chan *outDat, len(r.sizes))
167+
out := make(chan outDat, len(r.sizes))
179168
offset := r.start
180169
num := len(r.sizes)
181170
for i := 0; i < num; i++ {
182-
od := pol.Get().(*outDat)
183171
if i == num-1 && r.fragRdr != nil {
184172
go func() {
185-
defer func() {
186-
out <- od
187-
}()
188173
rdr, e := r.fragRdr()
189174
if err != nil {
190-
od.i = num - 1
191-
od.err = e
175+
out <- outDat{
176+
i: num - 1,
177+
err: e,
178+
}
192179
return
193180
}
194-
buf := make([]byte, r.sizes[num-1])
195-
_, e = rdr.Read(buf)
196-
od.i = num - 1
197-
od.err = e
198-
od.data = buf
181+
dat, e := io.ReadAll(rdr)
182+
out <- outDat{
183+
i: num - 1,
184+
err: e,
185+
data: dat,
186+
}
199187
if clr, ok := rdr.(io.Closer); ok {
200188
clr.Close()
201189
}
202190
}()
203191
continue
204192
}
205-
go r.process(i, int64(offset), od, out)
193+
go r.process(i, int64(offset), out)
206194
offset += uint64(realSize(r.sizes[i]))
207195
}
208-
wt, ok := w.(io.WriterAt)
209-
if !ok {
210-
var cur int
211-
cache := make(map[int]outDat)
212-
var tmpN int
213-
var dat *outDat
214-
for cur < len(r.sizes) {
215-
dat = <-out
216-
defer pol.Put(dat)
217-
if dat.err != nil {
218-
err = dat.err
219-
return
220-
}
221-
if dat.i != cur {
222-
cache[dat.i] = *dat
223-
continue
196+
cache := make(map[int]outDat)
197+
var tmpN int
198+
for cur := 0; cur < num; {
199+
dat := <-out
200+
if dat.err != nil {
201+
err = dat.err
202+
return
203+
}
204+
if dat.i != cur {
205+
cache[dat.i] = dat
206+
continue
207+
}
208+
tmpN, err = w.Write(dat.data)
209+
n += int64(tmpN)
210+
if err != nil {
211+
return
212+
}
213+
cur++
214+
var ok bool
215+
for {
216+
dat, ok = cache[cur]
217+
if !ok {
218+
break
224219
}
225220
tmpN, err = w.Write(dat.data)
226221
n += int64(tmpN)
227222
if err != nil {
228223
return
229224
}
230225
cur++
231-
var ok bool
232-
var curDat outDat
233-
for {
234-
curDat, ok = cache[cur]
235-
if !ok {
236-
break
237-
}
238-
tmpN, err = w.Write(curDat.data)
239-
n += int64(tmpN)
240-
if err != nil {
241-
return
242-
}
243-
cur++
244-
}
245-
}
246-
} else {
247-
var done int
248-
var dat *outDat
249-
for done < len(r.sizes) {
250-
dat = <-out
251-
defer pol.Put(dat)
252-
if dat.err != nil {
253-
err = dat.err
254-
return
255-
}
256-
_, err = wt.WriteAt(dat.data, int64(dat.i*int(r.blockSize)))
257-
if err != nil {
258-
return
259-
}
260-
done++
261226
}
262227
}
263228
return

reader_inode.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func (r Reader) getReaders(i inode.Inode) (full *data.FullReader, rdr *data.Read
7070
}
7171
fragRdr = io.LimitReader(fragRdr, int64(fragSize))
7272
return fragRdr, nil
73-
}, fragSize)
73+
})
7474
var fragRdr io.Reader
7575
fragRdr, err = r.fragReader(fragInd)
7676
if err != nil {

0 commit comments

Comments
 (0)