Vita: fix thread priority Add support for thread name and stack size
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
diff --git a/src/thread/vita/SDL_systhread.c b/src/thread/vita/SDL_systhread.c
index 1664fbc..70a89c3 100644
--- a/src/thread/vita/SDL_systhread.c
+++ b/src/thread/vita/SDL_systhread.c
@@ -34,6 +34,15 @@
#include <psp2/types.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)
{
@@ -43,17 +52,34 @@ static int ThreadEntry(SceSize args, void *argp)
int SDL_SYS_CreateThread(SDL_Thread *thread)
{
- SceKernelThreadInfo info;
- int priority = 32;
+ char thread_name[VITA_THREAD_NAME_MAX];
+ size_t stack_size = VITA_THREAD_STACK_SIZE_DEFAULT;
+
+ SDL_strlcpy(thread_name, "SDL thread", VITA_THREAD_NAME_MAX);
+ if (thread->name) {
+ SDL_strlcpy(thread_name, thread->name, VITA_THREAD_NAME_MAX);
+ }
- /* Set priority of new thread to the same as the current thread */
- info.size = sizeof(SceKernelThreadInfo);
- if (sceKernelGetThreadInfo(sceKernelGetThreadId(), &info) == 0) {
- priority = info.currentPriority;
+ if (thread->stacksize) {
+ 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;
}
- thread->handle = sceKernelCreateThread("SDL thread", ThreadEntry,
- priority, 0x10000, 0, 0, NULL);
+ /* 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) {
return SDL_SetError("sceKernelCreateThread() failed");
@@ -92,17 +118,24 @@ void SDL_SYS_KillThread(SDL_Thread *thread)
int SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
{
- int value;
-
- if (priority == SDL_THREAD_PRIORITY_LOW) {
- value = 19;
- } else if (priority == SDL_THREAD_PRIORITY_HIGH) {
- value = -20;
- } else {
- value = 0;
+ int value = VITA_THREAD_PRIORITY_NORMAL;
+
+ switch(priority) {
+ case SDL_THREAD_PRIORITY_LOW:
+ value = VITA_THREAD_PRIORITY_LOW;
+ break;
+ case SDL_THREAD_PRIORITY_NORMAL:
+ 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);
}