changed when cartridgeloader is created for log/video regression

creating the cartridgeloader later in the regression process gives a
clearer indication of when and if the cartridgeloader is closed properly
This commit is contained in:
JetSetIlly 2024-04-16 22:37:16 +01:00
parent 28ae543e36
commit 7ed001c4c1
6 changed files with 49 additions and 43 deletions

View file

@ -32,8 +32,14 @@ func decideOnName(ld Loader) string {
return "" return ""
} }
name := filepath.Base(ld.Filename) return NameFromFilename(ld.Filename)
name = strings.TrimSuffix(name, filepath.Ext(ld.Filename)) }
// NameFromFilename converts a filename to a shortened version suitable for
// display. Useful in some contexts where creating a cartridge loader instance
// is inconvenient.
func NameFromFilename(filename string) string {
name := filepath.Base(filename)
name = strings.TrimSuffix(name, filepath.Ext(filename))
return name return name
} }

View file

@ -1337,14 +1337,13 @@ func (dbg *Debugger) startComparison(comparisonROM string, comparisonPrefs strin
return err return err
} }
// cartload is passed to comparision.CreateFromLoader(). closure will be
// handled from there
cartload, err := cartridgeloader.NewLoaderFromFilename(comparisonROM, "AUTO") cartload, err := cartridgeloader.NewLoaderFromFilename(comparisonROM, "AUTO")
if err != nil { if err != nil {
return err return err
} }
// comparision emulation handles closure of cartridgeloader // cartload is passed to comparision.CreateFromLoader(). closure will be
// handled from there when comparision emulation ends
dbg.comparison.CreateFromLoader(cartload) dbg.comparison.CreateFromLoader(cartload)
// check use of comparison prefs // check use of comparison prefs

View file

