mirror of https://github.com/mgba-emu/mgba.git
Core: Add shutdown callback
This commit is contained in:
parent
ad7146a801
commit
a8999958da
2
CHANGES
2
CHANGES
|
@ -71,6 +71,8 @@ Other fixes:
|
||||||
- VFS: Fix directory node listing on some filesystems
|
- VFS: Fix directory node listing on some filesystems
|
||||||
Misc:
|
Misc:
|
||||||
- 3DS: Use "wide mode" where applicable for slightly better filtering
|
- 3DS: Use "wide mode" where applicable for slightly better filtering
|
||||||
|
- Core: Add savedataUpdated callback
|
||||||
|
- Core: Add shutdown callback
|
||||||
- GB: Allow pausing event loop while CPU is blocked
|
- GB: Allow pausing event loop while CPU is blocked
|
||||||
- GBA: Allow pausing event loop while CPU is blocked
|
- GBA: Allow pausing event loop while CPU is blocked
|
||||||
- Debugger: Keep track of global cycle count
|
- Debugger: Keep track of global cycle count
|
||||||
|
|
|
@ -107,6 +107,7 @@ struct mCoreCallbacks {
|
||||||
void (*videoFrameEnded)(void* context);
|
void (*videoFrameEnded)(void* context);
|
||||||
void (*coreCrashed)(void* context);
|
void (*coreCrashed)(void* context);
|
||||||
void (*sleep)(void* context);
|
void (*sleep)(void* context);
|
||||||
|
void (*shutdown)(void* context);
|
||||||
void (*keysRead)(void* context);
|
void (*keysRead)(void* context);
|
||||||
void (*savedataUpdated)(void* context);
|
void (*savedataUpdated)(void* context);
|
||||||
};
|
};
|
||||||
|
|
|
@ -139,6 +139,14 @@ void _coreSleep(void* context) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _coreShutdown(void* context) {
|
||||||
|
struct mCoreThread* thread = context;
|
||||||
|
if (!thread) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_changeState(thread->impl, THREAD_EXITING, true);
|
||||||
|
}
|
||||||
|
|
||||||
static THREAD_ENTRY _mCoreThreadRun(void* context) {
|
static THREAD_ENTRY _mCoreThreadRun(void* context) {
|
||||||
struct mCoreThread* threadContext = context;
|
struct mCoreThread* threadContext = context;
|
||||||
#ifdef USE_PTHREADS
|
#ifdef USE_PTHREADS
|
||||||
|
@ -162,6 +170,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) {
|
||||||
.videoFrameEnded = _frameEnded,
|
.videoFrameEnded = _frameEnded,
|
||||||
.coreCrashed = _crashed,
|
.coreCrashed = _crashed,
|
||||||
.sleep = _coreSleep,
|
.sleep = _coreSleep,
|
||||||
|
.shutdown = _coreShutdown,
|
||||||
.context = threadContext
|
.context = threadContext
|
||||||
};
|
};
|
||||||
core->addCoreCallbacks(core, &callbacks);
|
core->addCoreCallbacks(core, &callbacks);
|
||||||
|
|
|
@ -525,11 +525,15 @@ void GBAHalt(struct GBA* gba) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GBAStop(struct GBA* gba) {
|
void GBAStop(struct GBA* gba) {
|
||||||
|
int validIrqs = (1 << IRQ_GAMEPAK) | (1 << IRQ_KEYPAD) | (1 << IRQ_SIO);
|
||||||
|
int sleep = gba->memory.io[REG_IE >> 1] & validIrqs;
|
||||||
size_t c;
|
size_t c;
|
||||||
for (c = 0; c < mCoreCallbacksListSize(&gba->coreCallbacks); ++c) {
|
for (c = 0; c < mCoreCallbacksListSize(&gba->coreCallbacks); ++c) {
|
||||||
struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&gba->coreCallbacks, c);
|
struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&gba->coreCallbacks, c);
|
||||||
if (callbacks->sleep) {
|
if (sleep && callbacks->sleep) {
|
||||||
callbacks->sleep(callbacks->context);
|
callbacks->sleep(callbacks->context);
|
||||||
|
} else if (callbacks->shutdown) {
|
||||||
|
callbacks->shutdown(callbacks->context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gba->cpu->nextEvent = gba->cpu->cycles;
|
gba->cpu->nextEvent = gba->cpu->cycles;
|
||||||
|
|
Loading…
Reference in New Issue