mirror of
https://github.com/switchbrew/switch-examples.git
synced 2025-06-21 13:22:40 +02:00
Update and fix usermode event/timer examples
This commit is contained in:
parent
86f28347cf
commit
f0d7771a3a
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user