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 <buserror@gmail.com>
This commit is contained in:
Michel Pollet 2023-10-28 06:25:43 +01:00
parent 73059bfd93
commit 5d0abefadf
4 changed files with 41 additions and 13 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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,

View File

@ -11,7 +11,6 @@
#include <stdbool.h>
#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);