From b8ec926078d1a8f900043fe0a020b157b248c1c1 Mon Sep 17 00:00:00 2001 From: M4xw Date: Mon, 1 Oct 2018 21:12:59 +0200 Subject: [PATCH] [LIBNX] Split non-inline functions from the header, increase stack --- Makefile.common | 3 ++ libretro-common/rthreads/switch_pthread.c | 60 +++++++++++++++++++++++ libretro-common/rthreads/switch_pthread.h | 39 +-------------- 3 files changed, 65 insertions(+), 37 deletions(-) create mode 100644 libretro-common/rthreads/switch_pthread.c diff --git a/Makefile.common b/Makefile.common index 09cec5d8b0..beee6c8764 100644 --- a/Makefile.common +++ b/Makefile.common @@ -831,6 +831,9 @@ ifeq ($(TARGET), retroarch_switch) ifeq ($(HAVE_OPENGL), 1) OBJ += gfx/drivers_context/switch_ctx.o endif + ifeq ($(HAVE_THREADS), 1) + OBJ += $(LIBRETRO_COMM_DIR)/rthreads/switch_pthread.o + endif else OBJ += gfx/drivers/switch_gfx.o endif diff --git a/libretro-common/rthreads/switch_pthread.c b/libretro-common/rthreads/switch_pthread.c new file mode 100644 index 0000000000..6938105640 --- /dev/null +++ b/libretro-common/rthreads/switch_pthread.c @@ -0,0 +1,60 @@ +/* Copyright (C) 2018 - M4xw , RetroArch Team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (switch_pthread.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "switch_pthread.h" + +#define STACKSIZE 1000000 * 12 // 12 MB +static uint32_t threadCounter = 1; +int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) +{ + u32 prio = 0; + + Thread new_switch_thread; + + svcGetThreadPriority(&prio, CUR_THREAD_HANDLE); + + // Launch threads on Core 1 + int rc = threadCreate(&new_switch_thread, (void (*)(void *))start_routine, arg, STACKSIZE, prio - 1, 1); + + if (R_FAILED(rc)) + { + return EAGAIN; + } + + printf("[Threading]: Starting Thread(#%i)\n", threadCounter); + if (R_FAILED(threadStart(&new_switch_thread))) + { + threadClose(&new_switch_thread); + return -1; + } + + *thread = new_switch_thread; + + return 0; +} + +void pthread_exit(void *retval) +{ + (void)retval; + printf("[Threading]: Exiting Thread\n"); + svcExitThread(); +} diff --git a/libretro-common/rthreads/switch_pthread.h b/libretro-common/rthreads/switch_pthread.h index 53491d91fc..a9ea9be1a3 100644 --- a/libretro-common/rthreads/switch_pthread.h +++ b/libretro-common/rthreads/switch_pthread.h @@ -32,6 +32,8 @@ #include "../../verbosity.h" #define THREADVARS_MAGIC 0x21545624 // !TV$ +int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); +void pthread_exit(void *retval); // This structure is exactly 0x20 bytes, if more is needed modify getThreadVars() below typedef struct @@ -57,43 +59,6 @@ static INLINE ThreadVars *getThreadVars(void) return (ThreadVars *)((u8 *)armGetTls() + 0x1E0); } -#define STACKSIZE (128 * 1024) -static uint32_t threadCounter = 1; -int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) -{ - u32 prio = 0; - - Thread new_switch_thread; - - svcGetThreadPriority(&prio, CUR_THREAD_HANDLE); - - // Launch threads on Core 1 - int rc = threadCreate(&new_switch_thread, (void (*)(void *))start_routine, arg, STACKSIZE, prio - 1, 1); - - if (R_FAILED(rc)) - { - return EAGAIN; - } - - printf("[Threading]: Starting Thread(#%i)\n", threadCounter); - if (R_FAILED(threadStart(&new_switch_thread))) - { - threadClose(&new_switch_thread); - return -1; - } - - *thread = new_switch_thread; - - return 0; -} - -void pthread_exit(void *retval) -{ - (void)retval; - printf("[Threading]: Exiting Thread\n"); - svcExitThread(); -} - static INLINE Thread threadGetCurrent(void) { ThreadVars *tv = getThreadVars();