mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2025-08-17 17:05:50 +00:00
Wii U platform support
This commit is contained in:
parent
509a17dbc3
commit
0c66a50e2d
@ -122,6 +122,8 @@ int PltCreateMutex(PLT_MUTEX* mutex) {
|
|||||||
if (*mutex < 0) {
|
if (*mutex < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
#elif defined(__WIIU__)
|
||||||
|
OSInitMutex(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 +140,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 +152,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__)
|
||||||
|
OSLockMutex(mutex);
|
||||||
#else
|
#else
|
||||||
pthread_mutex_lock(mutex);
|
pthread_mutex_lock(mutex);
|
||||||
#endif
|
#endif
|
||||||
@ -158,6 +164,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__)
|
||||||
|
OSUnlockMutex(mutex);
|
||||||
#else
|
#else
|
||||||
pthread_mutex_unlock(mutex);
|
pthread_mutex_unlock(mutex);
|
||||||
#endif
|
#endif
|
||||||
@ -172,6 +180,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 +204,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 +244,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,
|
||||||
|
(OSThreadEntryPointFn)ThreadProc,
|
||||||
|
(int)ctx, NULL,
|
||||||
|
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 +292,9 @@ int PltCreateEvent(PLT_EVENT* event) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
event->signalled = false;
|
event->signalled = false;
|
||||||
|
#elif defined(__WIIU__)
|
||||||
|
OSInitMutex(&event->mutex);
|
||||||
|
OSInitCond(&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 +311,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 +327,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__)
|
||||||
|
OSLockMutex(&event->mutex);
|
||||||
|
event->signalled = 1;
|
||||||
|
OSUnlockMutex(&event->mutex);
|
||||||
|
OSSignalCond(&event->cond);
|
||||||
#else
|
#else
|
||||||
pthread_mutex_lock(&event->mutex);
|
pthread_mutex_lock(&event->mutex);
|
||||||
event->signalled = true;
|
event->signalled = true;
|
||||||
@ -325,6 +367,14 @@ int PltWaitForEvent(PLT_EVENT* event) {
|
|||||||
}
|
}
|
||||||
sceKernelUnlockMutex(event->mutex, 1);
|
sceKernelUnlockMutex(event->mutex, 1);
|
||||||
|
|
||||||
|
return PLT_WAIT_SUCCESS;
|
||||||
|
#elif defined(__WIIU__)
|
||||||
|
OSLockMutex(&event->mutex);
|
||||||
|
while (!event->signalled) {
|
||||||
|
OSWaitCond(&event->cond, &event->mutex);
|
||||||
|
}
|
||||||
|
OSUnlockMutex(&event->mutex);
|
||||||
|
|
||||||
return PLT_WAIT_SUCCESS;
|
return PLT_WAIT_SUCCESS;
|
||||||
#else
|
#else
|
||||||
pthread_mutex_lock(&event->mutex);
|
pthread_mutex_lock(&event->mutex);
|
||||||
|
@ -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/mutex.h>
|
||||||
|
#include <coreinit/condition.h>
|
||||||
#else
|
#else
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
@ -64,6 +64,8 @@ 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
|
||||||
#else
|
#else
|
||||||
struct timeval val;
|
struct timeval val;
|
||||||
|
|
||||||
@ -75,6 +77,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 +91,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 +710,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
|
||||||
|
@ -25,6 +25,17 @@ typedef struct _PLT_THREAD {
|
|||||||
void *context;
|
void *context;
|
||||||
bool alive;
|
bool alive;
|
||||||
} PLT_THREAD;
|
} PLT_THREAD;
|
||||||
|
#elif defined(__WIIU__)
|
||||||
|
typedef OSMutex PLT_MUTEX;
|
||||||
|
typedef struct _PLT_EVENT {
|
||||||
|
OSMutex mutex;
|
||||||
|
OSCondition 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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user