@ -785,19 +785,14 @@ with the LOG mode. Note that asking for log output will suppress regression prog
switch strings.ToUpper(regressMode) { switch strings.ToUpper(regressMode) {
case "VIDEO": case "VIDEO":
cartload, err := cartridgeloader.NewLoaderFromFilename(args[0], mapping)
if err != nil {
return err
}
defer cartload.Close()
statetype, err := regression.NewStateType(state) statetype, err := regression.NewStateType(state)
if err != nil { if err != nil {
return err return err
} }
regressor = &regression.VideoRegression{ regressor = &regression.VideoRegression{
CartLoad: cartload, Cartridge: args[0],
Mapping: mapping,
TVtype: strings.ToUpper(spec), TVtype: strings.ToUpper(spec),
NumFrames: numFrames, NumFrames: numFrames,
State: statetype, State: statetype,
@ -811,14 +806,9 @@ with the LOG mode. Note that asking for log output will suppress regression prog
Notes: notes, Notes: notes,
} }
case "LOG": case "LOG":
cartload, err := cartridgeloader.NewLoaderFromFilename(args[0], mapping)
if err != nil {
return err
}
defer cartload.Close()
regressor = &regression.LogRegression{ regressor = &regression.LogRegression{
CartLoad: cartload, Cartridge: args[0],
Mapping: mapping,
TVtype: strings.ToUpper(spec), TVtype: strings.ToUpper(spec),
NumFrames: numFrames, NumFrames: numFrames,
Notes: notes, Notes: notes,

View file

@ -111,7 +111,6 @@ func (plb *Playback) readHeader(lines []string, checkROM bool) error {
var err error var err error
// read header
plb.CartLoad, err = cartridgeloader.NewLoaderFromFilename(lines[lineCartName], "AUTO") plb.CartLoad, err = cartridgeloader.NewLoaderFromFilename(lines[lineCartName], "AUTO")
if err != nil { if err != nil {
return fmt.Errorf("playback: %w", err) return fmt.Errorf("playback: %w", err)

View file

@ -48,7 +48,8 @@ const (
// the run. Regression passes if the subsequent runs produce the same // the run. Regression passes if the subsequent runs produce the same
// log/digest. // log/digest.
type LogRegression struct { type LogRegression struct {
CartLoad cartridgeloader.Loader Cartridge string
Mapping string
TVtype string TVtype string
NumFrames int NumFrames int
Notes string Notes string
@ -66,18 +67,14 @@ func deserialiseLogEntry(fields database.SerialisedEntry) (database.Entry, error
return nil, fmt.Errorf("log: too few fields") return nil, fmt.Errorf("log: too few fields")
} }
var err error reg.Cartridge = fields[videoFieldCartName]
reg.Mapping = fields[videoFieldCartMapping]
// string fields need no conversion
reg.CartLoad, err = cartridgeloader.NewLoaderFromFilename(fields[videoFieldCartName], fields[videoFieldCartMapping])
if err != nil {
return nil, fmt.Errorf("log: %w", err)
}
reg.TVtype = fields[logFieldTVtype] reg.TVtype = fields[logFieldTVtype]
reg.digest = fields[logFieldDigest] reg.digest = fields[logFieldDigest]
reg.Notes = fields[logFieldNotes] reg.Notes = fields[logFieldNotes]
// convert number of frames field var err error
reg.NumFrames, err = strconv.Atoi(fields[logFieldNumFrames]) reg.NumFrames, err = strconv.Atoi(fields[logFieldNumFrames])
if err != nil { if err != nil {
msg := fmt.Sprintf("invalid numFrames field [%s]", fields[logFieldNumFrames]) msg := fmt.Sprintf("invalid numFrames field [%s]", fields[logFieldNumFrames])
@ -95,8 +92,8 @@ func (reg LogRegression) EntryType() string {
// Serialise implements the database.Entry interface. // Serialise implements the database.Entry interface.
func (reg *LogRegression) Serialise() (database.SerialisedEntry, error) { func (reg *LogRegression) Serialise() (database.SerialisedEntry, error) {
return database.SerialisedEntry{ return database.SerialisedEntry{
reg.CartLoad.Filename, reg.Cartridge,
reg.CartLoad.Mapping, reg.Mapping,
reg.TVtype, reg.TVtype,
strconv.Itoa(reg.NumFrames), strconv.Itoa(reg.NumFrames),
reg.digest, reg.digest,
@ -114,7 +111,9 @@ func (reg LogRegression) CleanUp() error {
func (reg LogRegression) String() string { func (reg LogRegression) String() string {
s := strings.Builder{} s := strings.Builder{}
s.WriteString(fmt.Sprintf("[%s] %s [%s] frames=%d", reg.EntryType(), reg.CartLoad.Name, reg.TVtype, reg.NumFrames)) s.WriteString(fmt.Sprintf("[%s] %s [%s] frames=%d", reg.EntryType(),
cartridgeloader.NameFromFilename(reg.Cartridge),
reg.TVtype, reg.NumFrames))
if reg.Notes != "" { if reg.Notes != "" {
s.WriteString(fmt.Sprintf(" [%s]", reg.Notes)) s.WriteString(fmt.Sprintf(" [%s]", reg.Notes))
} }
@ -146,7 +145,13 @@ func (reg *LogRegression) regress(newRegression bool, output io.Writer, msg stri
// default the hardware preferences // default the hardware preferences
vcs.Env.Normalise() vcs.Env.Normalise()
err = setup.AttachCartridge(vcs, reg.CartLoad, true) cartload, err := cartridgeloader.NewLoaderFromFilename(reg.Cartridge, reg.Mapping)
if err != nil {
return false, "", fmt.Errorf("log: %w", err)
}
defer cartload.Close()
err = setup.AttachCartridge(vcs, cartload, true)
if err != nil { if err != nil {
return false, "", fmt.Errorf("log: %w", err) return false, "", fmt.Errorf("log: %w", err)
} }

View file

@ -52,7 +52,8 @@ const (
// emulation for N frames and the video recorded at that point. Regression // emulation for N frames and the video recorded at that point. Regression
// passes if subsequenct runs produce the same video value. // passes if subsequenct runs produce the same video value.
type VideoRegression struct { type VideoRegression struct {
CartLoad cartridgeloader.Loader Cartridge string
Mapping string
TVtype string TVtype string
NumFrames int NumFrames int
State StateType State StateType
@ -76,10 +77,8 @@ func deserialiseVideoEntry(fields database.SerialisedEntry) (database.Entry, err
var err error var err error
// string fields need no conversion // string fields need no conversion
reg.CartLoad, err = cartridgeloader.NewLoaderFromFilename(fields[videoFieldCartName], fields[videoFieldCartMapping]) reg.Cartridge = fields[videoFieldCartName]
if err != nil { reg.Mapping = fields[videoFieldCartMapping]
return nil, fmt.Errorf("video: %w", err)
}
reg.TVtype = fields[videoFieldTVtype] reg.TVtype = fields[videoFieldTVtype]
reg.digest = fields[videoFieldDigest] reg.digest = fields[videoFieldDigest]
reg.Notes = fields[videoFieldNotes] reg.Notes = fields[videoFieldNotes]
@ -128,8 +127,8 @@ func (reg VideoRegression) EntryType() string {
// Serialise implements the database.Entry interface. // Serialise implements the database.Entry interface.
func (reg *VideoRegression) Serialise() (database.SerialisedEntry, error) { func (reg *VideoRegression) Serialise() (database.SerialisedEntry, error) {
return database.SerialisedEntry{ return database.SerialisedEntry{
reg.CartLoad.Filename, reg.Cartridge,
reg.CartLoad.Mapping, reg.Mapping,
reg.TVtype, reg.TVtype,
strconv.Itoa(reg.NumFrames), strconv.Itoa(reg.NumFrames),
reg.State.String(), reg.State.String(),
@ -170,7 +169,9 @@ func (reg VideoRegression) String() string {
state = " [with state]" state = " [with state]"
} }
s.WriteString(fmt.Sprintf("[%s] %s [%s] frames=%d%s", reg.EntryType(), reg.CartLoad.Name, reg.TVtype, reg.NumFrames, state)) s.WriteString(fmt.Sprintf("[%s] %s [%s] frames=%d%s", reg.EntryType(),
cartridgeloader.NameFromFilename(reg.Cartridge),
reg.TVtype, reg.NumFrames, state))
if reg.Notes != "" { if reg.Notes != "" {
s.WriteString(fmt.Sprintf(" [%s]", reg.Notes)) s.WriteString(fmt.Sprintf(" [%s]", reg.Notes))
} }
@ -204,7 +205,13 @@ func (reg *VideoRegression) regress(newRegression bool, output io.Writer, msg st
// default the hardware preferences // default the hardware preferences
vcs.Env.Normalise() vcs.Env.Normalise()
err = setup.AttachCartridge(vcs, reg.CartLoad, true) cartload, err := cartridgeloader.NewLoaderFromFilename(reg.Cartridge, reg.Mapping)
if err != nil {
return false, "", fmt.Errorf("log: %w", err)
}
defer cartload.Close()
err = setup.AttachCartridge(vcs, cartload, true)
if err != nil { if err != nil {
return false, "", fmt.Errorf("video: %w", err) return false, "", fmt.Errorf("video: %w", err)
} }
@ -275,7 +282,7 @@ func (reg *VideoRegression) regress(newRegression bool, output io.Writer, msg st
if reg.State != StateNone { if reg.State != StateNone {
// create a unique filename // create a unique filename
reg.stateFile, err = uniqueFilename("state", reg.CartLoad.Name) reg.stateFile, err = uniqueFilename("state", reg.Cartridge)
if err != nil { if err != nil {
return false, "", fmt.Errorf("video: %w", err) return false, "", fmt.Errorf("video: %w", err)
} }