Vita: fix thread priority Add support for thread name and stack size
parent
21c1082786
commit
ddcd847c8e
|
@ -34,6 +34,15 @@
|
||||||
#include <psp2/types.h>
|
#include <psp2/types.h>
|
||||||
#include <psp2/kernel/threadmgr.h>
|
#include <psp2/kernel/threadmgr.h>
|
||||||
|
|
||||||
|
#define VITA_THREAD_STACK_SIZE_MIN 0x1000 // 4KiB
|
||||||
|
#define VITA_THREAD_STACK_SIZE_MAX 0x2000000 // 32MiB
|
||||||
|
#define VITA_THREAD_STACK_SIZE_DEFAULT 0x10000 // 64KiB
|
||||||
|
#define VITA_THREAD_NAME_MAX 32
|
||||||
|
|
||||||
|
#define VITA_THREAD_PRIORITY_LOW 191
|
||||||
|
#define VITA_THREAD_PRIORITY_NORMAL 160
|
||||||
|
#define VITA_THREAD_PRIORITY_HIGH 112
|
||||||
|
#define VITA_THREAD_PRIORITY_TIME_CRITICAL 64
|
||||||
|
|
||||||
static int ThreadEntry(SceSize args, void *argp)
|
static int ThreadEntry(SceSize args, void *argp)
|
||||||
{
|
{
|
||||||
|
@ -43,17 +52,34 @@ static int ThreadEntry(SceSize args, void *argp)
|
||||||
|
|
||||||
int SDL_SYS_CreateThread(SDL_Thread *thread)
|
int SDL_SYS_CreateThread(SDL_Thread *thread)
|
||||||
{
|
{
|
||||||
SceKernelThreadInfo info;
|
char thread_name[VITA_THREAD_NAME_MAX];
|
||||||
int priority = 32;
|
size_t stack_size = VITA_THREAD_STACK_SIZE_DEFAULT;
|
||||||
|
|
||||||
/* Set priority of new thread to the same as the current thread */
|
SDL_strlcpy(thread_name, "SDL thread", VITA_THREAD_NAME_MAX);
|
||||||
info.size = sizeof(SceKernelThreadInfo);
|
if (thread->name) {
|
||||||
if (sceKernelGetThreadInfo(sceKernelGetThreadId(), &info) == 0) {
|
SDL_strlcpy(thread_name, thread->name, VITA_THREAD_NAME_MAX);
|
||||||
priority = info.currentPriority;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
thread->handle = sceKernelCreateThread("SDL thread", ThreadEntry,
|
if (thread->stacksize) {
|
||||||
priority, 0x10000, 0, 0, NULL);
|
if (thread->stacksize < VITA_THREAD_STACK_SIZE_MIN) {
|
||||||
|
thread->stacksize = VITA_THREAD_STACK_SIZE_MIN;
|
||||||
|
}
|
||||||
|
if (thread->stacksize > VITA_THREAD_STACK_SIZE_MAX) {
|
||||||
|
thread->stacksize = VITA_THREAD_STACK_SIZE_MAX;
|
||||||
|
}
|
||||||
|
stack_size = thread->stacksize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create new thread with the same priority as the current thread */
|
||||||
|
thread->handle = sceKernelCreateThread(
|
||||||
|
thread_name, // name
|
||||||
|
ThreadEntry, // function to run
|
||||||
|
0, // priority. 0 means priority of calling thread
|
||||||
|
stack_size, // stack size
|
||||||
|
0, // attibutes. always 0
|
||||||
|
0, // cpu affinity mask. 0 = all CPUs
|
||||||
|
NULL // opt. always NULL
|
||||||
|
);
|
||||||
|
|
||||||
if (thread->handle < 0) {
|
if (thread->handle < 0) {
|
||||||
return SDL_SetError("sceKernelCreateThread() failed");
|
return SDL_SetError("sceKernelCreateThread() failed");
|
||||||
|
@ -92,17 +118,24 @@ void SDL_SYS_KillThread(SDL_Thread *thread)
|
||||||
|
|
||||||
int SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
|
int SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
|
||||||
{
|
{
|
||||||
int value;
|
int value = VITA_THREAD_PRIORITY_NORMAL;
|
||||||
|
|
||||||
if (priority == SDL_THREAD_PRIORITY_LOW) {
|
switch(priority) {
|
||||||
value = 19;
|
case SDL_THREAD_PRIORITY_LOW:
|
||||||
} else if (priority == SDL_THREAD_PRIORITY_HIGH) {
|
value = VITA_THREAD_PRIORITY_LOW;
|
||||||
value = -20;
|
break;
|
||||||
} else {
|
case SDL_THREAD_PRIORITY_NORMAL:
|
||||||
value = 0;
|
value = VITA_THREAD_PRIORITY_NORMAL;
|
||||||
|
break;
|
||||||
|
case SDL_THREAD_PRIORITY_HIGH:
|
||||||
|
value = VITA_THREAD_PRIORITY_HIGH;
|
||||||
|
break;
|
||||||
|
case SDL_THREAD_PRIORITY_TIME_CRITICAL:
|
||||||
|
value = VITA_THREAD_PRIORITY_TIME_CRITICAL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return sceKernelChangeThreadPriority(sceKernelGetThreadId(),value);
|
return sceKernelChangeThreadPriority(0, value);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue