From 388418a718806aed64111a8a10303958de1eba57 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Thu, 29 Jan 2026 00:08:54 +0100 Subject: [PATCH] Nice wrappers around process management --- init/init.c | 57 ++++++++++++++++-------------------------- libmsl/proc/.gitignore | 1 + libmsl/proc/local.h | 6 +++++ libmsl/proc/proc.c | 17 +++++++++++++ libmsl/proc/proc.h | 13 ++++++++++ libmsl/proc/src.mk | 3 +++ libmsl/src.mk | 1 + 7 files changed, 63 insertions(+), 35 deletions(-) create mode 100644 libmsl/proc/.gitignore create mode 100644 libmsl/proc/local.h create mode 100644 libmsl/proc/proc.c create mode 100644 libmsl/proc/proc.h create mode 100644 libmsl/proc/src.mk diff --git a/init/init.c b/init/init.c index 83c4f04..69442f5 100644 --- a/init/init.c +++ b/init/init.c @@ -1,45 +1,15 @@ -#include #include -#include -#include +#include +#include #include #include #include #define MUTEX 2000 -__thread char letter = 'c'; +LOCAL char letter = 'c'; -void app_thread1 (void); - -int spawn (void (*fn) (void)) { - size_t stack_size = 256 * PAGE_SIZE; - void* stack = malloc (stack_size); - if (stack == NULL) - return -ST_OOM_ERROR; - - uintptr_t stack_top = (uintptr_t)stack + stack_size; - return clone (stack_top, fn); -} - -void app_main (void) { - mutex_create (MUTEX); - - letter = 'a'; - - spawn (&app_thread1); - - for (;;) { - mutex_lock (MUTEX); - - for (int i = 0; i < 3; i++) - test (letter); - - mutex_unlock (MUTEX); - } -} - -void app_thread1 (void) { +void app_proc1 (void) { letter = 'b'; for (;;) { @@ -51,5 +21,22 @@ void app_thread1 (void) { mutex_unlock (MUTEX); } - quit (); + process_quit (); +} + +void app_main (void) { + mutex_create (MUTEX); + + letter = 'a'; + + process_spawn (&app_proc1); + + for (;;) { + mutex_lock (MUTEX); + + for (int i = 0; i < 3; i++) + test (letter); + + mutex_unlock (MUTEX); + } } diff --git a/libmsl/proc/.gitignore b/libmsl/proc/.gitignore new file mode 100644 index 0000000..5761abc --- /dev/null +++ b/libmsl/proc/.gitignore @@ -0,0 +1 @@ +*.o diff --git a/libmsl/proc/local.h b/libmsl/proc/local.h new file mode 100644 index 0000000..df3c69d --- /dev/null +++ b/libmsl/proc/local.h @@ -0,0 +1,6 @@ +#ifndef _LIBMSL_PROC_TLS_H +#define _LIBMSL_PROC_TLS_H + +#define LOCAL __thread + +#endif // _LIBMSL_PROC_TLS_H diff --git a/libmsl/proc/proc.c b/libmsl/proc/proc.c new file mode 100644 index 0000000..45cb4c6 --- /dev/null +++ b/libmsl/proc/proc.c @@ -0,0 +1,17 @@ +#include +#include +#include +#include +#include +#include + +int process_spawn (process_func_t func) { + void* stack = malloc (PROC_STACK_SIZE); + if (stack == NULL) + return -ST_OOM_ERROR; + + uintptr_t top = (uintptr_t)stack + PROC_STACK_SIZE; + return clone (top, func); +} + +int process_quit (void) { return quit (); } diff --git a/libmsl/proc/proc.h b/libmsl/proc/proc.h new file mode 100644 index 0000000..a4584bb --- /dev/null +++ b/libmsl/proc/proc.h @@ -0,0 +1,13 @@ +#ifndef _LIBMSL_PROC_PROC_H +#define _LIBMSL_PROC_PROC_H + +#include + +#define PROC_STACK_SIZE 256 * PAGE_SIZE + +typedef void (*process_func_t) (void); + +int process_spawn (process_func_t func); +int process_quit (void); + +#endif // _LIBMSL_PROC_PROC_H diff --git a/libmsl/proc/src.mk b/libmsl/proc/src.mk new file mode 100644 index 0000000..1c7a57b --- /dev/null +++ b/libmsl/proc/src.mk @@ -0,0 +1,3 @@ +c += proc/proc.c + +o += proc/proc.o diff --git a/libmsl/src.mk b/libmsl/src.mk index e2e4e8b..f3e6044 100644 --- a/libmsl/src.mk +++ b/libmsl/src.mk @@ -3,3 +3,4 @@ include init/src.mk include m/src.mk include string/src.mk include alloc/src.mk +include proc/src.mk