@@ -2,7 +2,6 @@ package data
2
2
3
3
import (
4
4
"io"
5
- "sync"
6
5
7
6
"github.com/CalebQ42/squashfs/internal/decompress"
8
7
"github.com/CalebQ42/squashfs/internal/toreader"
@@ -27,9 +26,9 @@ func NewFullReader(r io.ReaderAt, start uint64, d decompress.Decompressor, block
27
26
}
28
27
}
29
28
30
- func (r * FullReader ) AddFragment (rdr func () (io.Reader , error ), size uint32 ) {
29
+ func (r * FullReader ) AddFragment (rdr func () (io.Reader , error )) {
31
30
r .fragRdr = rdr
32
- r .sizes = append (r .sizes , size )
31
+ r .sizes = append (r .sizes , 0 )
33
32
}
34
33
35
34
type outDat struct {
@@ -38,50 +37,49 @@ type outDat struct {
38
37
i int
39
38
}
40
39
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
46
44
size := realSize (r .sizes [index ])
47
45
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
+ }
50
51
return
51
52
}
53
+ // rdr := io.LimitReader(toreader.NewReader(r.r, offset), int64(size))
52
54
if size == r .sizes [index ] {
53
55
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 )
58
65
}
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
66
66
}
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 ()
72
67
} 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 ()
75
78
}
76
79
}
77
80
78
81
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 ))
85
83
offset := r .start
86
84
num := len (r .sizes )
87
85
start := off / int64 (r .blockSize )
@@ -101,42 +99,40 @@ func (r FullReader) ReadAt(p []byte, off int64) (n int, err error) {
101
99
offset += uint64 (realSize (r .sizes [i ]))
102
100
continue
103
101
}
104
- od := pol .Get ().(* outDat )
105
102
if i == num - 1 && r .fragRdr != nil {
106
103
go func () {
107
- defer func () {
108
- out <- od
109
- }()
110
104
rdr , e := r .fragRdr ()
111
105
if err != nil {
112
- od .i = num - 1
113
- od .err = e
106
+ out <- outDat {
107
+ i : num - 1 ,
108
+ err : e ,
109
+ }
114
110
return
115
111
}
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
+ }
120
118
if clr , ok := rdr .(io.Closer ); ok {
121
119
clr .Close ()
122
120
}
123
121
}()
124
122
continue
125
123
}
126
- go r .process (i , int64 (offset ), od , out )
124
+ go r .process (i , int64 (offset ), out )
127
125
offset += uint64 (realSize (r .sizes [i ]))
128
126
}
129
- cur := start
130
127
cache := make (map [int ]outDat )
131
- for dat := range out {
128
+ for cur := start ; cur < int64 (end ); {
129
+ dat := <- out
132
130
if dat .err != nil {
133
131
err = dat .err
134
- pol .Put (dat )
135
132
return
136
133
}
137
134
if dat .i != int (cur ) {
138
- cache [dat .i ] = * dat
139
- pol .Put (dat )
135
+ cache [dat .i ] = dat
140
136
continue
141
137
}
142
138
if cur == start {
@@ -147,18 +143,16 @@ func (r FullReader) ReadAt(p []byte, off int64) (n int, err error) {
147
143
}
148
144
n += len (dat .data )
149
145
cur ++
150
- pol .Put (dat )
151
146
var ok bool
152
- var curDat outDat
153
147
for {
154
- curDat , ok = cache [int (cur )]
148
+ dat , ok = cache [int (cur )]
155
149
if ! ok {
156
150
break
157
151
}
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 ]
160
154
}
161
- n += len (curDat .data )
155
+ n += len (dat .data )
162
156
cur ++
163
157
delete (cache , int (cur ))
164
158
}
@@ -170,94 +164,65 @@ func (r FullReader) ReadAt(p []byte, off int64) (n int, err error) {
170
164
}
171
165
172
166
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 ))
179
168
offset := r .start
180
169
num := len (r .sizes )
181
170
for i := 0 ; i < num ; i ++ {
182
- od := pol .Get ().(* outDat )
183
171
if i == num - 1 && r .fragRdr != nil {
184
172
go func () {
185
- defer func () {
186
- out <- od
187
- }()
188
173
rdr , e := r .fragRdr ()
189
174
if err != nil {
190
- od .i = num - 1
191
- od .err = e
175
+ out <- outDat {
176
+ i : num - 1 ,
177
+ err : e ,
178
+ }
192
179
return
193
180
}
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
+ }
199
187
if clr , ok := rdr .(io.Closer ); ok {
200
188
clr .Close ()
201
189
}
202
190
}()
203
191
continue
204
192
}
205
- go r .process (i , int64 (offset ), od , out )
193
+ go r .process (i , int64 (offset ), out )
206
194
offset += uint64 (realSize (r .sizes [i ]))
207
195
}
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
224
219
}
225
220
tmpN , err = w .Write (dat .data )
226
221
n += int64 (tmpN )
227
222
if err != nil {
228
223
return
229
224
}
230
225
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 ++
261
226
}
262
227
}
263
228
return
0 commit comments