Add vita environment (#22)

* vita: initial port

* vita: implement events, enable input thread

* vita: gethostbyname

* vita: Enable audio

* vita: Fix thread crash on discoonect process

* vita: Handle cannot create thread

* vita: now use newlib's socket apis

* vita: Refactoring for moonlight-stream/moonlight-common-c

* Fix review things

https://github.com/moonlight-stream/moonlight-common-c/pull/22#pullrequestreview-2436093

- vita may not support IPv6; so add LC_ASSERT them.
- define inet_ntop to sceNetInetNtop
- guard about failure of sceKernelCreateMutex or sceKernelCreateCond
- remove meanless macros

https://github.com/moonlight-stream/moonlight-common-c/pull/22#pullrequestreview-2444677

- !*mutex to *mutex
- remove useless LC_ASSERT then change to use inet_ntop
  in vita system not defined `sockaddr_in6`, so just use `sockaddr_in` instead this.

https://github.com/moonlight-stream/moonlight-common-c/pull/22#pullrequestreview-2445642

- define sin6_addr
This commit is contained in:
Sunguk Lee
2016-10-06 08:43:33 +09:00
committed by Cameron Gutman
parent 293c6a7274
commit ba27e97698
7 changed files with 140 additions and 6 deletions
+16
View File
@@ -153,6 +153,7 @@ static void ClInternalConnectionTerminated(long errorCode)
static int resolveHostName(const char* host) static int resolveHostName(const char* host)
{ {
#ifndef __vita__
struct addrinfo hints, *res; struct addrinfo hints, *res;
int err; int err;
@@ -187,6 +188,21 @@ static int resolveHostName(const char* host)
freeaddrinfo(res); freeaddrinfo(res);
return 0; return 0;
#else
struct hostent *phost = gethostbyname(host);
if (!phost) {
Limelog("gethostbyname() failed for host %s\n", host);
return -1;
}
struct sockaddr_in tmp = {0};
tmp.sin_len = sizeof(tmp);
tmp.sin_family = SCE_NET_AF_INET;
memcpy(&tmp.sin_addr, phost->h_addr, phost->h_length);
memcpy(&RemoteAddr, &tmp, sizeof(tmp));
RemoteAddrLen = sizeof(tmp);
return 0;
#endif
} }
// Starts the connection to the streaming machine // Starts the connection to the streaming machine
+71 -1
View File
@@ -9,6 +9,9 @@ void cleanupPlatformSockets(void);
struct thread_context { struct thread_context {
ThreadEntry entry; ThreadEntry entry;
void* context; void* context;
#if defined(__vita__)
PLT_THREAD* thread;
#endif
}; };
static int running_threads = 0; static int running_threads = 0;
@@ -29,6 +32,9 @@ void LimelogWindows(char* Format, ...) {
#if defined(LC_WINDOWS) #if defined(LC_WINDOWS)
DWORD WINAPI ThreadProc(LPVOID lpParameter) { DWORD WINAPI ThreadProc(LPVOID lpParameter) {
struct thread_context* ctx = (struct thread_context*)lpParameter; struct thread_context* ctx = (struct thread_context*)lpParameter;
#elif defined(__vita__)
int ThreadProc(SceSize args, void *argp) {
struct thread_context* ctx = (struct thread_context*)argp;
#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;
@@ -36,9 +42,13 @@ void* ThreadProc(void* context) {
ctx->entry(ctx->context); ctx->entry(ctx->context);
#if defined(__vita__)
ctx->thread->alive = 0;
#else
free(ctx); free(ctx);
#endif
#if defined(LC_WINDOWS) #if defined(LC_WINDOWS) || defined(__vita__)
return 0; return 0;
#else #else
return NULL; return NULL;
@@ -48,6 +58,8 @@ void* ThreadProc(void* context) {
void PltSleepMs(int ms) { void PltSleepMs(int ms) {
#if defined(LC_WINDOWS) #if defined(LC_WINDOWS)
WaitForSingleObjectEx(GetCurrentThread(), ms, FALSE); WaitForSingleObjectEx(GetCurrentThread(), ms, FALSE);
#elif defined(__vita__)
sceKernelDelayThread(ms * 1000);
#else #else
useconds_t usecs = ms * 1000; useconds_t usecs = ms * 1000;
usleep(usecs); usleep(usecs);
@@ -61,6 +73,12 @@ int PltCreateMutex(PLT_MUTEX* mutex) {
return -1; return -1;
} }
return 0; return 0;
#elif defined(__vita__)
*mutex = sceKernelCreateMutex("", 0, 0, NULL);
if (*mutex < 0) {
return -1;
}
return 0;
#else #else
return pthread_mutex_init(mutex, NULL); return pthread_mutex_init(mutex, NULL);
#endif #endif
@@ -69,6 +87,8 @@ int PltCreateMutex(PLT_MUTEX* mutex) {
void PltDeleteMutex(PLT_MUTEX* mutex) { void PltDeleteMutex(PLT_MUTEX* mutex) {
#if defined(LC_WINDOWS) #if defined(LC_WINDOWS)
CloseHandle(*mutex); CloseHandle(*mutex);
#elif defined(__vita__)
sceKernelDeleteMutex(*mutex);
#else #else
pthread_mutex_destroy(mutex); pthread_mutex_destroy(mutex);
#endif #endif
@@ -81,6 +101,8 @@ void PltLockMutex(PLT_MUTEX* mutex) {
if (err != WAIT_OBJECT_0) { if (err != WAIT_OBJECT_0) {
LC_ASSERT(FALSE); LC_ASSERT(FALSE);
} }
#elif defined(__vita__)
sceKernelLockMutex(*mutex, 1, NULL);
#else #else
pthread_mutex_lock(mutex); pthread_mutex_lock(mutex);
#endif #endif
@@ -89,6 +111,8 @@ void PltLockMutex(PLT_MUTEX* mutex) {
void PltUnlockMutex(PLT_MUTEX* mutex) { void PltUnlockMutex(PLT_MUTEX* mutex) {
#if defined(LC_WINDOWS) #if defined(LC_WINDOWS)
ReleaseMutex(*mutex); ReleaseMutex(*mutex);
#elif defined(__vita__)
sceKernelUnlockMutex(*mutex, 1);
#else #else
pthread_mutex_unlock(mutex); pthread_mutex_unlock(mutex);
#endif #endif
@@ -98,6 +122,12 @@ void PltJoinThread(PLT_THREAD* thread) {
LC_ASSERT(thread->cancelled); LC_ASSERT(thread->cancelled);
#if defined(LC_WINDOWS) #if defined(LC_WINDOWS)
WaitForSingleObjectEx(thread->handle, INFINITE, FALSE); WaitForSingleObjectEx(thread->handle, INFINITE, FALSE);
#elif defined(__vita__)
while(thread->alive) {
PltSleepMs(10);
}
if (thread->context != NULL)
free(thread->context);
#else #else
pthread_join(thread->thread, NULL); pthread_join(thread->thread, NULL);
#endif #endif
@@ -107,6 +137,8 @@ void PltCloseThread(PLT_THREAD* thread) {
running_threads--; running_threads--;
#if defined(LC_WINDOWS) #if defined(LC_WINDOWS)
CloseHandle(thread->handle); CloseHandle(thread->handle);
#elif defined(__vita__)
sceKernelDeleteThread(thread->handle);
#endif #endif
} }
@@ -139,6 +171,18 @@ int PltCreateThread(ThreadEntry entry, void* context, PLT_THREAD* thread) {
return -1; return -1;
} }
} }
#elif defined(__vita__)
{
thread->alive = 1;
thread->context = ctx;
ctx->thread = thread;
thread->handle = sceKernelCreateThread("", ThreadProc, 0, 0x10000, 0, 0, NULL);
if (thread->handle < 0) {
free(ctx);
return -1;
}
sceKernelStartThread(thread->handle, sizeof(struct thread_context), ctx);
}
#else #else
{ {
int err = pthread_create(&thread->thread, NULL, ThreadProc, ctx); int err = pthread_create(&thread->thread, NULL, ThreadProc, ctx);
@@ -161,6 +205,18 @@ int PltCreateEvent(PLT_EVENT* event) {
return -1; return -1;
} }
return 0;
#elif defined(__vita__)
event->mutex = sceKernelCreateMutex("", 0, 0, NULL);
if (event->mutex < 0) {
return -1;
}
event->cond = sceKernelCreateCond("", 0, event->mutex, NULL);
if (event->cond < 0) {
sceKernelDeleteMutex(event->mutex);
return -1;
}
event->signalled = 0;
return 0; return 0;
#else #else
pthread_mutex_init(&event->mutex, NULL); pthread_mutex_init(&event->mutex, NULL);
@@ -173,6 +229,9 @@ int PltCreateEvent(PLT_EVENT* event) {
void PltCloseEvent(PLT_EVENT* event) { void PltCloseEvent(PLT_EVENT* event) {
#if defined(LC_WINDOWS) #if defined(LC_WINDOWS)
CloseHandle(*event); CloseHandle(*event);
#elif defined(__vita__)
sceKernelDeleteCond(event->cond);
sceKernelDeleteMutex(event->mutex);
#else #else
pthread_mutex_destroy(&event->mutex); pthread_mutex_destroy(&event->mutex);
pthread_cond_destroy(&event->cond); pthread_cond_destroy(&event->cond);
@@ -182,6 +241,9 @@ void PltCloseEvent(PLT_EVENT* event) {
void PltSetEvent(PLT_EVENT* event) { void PltSetEvent(PLT_EVENT* event) {
#if defined(LC_WINDOWS) #if defined(LC_WINDOWS)
SetEvent(*event); SetEvent(*event);
#elif defined(__vita__)
event->signalled = 1;
sceKernelSignalCondAll(event->cond);
#else #else
event->signalled = 1; event->signalled = 1;
pthread_cond_broadcast(&event->cond); pthread_cond_broadcast(&event->cond);
@@ -208,6 +270,14 @@ int PltWaitForEvent(PLT_EVENT* event) {
LC_ASSERT(0); LC_ASSERT(0);
return -1; return -1;
} }
#elif defined(__vita__)
sceKernelLockMutex(event->mutex, 1, NULL);
while (!event->signalled) {
sceKernelWaitCond(event->cond, NULL);
}
sceKernelUnlockMutex(event->mutex, 1);
return PLT_WAIT_SUCCESS;
#else #else
pthread_mutex_lock(&event->mutex); pthread_mutex_lock(&event->mutex);
while (!event->signalled) { while (!event->signalled) {
+7
View File
@@ -9,6 +9,11 @@
#include <Windows.h> #include <Windows.h>
#include <Winsock2.h> #include <Winsock2.h>
#include <ws2tcpip.h> #include <ws2tcpip.h>
#elif defined(__vita__)
#include <unistd.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <psp2/kernel/threadmgr.h>
#else #else
#include <unistd.h> #include <unistd.h>
#include <pthread.h> #include <pthread.h>
@@ -34,6 +39,8 @@
void LimelogWindows(char* Format, ...); void LimelogWindows(char* Format, ...);
#define Limelog(s, ...) \ #define Limelog(s, ...) \
LimelogWindows(s, ##__VA_ARGS__) LimelogWindows(s, ##__VA_ARGS__)
#elif defined(__vita__)
#define Limelog sceClibPrintf
#else #else
#define Limelog(s, ...) \ #define Limelog(s, ...) \
fprintf(stderr, s, ##__VA_ARGS__) fprintf(stderr, s, ##__VA_ARGS__)
+6
View File
@@ -79,7 +79,11 @@ SOCKET bindUdpSocket(int addrfamily, int bufferSize) {
struct sockaddr_storage addr; struct sockaddr_storage addr;
int err; int err;
#ifndef __vita__
LC_ASSERT(addrfamily == AF_INET || addrfamily == AF_INET6); LC_ASSERT(addrfamily == AF_INET || addrfamily == AF_INET6);
#else
LC_ASSERT(addrfamily == AF_INET);
#endif
s = socket(addrfamily, SOCK_DGRAM, IPPROTO_UDP); s = socket(addrfamily, SOCK_DGRAM, IPPROTO_UDP);
if (s == INVALID_SOCKET) { if (s == INVALID_SOCKET) {
@@ -253,6 +257,8 @@ 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__)
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
// killed when a socket gets an EPIPE error // killed when a socket gets an EPIPE error
+22
View File
@@ -14,6 +14,16 @@
typedef int SOCK_RET; typedef int SOCK_RET;
typedef int SOCKADDR_LEN; typedef int SOCKADDR_LEN;
#else
#if defined(__vita__)
#include <psp2/net/net.h>
#include <enet/enet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#else #else
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
@@ -24,6 +34,7 @@ typedef int SOCKADDR_LEN;
#include <netdb.h> #include <netdb.h>
#include <errno.h> #include <errno.h>
#include <signal.h> #include <signal.h>
#endif
#define ioctlsocket ioctl #define ioctlsocket ioctl
#define LastSocketError() errno #define LastSocketError() errno
@@ -36,6 +47,17 @@ typedef ssize_t SOCK_RET;
typedef socklen_t SOCKADDR_LEN; typedef socklen_t SOCKADDR_LEN;
#endif #endif
#if defined(__vita__)
#define TCP_NODELAY SCE_NET_TCP_NODELAY
#define INADDR_ANY SCE_NET_INADDR_ANY
#define sockaddr_in6 sockaddr_in
#define sin6_addr sin_addr
#define sin6_port sin_port
#define INET6_ADDRSTRLEN 128
#define inet_ntop sceNetInetNtop
#endif
#define LastSocketFail() ((LastSocketError() != 0) ? LastSocketError() : -1) #define LastSocketFail() ((LastSocketError() != 0) ? LastSocketError() : -1)
// IPv6 addresses have 2 extra characters for URL escaping // IPv6 addresses have 2 extra characters for URL escaping
+13
View File
@@ -12,6 +12,19 @@ typedef struct _PLT_THREAD {
HANDLE handle; HANDLE handle;
int cancelled; int cancelled;
} PLT_THREAD; } PLT_THREAD;
#elif defined(__vita__)
typedef int PLT_MUTEX;
typedef struct _PLT_EVENT {
int mutex;
int cond;
int signalled;
} PLT_EVENT;
typedef struct _PLT_THREAD {
int handle;
int cancelled;
void *context;
int alive;
} 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 {