device_add_hsync(a2065_hsync_handler);
device_add_rethink(rethink_a2065);
- device_add_exit(a2065_free);
+ device_add_exit(a2065_free, NULL);
return true;
}
{
device_add_hsync(scsi_hsync);
device_add_rethink(rethink_a2091);
- device_add_exit(a2091_free);
- device_add_exit(gvp_free);
- device_add_exit(a3000scsi_free);
+ device_add_exit(a2091_free, NULL);
+ device_add_exit(gvp_free, NULL);
+ device_add_exit(a3000scsi_free, NULL);
}
#if 0
device_add_rethink(rethink_akiko);
}
- device_add_exit(akiko_free);
+ device_add_exit(akiko_free, NULL);
return 1;
}
device_add_hsync(cd32_fmv_hsync_handler);
device_add_vsync_pre(cd32_fmv_vsync_handler);
- device_add_exit(cd32_fmv_free);
+ device_add_exit(cd32_fmv_free, NULL);
device_add_rethink(rethink_cd32fmv);
return &fmv_rom_bank;
device_add_hsync(CDTV_hsync_handler);
device_add_rethink(rethink_cdtv);
- device_add_exit(cdtv_free);
+ device_add_exit(cdtv_free, NULL);
return true;
}
device_add_hsync(CDTVCR_hsync_handler);
device_add_rethink(rethink_cdtvcr);
- device_add_exit(cdtvcr_free);
+ device_add_exit(cdtvcr_free, NULL);
return true;
}
static DEVICE_VOID device_rethinks[MAX_DEVICE_ITEMS];
static int device_leave_cnt;
static DEVICE_VOID device_leaves[MAX_DEVICE_ITEMS];
+static int device_leave_early_cnt;
+static DEVICE_VOID device_leaves_early[MAX_DEVICE_ITEMS];
static int device_resets_cnt;
static DEVICE_INT device_resets[MAX_DEVICE_ITEMS];
static bool device_reset_done[MAX_DEVICE_ITEMS];
device_rethink_cnt = 0;
device_resets_cnt = 0;
device_leave_cnt = 0;
+ device_leave_early_cnt = 0;
memset(device_reset_done, 0, sizeof(device_reset_done));
}
{
add_device_item(device_configs, &device_configs_cnt, p);
}
-void device_add_exit(DEVICE_VOID p)
+void device_add_exit(DEVICE_VOID p, DEVICE_VOID p2)
{
- add_device_item(device_leaves, &device_leave_cnt, p);
+ if (p != NULL) {
+ add_device_item(device_leaves, &device_leave_cnt, p);
+ }
+ if (p2 != NULL) {
+ add_device_item(device_leaves_early, &device_leave_early_cnt, p2);
+ }
}
void device_add_reset(DEVICE_INT p)
{
// must be first
uae_ppc_free();
#endif
+
+ execute_device_items(device_leaves_early, device_leave_early_cnt);
+
#ifdef FILESYS
filesys_cleanup();
#endif
device_add_check_config(check_prefs_changed_gayle);
device_add_rethink(rethink_gayle);
device_add_hsync(gayle_hsync);
- device_add_exit(gayle_free);
+ device_add_exit(gayle_free, NULL);
}
uae_u8 *save_gayle(size_t *len, uae_u8 *dstptr)
{
device_add_rethink(idecontroller_rethink);
device_add_hsync(idecontroller_hsync);
- device_add_exit(idecontroller_free);
+ device_add_exit(idecontroller_free, NULL);
for (int i = 0; i < MAX_IDE_UNITS; i++) {
if (ide_boards[i]) {
void device_add_check_config(DEVICE_VOID p);
void device_add_reset(DEVICE_INT p);
void device_add_reset_imm(DEVICE_INT p);
-void device_add_exit(DEVICE_VOID p);
+void device_add_exit(DEVICE_VOID p, DEVICE_VOID p2);
#define IRQ_SOURCE_PCI 0
#define IRQ_SOURCE_SOUND 1
device_add_rethink(ncr9x_rethink);
device_add_reset(ncr9x_reset);
- device_add_exit(ncr9x_free);
+ device_add_exit(ncr9x_free, NULL);
}
void ncr_squirrel_init(struct romconfig *rc, uaecptr baseaddress)
ncr->irq = false;
device_add_rethink(ncr_rethink);
- device_add_exit(ncr_free);
+ device_add_exit(ncr_free, NULL);
device_add_vsync_pre(ncr_vsync);
device_add_reset(ncr_reset);
}
device_add_reset(picasso_reset);
device_add_hsync(picasso_handle_hsync);
- device_add_exit(picasso_free);
+ device_add_exit(picasso_free, NULL);
}
#define UAEGFX_VERSION 3
{
device_add_reset(pci_reset);
device_add_rethink(pci_rethink);
- device_add_exit(pci_free);
+ device_add_exit(pci_free, NULL);
device_add_hsync(pci_hsync);
}
static void init(void)
{
- device_add_exit(ne2000_free);
+ device_add_exit(ne2000_free, NULL);
device_add_reset(ne2000_reset);
device_add_hsync(ne2000_hsync);
device_add_rethink(rethink_ne2000);
{
device_add_rethink(ncr80_rethink);
device_add_reset(soft_scsi_reset);
- device_add_exit(soft_scsi_free);
+ device_add_exit(soft_scsi_free, NULL);
if (rc->unitdata)
return (struct soft_scsi *)rc->unitdata;
return NULL;
device_add_hsync(sndboard_hsync);
device_add_vsync_post(sndboard_vsync);
device_add_rethink(sndboard_rethink);
- device_add_exit(sndboard_free);
- device_add_exit(uaesndboard_free);
+ device_add_exit(sndboard_free, NULL);
+ device_add_exit(uaesndboard_free, NULL);
}
device_add_hsync(x86_bridge_hsync);
device_add_vsync_pre(x86_bridge_vsync);
- device_add_exit(x86_bridge_free);
+ device_add_exit(x86_bridge_free, NULL);
device_add_rethink(x86_bridge_rethink);
return true;