Ensure UI stack access by a single thread at a time.

This commit is contained in:
Steven Smith 2016-04-19 18:53:13 -07:00
parent a81411aa6b
commit 0c41459643
3 changed files with 39 additions and 2 deletions

View File

@ -15,6 +15,8 @@ void cleanup() {
clipboard_clear();
task_quit_all();
ui_exit();
screen_exit();
socExit();
@ -65,6 +67,7 @@ int main(int argc, const char* argv[]) {
}
screen_init();
ui_init();
mainmenu_open();

View File

@ -13,34 +13,65 @@
static ui_view* ui_stack[MAX_UI_VIEWS];
static int ui_stack_top = -1;
static Handle ui_stack_mutex = 0;
void ui_init() {
if(ui_stack_mutex == 0) {
svcCreateMutex(&ui_stack_mutex, false);
}
}
void ui_exit() {
if(ui_stack_mutex != 0) {
svcCloseHandle(ui_stack_mutex);
ui_stack_mutex = 0;
}
}
bool ui_push(ui_view* view) {
if(view == NULL) {
return false;
}
svcWaitSynchronization(ui_stack_mutex, U64_MAX);
if(ui_stack_top >= MAX_UI_VIEWS - 1) {
return false;
}
ui_stack[++ui_stack_top] = view;
svcReleaseMutex(ui_stack_mutex);
return true;
}
ui_view* ui_peek() {
svcWaitSynchronization(ui_stack_mutex, U64_MAX);
if(ui_stack_top == -1) {
return NULL;
}
return ui_stack[ui_stack_top];
ui_view* ui = ui_stack[ui_stack_top];
svcReleaseMutex(ui_stack_mutex);
return ui;
}
ui_view* ui_pop() {
svcWaitSynchronization(ui_stack_mutex, U64_MAX);
if(ui_stack_top == -1) {
return NULL;
}
ui_view* view = ui_peek();
ui_view* view = ui_stack[ui_stack_top];
ui_stack[ui_stack_top--] = NULL;
svcReleaseMutex(ui_stack_mutex);
return view;
}

View File

@ -11,6 +11,9 @@ typedef struct ui_view_s {
void (*drawBottom)(struct ui_view_s* view, void* data, float x1, float y1, float x2, float y2);
} ui_view;
void ui_init();
void ui_exit();
bool ui_push(ui_view* view);
ui_view* ui_peek();
ui_view* ui_pop();