Update and fix usermode event/timer examples

This commit is contained in:
fincs 2018-12-14 16:30:50 +01:00
parent 86f28347cf
commit f0d7771a3a
2 changed files with 59 additions and 56 deletions

View File

@ -1,13 +1,20 @@
#include <stdio.h> #include <stdio.h>
#include <stdarg.h>
#include <switch.h> #include <switch.h>
static UsermodeEvent g_Event; static UEvent g_Event;
static UsermodeEvent g_ExitEvent; static UEvent g_ExitEvent;
static Mutex g_PrintMutex; static Mutex g_PrintMutex;
void locked_print(const char* str) { __attribute__((format(printf, 1, 2)))
static void locked_printf(const char* fmt, ...)
{
mutexLock(&g_PrintMutex); mutexLock(&g_PrintMutex);
printf(str); va_list va;
va_start(va, fmt);
vprintf(fmt, va);
va_end(va);
consoleUpdate(NULL);
mutexUnlock(&g_PrintMutex); mutexUnlock(&g_PrintMutex);
} }
@ -16,54 +23,46 @@ void threadFunc1(void* arg)
Result rc; Result rc;
int idx; int idx;
locked_print("Entering thread\n"); locked_printf("Entering thread\n");
while (1) while (1)
{ {
rc = waitMulti(&idx, -1, waiterForUevent(&g_Event), waiterForUevent(&g_ExitEvent)); rc = waitMulti(&idx, -1, waiterForUEvent(&g_Event), waiterForUEvent(&g_ExitEvent));
locked_printf("waitMulti returned %x, index triggered = %d\n", rc, idx);
mutexLock(&g_PrintMutex);
printf("waitMulti returned %x, index triggered = %d\n", rc, idx);
mutexUnlock(&g_PrintMutex);
if (R_SUCCEEDED(rc)) if (R_SUCCEEDED(rc))
{ {
if (idx == 0) if (idx == 0)
{ {
locked_print("g_Event triggered!\n"); locked_printf("g_Event triggered!\n");
ueventClear(&g_Event); ueventClear(&g_Event);
} }
else { else {
locked_print("g_ExitEvent triggered!\n"); locked_printf("g_ExitEvent triggered!\n");
break; break;
} }
} }
} }
rc = waitMulti(&idx, 0, waiterForUevent(&g_Event), waiterForUevent(&g_ExitEvent)); rc = waitMulti(&idx, 0, waiterForUEvent(&g_Event), waiterForUEvent(&g_ExitEvent));
if (R_SUCCEEDED(rc)) if (R_SUCCEEDED(rc))
{ locked_printf("Got leftover event %u\n", idx);
mutexLock(&g_PrintMutex);
printf("Got leftover event %u\n", idx);
mutexUnlock(&g_PrintMutex);
}
} }
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
gfxInitDefault();
consoleInit(NULL); consoleInit(NULL);
mutexInit(&g_PrintMutex); mutexInit(&g_PrintMutex);
ueventCreate(&g_Event, false); ueventCreate(&g_Event, false);
ueventCreate(&g_ExitEvent, false); ueventCreate(&g_ExitEvent, false);
locked_print("Creating thread\n"); locked_printf("Creating thread\n");
Thread thread; Thread thread;
Result rc; Result rc;
rc = threadCreate(&thread, (ThreadFunc) threadFunc1, NULL, 0x1000, 0x2C, -2); rc = threadCreate(&thread, threadFunc1, NULL, 0x10000, 0x2C, -2);
if (R_SUCCEEDED(rc)) if (R_SUCCEEDED(rc))
{ {
@ -73,10 +72,10 @@ int main(int argc, char **argv)
{ {
size_t i; size_t i;
for (i=0; i<5; i++) { for (i=0; i<5; i++) {
locked_print("Sleeping for a while\n"); locked_printf("Sleeping for a while\n");
svcSleepThread(1000000000ull); // 1s svcSleepThread(1000000000ull); // 1s
locked_print("Fire!\n"); locked_printf("Fire!\n");
ueventSignal(&g_Event); ueventSignal(&g_Event);
} }
@ -96,11 +95,9 @@ int main(int argc, char **argv)
if (kDown & KEY_PLUS) if (kDown & KEY_PLUS)
break; break;
gfxFlushBuffers(); consoleUpdate(NULL);
gfxSwapBuffers();
gfxWaitForVsync();
} }
gfxExit(); consoleExit(NULL);
return 0; return 0;
} }

View File

