diff --git a/internal/rosa/report.go b/internal/rosa/report.go index c002227..2d8b064 100644 --- a/internal/rosa/report.go +++ b/internal/rosa/report.go @@ -105,9 +105,9 @@ func WriteReport(msg message.Msg, w io.Writer, c *pkg.Cache) error { // Report provides efficient access to a report file populated by [WriteReport]. type Report struct { - // Underlying file, must not be exposed directly. - f *os.File - // Slice backed by f. Access must be prepared by HandleAccess. + // Slice backed by the underlying file. + // + // Access must be prepared by HandleAccess. data []byte // Offsets into data for each identifier. @@ -121,31 +121,31 @@ type Report struct { // OpenReport opens a file populated by [WriteReport] func OpenReport(pathname string) (rp *Report, err error) { - var r Report - if r.f, err = os.Open(pathname); err != nil { + var f *os.File + if f, err = os.Open(pathname); err != nil { return } - defer func() { - if err != nil { - _ = r.f.Close() - if r.data != nil { - _ = syscall.Munmap(r.data) - } - } - }() var fi os.FileInfo - if fi, err = r.f.Stat(); err != nil { + if fi, err = f.Stat(); err != nil { + _ = f.Close() return } + var r Report if r.data, err = syscall.Mmap( - int(r.f.Fd()), + int(f.Fd()), 0, int(fi.Size()), syscall.PROT_READ, syscall.MAP_PRIVATE, ); err != nil { + _ = f.Close() + return + } + + if err = f.Close(); err != nil { + _ = r.Close() return } @@ -230,9 +230,6 @@ func (r *Report) ArtifactOf(id unique.Handle[pkg.ID]) (status []byte, n int64) { // Close closes the underlying file and releases all associated resources. func (r *Report) Close() error { - r.closeOnce.Do(func() { - err := syscall.Munmap(r.data) - r.closeErr = errors.Join(err, r.f.Close()) - }) + r.closeOnce.Do(func() { r.closeErr = syscall.Munmap(r.data) }) return r.closeErr }