From 5d0abefadf4611a3593dabc7407ca768c06bbfca Mon Sep 17 00:00:00 2001 From: Michel Pollet Date: Sat, 28 Oct 2023 06:25:43 +0100 Subject: [PATCH] Added mii_dispose() -- clean up everything Seems there are no leaks; only blocks left non-freed are the queue of drivers, which is static anyway Also added a MII_TERMINATE state to quit any 'main' loop. Signed-off-by: Michel Pollet --- nuklear/mii_emu.c | 2 +- nuklear/mii_nuklear.c | 4 ++++ src/mii.c | 17 ++++++++++++++++- src/mii.h | 31 ++++++++++++++++++++----------- 4 files changed, 41 insertions(+), 13 deletions(-) diff --git a/nuklear/mii_emu.c b/nuklear/mii_emu.c index a7f88ee..dcbe3ed 100644 --- a/nuklear/mii_emu.c +++ b/nuklear/mii_emu.c @@ -308,7 +308,7 @@ extern const unsigned int mii_droid_size; nk_x11_render(NK_ANTI_ALIASING_ON, MAX_VERTEX_BUFFER, MAX_ELEMENT_BUFFER); glXSwapBuffers(win.dpy, win.win); } - + mii_dispose(&g_mii); cleanup: nk_x11_shutdown(); glXMakeCurrent(win.dpy, 0, 0); diff --git a/nuklear/mii_nuklear.c b/nuklear/mii_nuklear.c index fd5eb7e..172179b 100644 --- a/nuklear/mii_nuklear.c +++ b/nuklear/mii_nuklear.c @@ -167,6 +167,9 @@ static void *mii_thread_func(void *arg) break; case MII_RUNNING: break; + case MII_TERMINATE: + mii_thread_running = false; + break; } if (mii->video.frame_count != last_frame) { @@ -193,6 +196,7 @@ static void *mii_thread_func(void *arg) usleep(sleep_time); } } + mii_dispose(mii); return NULL; } diff --git a/src/mii.c b/src/mii.c index cb55909..1e08fa2 100644 --- a/src/mii.c +++ b/src/mii.c @@ -497,7 +497,6 @@ mii_init( mii->bank[MII_BANK_ROM].mem = (uint8_t*)&iie_enhanced_rom_bin[0]; mii->cpu.trap = MII_TRAP; mii_reset(mii, true); - mii_speaker_init(mii, &mii->speaker); mii->cpu_state = mii_cpu_init(&mii->cpu); for (int i = 0; i < 7; i++) mii->slot[i].id = i; @@ -508,6 +507,8 @@ mii_prepare( mii_t *mii, uint32_t flags ) { + mii_dd_system_init(mii, &mii->dd); + mii_speaker_init(mii, &mii->speaker); printf("%s driver table\n", __func__); mii_slot_drv_t * drv = mii_slot_drv_list; while (drv) { @@ -519,6 +520,20 @@ mii_prepare( } } +void +mii_dispose( + mii_t *mii ) +{ + for (int i = 0; i < 7; i++) { + if (mii->slot[i].drv && mii->slot[i].drv->dispose) + mii->slot[i].drv->dispose(mii, &mii->slot[i]); + } + for (int i = 0; i < MII_BANK_COUNT; i++) + mii_bank_dispose(&mii->bank[i]); + mii_speaker_dispose(&mii->speaker); + mii_dd_system_dispose(&mii->dd); +} + void mii_reset( mii_t *mii, diff --git a/src/mii.h b/src/mii.h index 9efb3e8..6fd7984 100644 --- a/src/mii.h +++ b/src/mii.h @@ -11,7 +11,6 @@ #include #include "mii_65c02.h" -#include "fifo_declare.h" #include "mii_dd.h" #include "mii_bank.h" #include "mii_slot.h" @@ -33,7 +32,10 @@ enum { MII_BANK_COUNT, }; - +/* + * A 'trap' is a sequence of 2 special NOPs that are used to trigger + * a callback. The callback is called with the mii_t * and the trap ID + */ typedef void (*mii_trap_handler_cb)( mii_t * mii, uint8_t trap); @@ -49,6 +51,7 @@ enum { MII_RUNNING = 0, // default MII_STOPPED, MII_STEP, + MII_TERMINATE, }; enum { @@ -144,6 +147,12 @@ void mii_prepare( mii_t *mii, uint32_t flags ); +/* + * Stop the emulator, dispose of everything, free memory etc. + */ +void +mii_dispose( + mii_t *mii ); /* * Parses arguments until in finds one that isn't for mii, and returns @@ -157,11 +166,11 @@ mii_prepare( */ int mii_argv_parse( - mii_t *mii, - int argc, - const char *argv[], - int *index, - uint32_t *ioFlags ); + mii_t *mii, + int argc, + const char *argv[], + int *index, + uint32_t *ioFlags ); /* * Locate driver_name, and attempt to register it with slot_id slot. * Returns 0 on success, -1 on failure @@ -262,10 +271,10 @@ extern mii_slot_drv_t * mii_slot_drv_list; #define MII_TRAP 0xdbfb /* * Request a trap ID for the given callback. Calling code is responsible - * for setting up the trap using the 2 magic NOPs in sequence. See mii_smartport.c - * for an example. + * for setting up the trap using the 2 magic NOPs in sequence. + * See mii_smartport.c for an example. */ uint8_t mii_register_trap( - mii_t *mii, - mii_trap_handler_cb cb); + mii_t *mii, + mii_trap_handler_cb cb);