Commit ddcd847c8e8de2782e01a95f645eb1834417d6a9

Ivan Epifanov 2021-09-20T14:08:01

Vita: fix thread priority Add support for thread name and stack size

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);
 
 }