diff --git a/src/arm/arm.c b/src/arm/arm.c index ccd46cb95..c34ee453b 100644 --- a/src/arm/arm.c +++ b/src/arm/arm.c @@ -72,6 +72,18 @@ void ARMInit(struct ARMCore* cpu) { } } +void ARMDeinit(struct ARMCore* cpu) { + if (cpu->master->deinit) { + cpu->master->deinit(cpu->master); + } + int i; + for (i = 0; i < cpu->numComponents; ++i) { + if (cpu->components[i]->deinit) { + cpu->components[i]->deinit(cpu->components[i]); + } + } +} + void ARMSetComponents(struct ARMCore* cpu, struct ARMComponent* master, int extra, struct ARMComponent** extras) { // TODO: Call init/deinit cpu->master = master; diff --git a/src/arm/arm.h b/src/arm/arm.h index 6409d8fe6..7ea314d14 100644 --- a/src/arm/arm.h +++ b/src/arm/arm.h @@ -145,6 +145,7 @@ struct ARMCore { }; void ARMInit(struct ARMCore* cpu); +void ARMDeinit(struct ARMCore* cpu); void ARMSetComponents(struct ARMCore* cpu, struct ARMComponent* master, int extra, struct ARMComponent** extras); void ARMReset(struct ARMCore* cpu); diff --git a/src/gba/gba-thread.c b/src/gba/gba-thread.c index ab109b879..b37cb1273 100644 --- a/src/gba/gba-thread.c +++ b/src/gba/gba-thread.c @@ -154,6 +154,7 @@ static THREAD_ENTRY _GBAThreadRun(void* context) { } threadContext->gba = 0; + ARMDeinit(&cpu); GBADestroy(&gba); ConditionWake(&threadContext->sync.videoFrameAvailableCond); diff --git a/src/gba/gba.c b/src/gba/gba.c index 51d6417f2..de8fdcab6 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -102,6 +102,7 @@ static void _checkOverrides(struct GBA* gba, uint32_t code); void GBACreate(struct GBA* gba) { gba->d.id = GBA_COMPONENT_MAGIC; gba->d.init = GBAInit; + gba->d.deinit = 0; } static void GBAInit(struct ARMCore* cpu, struct ARMComponent* component) {