Re: [hatari-devel] Duplicate drive image file issue |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/hatari-devel Archives
]
- To: hatari-devel@xxxxxxxxxxxxxxxxxxx
- Subject: Re: [hatari-devel] Duplicate drive image file issue
- From: Uwe Seimet <Uwe.Seimet@xxxxxxxxx>
- Date: Mon, 11 Nov 2019 08:17:48 +0100
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1573456668; s=strato-dkim-0002; d=seimet.de; h=In-Reply-To:References:Message-ID:Subject:To:From:Date: X-RZG-CLASS-ID:X-RZG-AUTH:From:Subject:Sender; bh=eNRTZ2AbW9bYBgP3B9N0CqMvhzCS6y6ViW940/2OKWI=; b=S0d3CIUn1ej2KrC2mq0ksUXwI2Jcu+IMXl+HA2x8VCAAgVQwy5ZgTj8OEkUHkE92SS 0/Xkbcl9xrgfXMY+pTfLn772BubZym9qWHJYJla+Ycnstf3ehEykKIXyeOuPlCnvTt7r AQXA8JdqHPEyr8JVBJMDve4Ub1v2NDxpJje1SQdY8fF/A11XBw28rr3ACHQRcS7ta6rh LEHhQ7tOqLn58Xb/SbOs3zUbBMyjxcgW2a20/JlG2/bQm8ouzoaPWsdsIOMQal1Q6rTB OO7sq10h9epxyFanBEUO+OM5OurpkQynmPelA9bN72w/6Uu2cUoBx1R3ynyODyr8oP1u BNHg==
Hi,
No, I'm afraid nothing has changed, the issue is still there.
Best regards
Uwe
> H,
>
> On 11/3/19 9:33 PM, Uwe Seimet wrote:> Hi Roger,
> >> On 3 Nov 2019 at 8:17, Uwe Seimet wrote:
> >>>
> >>> For IDE HD 0 I have configured a drive image to be used. When I select
> >>> the same image file for ACSI HD 0 and reset Hatari, Hatari reports
> >>> "Locking HD file for writing failed" and TOS only sees IDE HD 0, but not
> >>> HD ACSI 0. So far, so good.
> >>>
> >>> Now I eject the file for IDE HD 0, so that the image file is configured
> >>> for ACSI HD 0 only. After rebooting there is no HD available for TOS
> >>> at all, even though ACSI HD 0 is the only drive configured with an image
> >>> file. Looks as if Hatari has not noticed that there is no image file
> >>> conflict anymore but still ignores the (only) assigned image.
> >>>
> >> Are you sure this is not a byte-swapping problem? My ACSI image and IDE image
> >> are byte-swapped with respect to each other.
> >
> > Yes, I'm sure, because if I avoid the locking issue by applying the
> > change (i.e. using the image file for ACSI instead of IDE) in a single
> > step in the UI, everything is fine.
>
> I think I see the problem. In:
> change.c::Change_CopyChangedParamsToConfiguration()
>
> UnInit for IDE & ACSI/SCSI drives is called only if the status of drives
> is changed *and* at least on of the changed drives is still used,
> i.e. they're unlocked only if IDE or ACSI needs to re-initialized.
>
> Attached quick patch does unInit separately for them. Does that fix
> the problem?
>
>
> (Additionally the patch also makes code more uniform about the way
> to ensure atht some other things don't get initialized unless they've
> been uninitialized.)
>
>
> - Eero
> diff --git a/src/change.c b/src/change.c
> index d50fe801..77e154a7 100644
> --- a/src/change.c
> +++ b/src/change.c
> @@ -182,10 +182,17 @@ void Change_CopyChangedParamsToConfiguration(CNF_PARAMS *current, CNF_PARAMS *ch
> {
> bool NeedReset;
> bool bReInitGemdosDrive = false;
> - bool bReInitHdcEmu = false;
> - bool bReInitIDEEmu = false;
> + typedef struct {
> + bool unInit;
> + bool reInit;
> + } images_init_t;
> + images_init_t initHdc = { false, false };
> + images_init_t initIde = { false, false };
> bool bReInitIoMem = false;
> bool bScreenModeChange = false;
> + bool bReInitSound = false;
> + bool bReInitRS232 = false;
> + bool bReInitSCC = false;
> bool bReInitMidi = false;
> bool bReInitPrinter = false;
> bool bFloppyInsert[MAX_FLOPPYDRIVES];
> @@ -221,11 +228,12 @@ void Change_CopyChangedParamsToConfiguration(CNF_PARAMS *current, CNF_PARAMS *ch
>
> /* Did set new printer parameters? */
> if (changed->Printer.bEnablePrinting != current->Printer.bEnablePrinting
> - || strcmp(changed->Printer.szPrintToFileName,current->Printer.szPrintToFileName))
> + || strcmp(changed->Printer.szPrintToFileName, current->Printer.szPrintToFileName))
> {
> Dprintf("- printer>\n");
> Printer_UnInit();
> - bReInitPrinter = true;
> + if (changed->Printer.bEnablePrinting)
> + bReInitPrinter = true;
> }
>
> /* Did set new RS232 parameters? */
> @@ -235,6 +243,8 @@ void Change_CopyChangedParamsToConfiguration(CNF_PARAMS *current, CNF_PARAMS *ch
> {
> Dprintf("- RS-232>\n");
> RS232_UnInit();
> + if (changed->RS232.bEnableRS232)
> + bReInitRS232 = true;
> }
>
> /* Did set new SCC parameters? */
> @@ -245,6 +255,8 @@ void Change_CopyChangedParamsToConfiguration(CNF_PARAMS *current, CNF_PARAMS *ch
> {
> Dprintf("- SCC>\n");
> SCC_UnInit();
> + if (changed->RS232.bEnableSccB)
> + bReInitSCC = true;
> }
>
> /* Did stop sound? Or change playback Hz. If so, also stop sound recording */
> @@ -254,6 +266,8 @@ void Change_CopyChangedParamsToConfiguration(CNF_PARAMS *current, CNF_PARAMS *ch
> if (Sound_AreWeRecording())
> Sound_EndRecording();
> Audio_UnInit();
> + if (changed->Sound.bEnableSound)
> + bReInitSound = true;
> }
>
> /* Did change floppy (images)? */
> @@ -286,51 +300,55 @@ void Change_CopyChangedParamsToConfiguration(CNF_PARAMS *current, CNF_PARAMS *ch
> /* Did change GEMDOS drive Atari/host location or enabling? */
> if (changed->HardDisk.nGemdosDrive != current->HardDisk.nGemdosDrive
> || changed->HardDisk.bUseHardDiskDirectories != current->HardDisk.bUseHardDiskDirectories
> - || (strcmp(changed->HardDisk.szHardDiskDirectories[0], current->HardDisk.szHardDiskDirectories[0])
> - && changed->HardDisk.bUseHardDiskDirectories))
> + || strcmp(changed->HardDisk.szHardDiskDirectories[0], current->HardDisk.szHardDiskDirectories[0]))
> {
> Dprintf("- gemdos HD>\n");
> GemDOS_UnInitDrives();
> - bReInitGemdosDrive = true;
> + if (changed->HardDisk.bUseHardDiskDirectories)
> + bReInitGemdosDrive = true;
> }
>
> /* Did change ACSI image? */
> for (i = 0; i < MAX_ACSI_DEVS; i++)
> {
> if (changed->Acsi[i].bUseDevice != current->Acsi[i].bUseDevice
> - || (strcmp(changed->Acsi[i].sDeviceFile, current->Acsi[i].sDeviceFile)
> - && changed->Acsi[i].bUseDevice))
> + || strcmp(changed->Acsi[i].sDeviceFile, current->Acsi[i].sDeviceFile))
> {
> Dprintf("- ACSI image %i>\n", i);
> - bReInitHdcEmu = true;
> + initHdc.unInit = true;
> + if (changed->Acsi[i].bUseDevice)
> + initHdc.reInit = true;
> +
> }
> }
> /* Did change SCSI image? */
> for (i = 0; i < MAX_SCSI_DEVS; i++)
> {
> if (changed->Scsi[i].bUseDevice != current->Scsi[i].bUseDevice
> - || (strcmp(changed->Scsi[i].sDeviceFile, current->Scsi[i].sDeviceFile)
> - && changed->Scsi[i].bUseDevice))
> + || strcmp(changed->Scsi[i].sDeviceFile, current->Scsi[i].sDeviceFile))
> {
> Dprintf("- SCSI image %i>\n", i);
> - bReInitHdcEmu = true;
> + initHdc.unInit = true;
> + if (changed->Scsi[i].bUseDevice)
> + initHdc.reInit = true;
> }
> }
> - if (bReInitHdcEmu)
> + if (initHdc.unInit)
> HDC_UnInit();
>
> /* Did change IDE HD image? */
> for (i = 0; i < MAX_IDE_DEVS; i++)
> {
> if (changed->Ide[i].bUseDevice != current->Ide[i].bUseDevice
> - || (strcmp(changed->Ide[i].sDeviceFile, current->Ide[i].sDeviceFile)
> - && changed->Ide[i].bUseDevice))
> + || strcmp(changed->Ide[i].sDeviceFile, current->Ide[i].sDeviceFile))
> {
> Dprintf("- IDE image %i>\n", i);
> - bReInitIDEEmu = true;
> + initIde.unInit = true;
> + if (changed->Ide[i].bUseDevice)
> + initIde.reInit = true;
> }
> }
> - if (bReInitIDEEmu)
> + if (initIde.unInit)
> Ide_UnInit();
>
> /* Did change blitter, DSP or system type? */
> @@ -368,7 +386,8 @@ void Change_CopyChangedParamsToConfiguration(CNF_PARAMS *current, CNF_PARAMS *ch
> {
> Dprintf("- midi>\n");
> Midi_UnInit();
> - bReInitMidi = true;
> + if (changed->Midi.bEnableMidi)
> + bReInitMidi = true;
> }
>
> /* Copy details to configuration,
> @@ -399,14 +418,14 @@ void Change_CopyChangedParamsToConfiguration(CNF_PARAMS *current, CNF_PARAMS *ch
> }
>
> /* Mount a new ACSI/SCSI HD images: */
> - if (bReInitHdcEmu)
> + if (initHdc.reInit)
> {
> Dprintf("- HD<\n");
> HDC_Init();
> }
>
> /* Mount a new IDE HD images: */
> - if (bReInitIDEEmu && (ConfigureParams.Ide[0].bUseDevice || ConfigureParams.Ide[1].bUseDevice))
> + if (initIde.reInit)
> {
> Dprintf("- IDE<\n");
> Ide_Init();
> @@ -423,28 +442,28 @@ void Change_CopyChangedParamsToConfiguration(CNF_PARAMS *current, CNF_PARAMS *ch
> }
>
> /* Mount a new GEMDOS drive? */
> - if (bReInitGemdosDrive && ConfigureParams.HardDisk.bUseHardDiskDirectories)
> + if (bReInitGemdosDrive)
> {
> Dprintf("- gemdos HD<\n");
> GemDOS_InitDrives();
> }
>
> /* Restart audio sub system if necessary: */
> - if (ConfigureParams.Sound.bEnableSound && !bSoundWorking)
> + if (bReInitSound)
> {
> Dprintf("- audio<\n");
> Audio_Init();
> }
>
> /* Re-initialize the RS232 emulation: */
> - if (ConfigureParams.RS232.bEnableRS232)
> + if (bReInitRS232)
> {
> Dprintf("- RS-232<\n");
> RS232_Init();
> }
>
> /* Re-initialize the SCC emulation: */
> - if (ConfigureParams.RS232.bEnableSccB)
> + if (bReInitSCC)
> {
> Dprintf("- SCC<\n");
> SCC_Init();