@ -1,14 +1,21 @@
#include <stdio.h> #include <stdio.h>
#include <stdarg.h>
#include <switch.h> #include <switch.h>
static UsermodeTimer g_Timer; static UTimer g_Timer;
static UsermodeTimer g_FastTimer; static UTimer g_FastTimer;
static UsermodeEvent g_ExitEvent; static UEvent g_ExitEvent;
static Mutex g_PrintMutex; static Mutex g_PrintMutex;
void locked_print(const char* str) { __attribute__((format(printf, 1, 2)))
static void locked_printf(const char* fmt, ...)
{
mutexLock(&g_PrintMutex); mutexLock(&g_PrintMutex);
printf(str); va_list va;
va_start(va, fmt);
vprintf(fmt, va);
va_end(va);
consoleUpdate(NULL);
mutexUnlock(&g_PrintMutex); mutexUnlock(&g_PrintMutex);
} }
@ -17,22 +24,22 @@ void threadFunc1(void* arg)
Result rc; Result rc;
int idx; int idx;
locked_print("Entering thread\n"); locked_printf("Entering thread\n");
while (1) while (1)
{ {
rc = waitMulti(&idx, -1, waiterForUtimer(&g_Timer), waiterForUtimer(&g_FastTimer), waiterForUevent(&g_ExitEvent)); rc = waitMulti(&idx, -1, waiterForUTimer(&g_Timer), waiterForUTimer(&g_FastTimer), waiterForUEvent(&g_ExitEvent));
if (R_SUCCEEDED(rc)) if (R_SUCCEEDED(rc))
{ {
if (idx == 0) { if (idx == 0) {
locked_print("g_Timer triggered!\n"); locked_printf("g_Timer triggered!\n");
} }
else if (idx == 1) { else if (idx == 1) {
locked_print("g_FasterTimer triggered!\n"); locked_printf("g_FasterTimer triggered!\n");
} }
else { else {
locked_print("g_ExitEvent triggered!\n"); locked_printf("g_ExitEvent triggered!\n");
break; break;
} }
} }
@ -41,19 +48,18 @@ void threadFunc1(void* arg)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
gfxInitDefault();
consoleInit(NULL); consoleInit(NULL);
mutexInit(&g_PrintMutex); mutexInit(&g_PrintMutex);
utimerCreate(&g_Timer, 2000000000, true); // 2s utimerCreate(&g_Timer, 2000000000, TimerType_Repeating); // 2s
utimerCreate(&g_FastTimer, 1000000000, true); // 1s utimerCreate(&g_FastTimer, 1000000000, TimerType_Repeating); // 1s
ueventCreate(&g_ExitEvent, false); ueventCreate(&g_ExitEvent, false);
locked_print("Creating thread\n"); locked_printf("Creating thread\n");
Thread thread; Thread thread;
Result rc; Result rc;
rc = threadCreate(&thread, (ThreadFunc) threadFunc1, NULL, 0x1000, 0x2C, -2); rc = threadCreate(&thread, threadFunc1, NULL, 0x10000, 0x2C, -2);
if (R_SUCCEEDED(rc)) if (R_SUCCEEDED(rc))
{ {
@ -61,20 +67,22 @@ int main(int argc, char **argv)
if (R_SUCCEEDED(rc)) if (R_SUCCEEDED(rc))
{ {
locked_print("Sleeping for 5s\n"); locked_printf("Starting timer for 5s\n");
svcSleepThread(5000000000ull); // 5s
locked_print("Stopping timer for 5s\n");
utimerStop(&g_Timer);
utimerStop(&g_FastTimer);
svcSleepThread(5000000000ull); // 5s
locked_print("Starting timer for 5s\n");
utimerStart(&g_Timer); utimerStart(&g_Timer);
utimerStart(&g_FastTimer); utimerStart(&g_FastTimer);
svcSleepThread(5000000000ull); // 5s svcSleepThread(5000000000ull); // 5s
locked_print("Done\n"); locked_printf("Stopping timer for 5s\n");
utimerStop(&g_Timer);
utimerStop(&g_FastTimer);
svcSleepThread(5000000000ull); // 5s
locked_printf("Starting timer for 5s\n");
utimerStart(&g_Timer);
utimerStart(&g_FastTimer);
svcSleepThread(5000000000ull); // 5s
locked_printf("Done\n");
ueventSignal(&g_ExitEvent); ueventSignal(&g_ExitEvent);
threadWaitForExit(&thread); threadWaitForExit(&thread);
@ -92,11 +100,9 @@ int main(int argc, char **argv)
if (kDown & KEY_PLUS) if (kDown & KEY_PLUS)
break; break;
gfxFlushBuffers(); consoleUpdate(NULL);
gfxSwapBuffers();
gfxWaitForVsync();
} }
gfxExit(); consoleExit(NULL);
return 0; return 0;
} }