changeset 2164:4fbe1e7c4a73

Don't leak all Sega CD resources when freeing a Genesis instance
author Michael Pavone <pavone@retrodev.com>
date Tue, 12 Jul 2022 09:22:57 -0700
parents 1270fe86eb89
children c1800fb99e78
files cdd_fader.c cdd_fader.h genesis.c rf5c164.c rf5c164.h segacd.c segacd.h
diffstat 7 files changed, 30 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/cdd_fader.c	Thu Jun 09 09:35:38 2022 -0700
+++ b/cdd_fader.c	Tue Jul 12 09:22:57 2022 -0700
@@ -8,6 +8,12 @@
 	fader->dst_attenuation = 0x4000;
 	fader->attenuation_step = 0;
 }
+
+void cdd_fader_deinit(cdd_fader *fader)
+{
+	render_free_source(fader->audio);
+}
+
 void cdd_fader_attenuation_write(cdd_fader *fader, uint16_t attenuation)
 {
 	fader->dst_attenuation = attenuation & 0xFFF0;
--- a/cdd_fader.h	Thu Jun 09 09:35:38 2022 -0700
+++ b/cdd_fader.h	Tue Jul 12 09:22:57 2022 -0700
@@ -14,6 +14,7 @@
 } cdd_fader;
 
 void cdd_fader_init(cdd_fader *fader);
+void cdd_fader_deinit(cdd_fader *fader);
 void cdd_fader_attenuation_write(cdd_fader *fader, uint16_t attenuation);
 void cdd_fader_data(cdd_fader *fader, uint8_t byte);
 void cdd_fader_pause(cdd_fader *fader);
--- a/genesis.c	Thu Jun 09 09:35:38 2022 -0700
+++ b/genesis.c	Tue Jul 12 09:22:57 2022 -0700
@@ -1549,6 +1549,9 @@
 static void free_genesis(system_header *system)
 {
 	genesis_context *gen = (genesis_context *)system;
+	if (gen->expansion) {
+		free_segacd(gen->expansion);
+	}
 	vdp_free(gen->vdp);
 	memmap_chunk *map = (memmap_chunk *)gen->m68k->options->gen.memmap;
 	m68k_options_free(gen->m68k->options);
--- a/rf5c164.c	Thu Jun 09 09:35:38 2022 -0700
+++ b/rf5c164.c	Tue Jul 12 09:22:57 2022 -0700
@@ -28,6 +28,11 @@
 	pcm->clock_step = divider * 4;
 }
 
+void rf5c164_deinit(rf5c164* pcm)
+{
+	render_free_source(pcm->audio);
+}
+
 //48 cycles per channel
 //1 external write per 16 cycles
 //3 external writes per channel/sample
--- a/rf5c164.h	Thu Jun 09 09:35:38 2022 -0700
+++ b/rf5c164.h	Tue Jul 12 09:22:57 2022 -0700
@@ -29,6 +29,7 @@
 } rf5c164;
 
 void rf5c164_init(rf5c164* pcm, uint32_t mclks, uint32_t divider);
+void rf5c164_deinit(rf5c164* pcm);
 void rf5c164_run(rf5c164* pcm, uint32_t cycle);
 void rf5c164_write(rf5c164* pcm, uint16_t address, uint8_t value);
 uint8_t rf5c164_read(rf5c164* pcm, uint16_t address);
--- a/segacd.c	Thu Jun 09 09:35:38 2022 -0700
+++ b/segacd.c	Tue Jul 12 09:22:57 2022 -0700
@@ -1490,6 +1490,19 @@
 	return cd;
 }
 
+void free_segacd(segacd_context *cd)
+{
+	cdd_fader_deinit(&cd->fader);
+	rf5c164_deinit(&cd->pcm);
+	m68k_options_free(cd->m68k->options);
+	free(cd->m68k);
+	free(cd->bram);
+	free(cd->pcm_ram);
+	free(cd->word_ram);
+	free(cd->prog_ram);
+	free(cd->rom_mut);
+}
+
 memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint8_t cart_boot, uint32_t *num_chunks)
 {
 	static memmap_chunk main_cpu_map[] = {
--- a/segacd.h	Thu Jun 09 09:35:38 2022 -0700
+++ b/segacd.h	Tue Jul 12 09:22:57 2022 -0700
@@ -52,6 +52,7 @@
 } segacd_context;
 
 segacd_context *alloc_configure_segacd(system_media *media, uint32_t opts, uint8_t force_region, rom_info *info);
+void free_segacd(segacd_context *cd);
 memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint8_t cart_boot, uint32_t *num_chunks);
 uint32_t gen_cycle_to_scd(uint32_t cycle, genesis_context *gen);
 void scd_run(segacd_context *cd, uint32_t cycle);