Merge pull request #60 from GaryOderNichts/wiiu-platform

Wii U platform support
This commit is contained in:
Cameron Gutman 2021-06-04 21:53:58 -05:00 committed by GitHub
commit 4e7b1e3c37
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 81 additions and 2 deletions

View File

@ -69,6 +69,9 @@ DWORD WINAPI ThreadProc(LPVOID lpParameter) {
#elif defined(__vita__) #elif defined(__vita__)
int ThreadProc(SceSize args, void *argp) { int ThreadProc(SceSize args, void *argp) {
struct thread_context* ctx = (struct thread_context*)argp; struct thread_context* ctx = (struct thread_context*)argp;
#elif defined(__WIIU__)
int ThreadProc(int argc, const char** argv) {
struct thread_context* ctx = (struct thread_context*)argv;
#else #else
void* ThreadProc(void* context) { void* ThreadProc(void* context) {
struct thread_context* ctx = (struct thread_context*)context; struct thread_context* ctx = (struct thread_context*)context;
@ -88,7 +91,7 @@ void* ThreadProc(void* context) {
free(ctx); free(ctx);
#endif #endif
#if defined(LC_WINDOWS) || defined(__vita__) #if defined(LC_WINDOWS) || defined(__vita__) || defined(__WIIU__)
return 0; return 0;
#else #else
return NULL; return NULL;
@ -122,6 +125,8 @@ int PltCreateMutex(PLT_MUTEX* mutex) {
if (*mutex < 0) { if (*mutex < 0) {
return -1; return -1;
} }
#elif defined(__WIIU__)
OSFastMutex_Init(mutex, "");
#else #else
int err = pthread_mutex_init(mutex, NULL); int err = pthread_mutex_init(mutex, NULL);
if (err != 0) { if (err != 0) {
@ -138,6 +143,8 @@ void PltDeleteMutex(PLT_MUTEX* mutex) {
// No-op to destroy a SRWLOCK // No-op to destroy a SRWLOCK
#elif defined(__vita__) #elif defined(__vita__)
sceKernelDeleteMutex(*mutex); sceKernelDeleteMutex(*mutex);
#elif defined(__WIIU__)
#else #else
pthread_mutex_destroy(mutex); pthread_mutex_destroy(mutex);
#endif #endif
@ -148,6 +155,8 @@ void PltLockMutex(PLT_MUTEX* mutex) {
AcquireSRWLockExclusive(mutex); AcquireSRWLockExclusive(mutex);
#elif defined(__vita__) #elif defined(__vita__)
sceKernelLockMutex(*mutex, 1, NULL); sceKernelLockMutex(*mutex, 1, NULL);
#elif defined(__WIIU__)
OSFastMutex_Lock(mutex);
#else #else
pthread_mutex_lock(mutex); pthread_mutex_lock(mutex);
#endif #endif
@ -158,6 +167,8 @@ void PltUnlockMutex(PLT_MUTEX* mutex) {
ReleaseSRWLockExclusive(mutex); ReleaseSRWLockExclusive(mutex);
#elif defined(__vita__) #elif defined(__vita__)
sceKernelUnlockMutex(*mutex, 1); sceKernelUnlockMutex(*mutex, 1);
#elif defined(__WIIU__)
OSFastMutex_Unlock(mutex);
#else #else
pthread_mutex_unlock(mutex); pthread_mutex_unlock(mutex);
#endif #endif
@ -172,6 +183,8 @@ void PltJoinThread(PLT_THREAD* thread) {
} }
if (thread->context != NULL) if (thread->context != NULL)
free(thread->context); free(thread->context);
#elif defined(__WIIU__)
OSJoinThread(&thread->thread, NULL);
#else #else
pthread_join(thread->thread, NULL); pthread_join(thread->thread, NULL);
#endif #endif
@ -194,6 +207,12 @@ void PltInterruptThread(PLT_THREAD* thread) {
thread->cancelled = true; thread->cancelled = true;
} }
#ifdef __WIIU__
static void thread_deallocator(OSThread *thread, void *stack) {
free(stack);
}
#endif
int PltCreateThread(const char* name, ThreadEntry entry, void* context, PLT_THREAD* thread) { int PltCreateThread(const char* name, ThreadEntry entry, void* context, PLT_THREAD* thread) {
struct thread_context* ctx; struct thread_context* ctx;
@ -228,6 +247,22 @@ int PltCreateThread(const char* name, ThreadEntry entry, void* context, PLT_THRE
} }
sceKernelStartThread(thread->handle, sizeof(struct thread_context), ctx); sceKernelStartThread(thread->handle, sizeof(struct thread_context), ctx);
} }
#elif defined(__WIIU__)
int stack_size = 4 * 1024 * 1024;
void* stack_addr = (uint8_t *)memalign(8, stack_size) + stack_size;
if (!OSCreateThread(&thread->thread,
ThreadProc,
0, (char*)ctx,
stack_addr, stack_size,
0x10, OS_THREAD_ATTRIB_AFFINITY_ANY))
{
free(ctx);
return -1;
}
OSSetThreadDeallocator(&thread->thread, thread_deallocator);
OSResumeThread(&thread->thread);
#else #else
{ {
int err = pthread_create(&thread->thread, NULL, ThreadProc, ctx); int err = pthread_create(&thread->thread, NULL, ThreadProc, ctx);
@ -260,6 +295,9 @@ int PltCreateEvent(PLT_EVENT* event) {
return -1; return -1;
} }
event->signalled = false; event->signalled = false;
#elif defined(__WIIU__)
OSFastMutex_Init(&event->mutex, "");
OSFastCond_Init(&event->cond, "");
#else #else
pthread_mutex_init(&event->mutex, NULL); pthread_mutex_init(&event->mutex, NULL);
pthread_cond_init(&event->cond, NULL); pthread_cond_init(&event->cond, NULL);
@ -276,6 +314,8 @@ void PltCloseEvent(PLT_EVENT* event) {
#elif defined(__vita__) #elif defined(__vita__)
sceKernelDeleteCond(event->cond); sceKernelDeleteCond(event->cond);
sceKernelDeleteMutex(event->mutex); sceKernelDeleteMutex(event->mutex);
#elif defined(__WIIU__)
#else #else
pthread_mutex_destroy(&event->mutex); pthread_mutex_destroy(&event->mutex);
pthread_cond_destroy(&event->cond); pthread_cond_destroy(&event->cond);
@ -290,6 +330,11 @@ void PltSetEvent(PLT_EVENT* event) {
event->signalled = true; event->signalled = true;
sceKernelUnlockMutex(event->mutex, 1); sceKernelUnlockMutex(event->mutex, 1);
sceKernelSignalCondAll(event->cond); sceKernelSignalCondAll(event->cond);
#elif defined(__WIIU__)
OSFastMutex_Lock(&event->mutex);
event->signalled = 1;
OSFastMutex_Unlock(&event->mutex);
OSFastCond_Signal(&event->cond);
#else #else
pthread_mutex_lock(&event->mutex); pthread_mutex_lock(&event->mutex);
event->signalled = true; event->signalled = true;
@ -325,6 +370,14 @@ int PltWaitForEvent(PLT_EVENT* event) {
} }
sceKernelUnlockMutex(event->mutex, 1); sceKernelUnlockMutex(event->mutex, 1);
return PLT_WAIT_SUCCESS;
#elif defined(__WIIU__)
OSFastMutex_Lock(&event->mutex);
while (!event->signalled) {
OSFastCond_Wait(&event->cond, &event->mutex);
}
OSFastMutex_Unlock(&event->mutex);
return PLT_WAIT_SUCCESS; return PLT_WAIT_SUCCESS;
#else #else
pthread_mutex_lock(&event->mutex); pthread_mutex_lock(&event->mutex);

View File

@ -24,6 +24,14 @@
#include <sys/time.h> #include <sys/time.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <psp2/kernel/threadmgr.h> #include <psp2/kernel/threadmgr.h>
#elif defined(__WIIU__)
#include <unistd.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <malloc.h>
#include <coreinit/thread.h>
#include <coreinit/fastmutex.h>
#include <coreinit/fastcondition.h>
#else #else
#include <unistd.h> #include <unistd.h>
#include <pthread.h> #include <pthread.h>

View File

@ -64,6 +64,9 @@ int setNonFatalRecvTimeoutMs(SOCKET s, int timeoutMs) {
// losing some data in a very rare case is fine, especially because we get to // losing some data in a very rare case is fine, especially because we get to
// halve the number of syscalls per packet by avoiding select(). // halve the number of syscalls per packet by avoiding select().
return setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeoutMs, sizeof(timeoutMs)); return setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeoutMs, sizeof(timeoutMs));
#elif defined(__WIIU__)
// timeouts aren't supported on Wii U
return -1;
#else #else
struct timeval val; struct timeval val;
@ -75,6 +78,9 @@ int setNonFatalRecvTimeoutMs(SOCKET s, int timeoutMs) {
} }
void setRecvTimeout(SOCKET s, int timeoutSec) { void setRecvTimeout(SOCKET s, int timeoutSec) {
#ifdef __WIIU__
// timeouts aren't supported on Wii U
#else
#if defined(LC_WINDOWS) #if defined(LC_WINDOWS)
int val = timeoutSec * 1000; int val = timeoutSec * 1000;
#else #else
@ -86,6 +92,7 @@ void setRecvTimeout(SOCKET s, int timeoutSec) {
if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&val, sizeof(val)) < 0) { if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&val, sizeof(val)) < 0) {
Limelog("setsockopt(SO_RCVTIMEO) failed: %d\n", (int)LastSocketError()); Limelog("setsockopt(SO_RCVTIMEO) failed: %d\n", (int)LastSocketError());
} }
#endif
} }
int pollSockets(struct pollfd* pollFds, int pollFdsCount, int timeoutMs) { int pollSockets(struct pollfd* pollFds, int pollFdsCount, int timeoutMs) {
@ -704,7 +711,7 @@ int initializePlatformSockets(void) {
#if defined(LC_WINDOWS) #if defined(LC_WINDOWS)
WSADATA data; WSADATA data;
return WSAStartup(MAKEWORD(2, 0), &data); return WSAStartup(MAKEWORD(2, 0), &data);
#elif defined(__vita__) #elif defined(__vita__) || defined(__WIIU__)
return 0; // already initialized return 0; // already initialized
#elif defined(LC_POSIX) && !defined(LC_CHROME) #elif defined(LC_POSIX) && !defined(LC_CHROME)
// Disable SIGPIPE signals to avoid us getting // Disable SIGPIPE signals to avoid us getting

View File

@ -25,6 +25,17 @@ typedef struct _PLT_THREAD {
void *context; void *context;
bool alive; bool alive;
} PLT_THREAD; } PLT_THREAD;
#elif defined(__WIIU__)
typedef OSFastMutex PLT_MUTEX;
typedef struct _PLT_EVENT {
OSFastMutex mutex;
OSFastCondition cond;
int signalled;
} PLT_EVENT;
typedef struct _PLT_THREAD {
OSThread thread;
int cancelled;
} PLT_THREAD;
#elif defined (LC_POSIX) #elif defined (LC_POSIX)
typedef pthread_mutex_t PLT_MUTEX; typedef pthread_mutex_t PLT_MUTEX;
typedef struct _PLT_EVENT { typedef struct _PLT_EVENT {