#include #include #include #include #include #include #include #define EXAMPLE 2 #if EXAMPLE == 1 void app_thread1 (void) { test ('b'); quit (); } 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, stack_size, fn); } void app_main (void) { spawn (&app_thread1); } #elif EXAMPLE == 2 #define MUTEX 2000 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, stack_size, fn); } void app_main (void) { create_mutex (MUTEX, RV_PRIVATE); spawn (&app_thread1); for (;;) { /* lock_mutex (MUTEX, RV_PRIVATE); */ for (int i = 0; i < 3; i++) test ('a'); /* unlock_mutex (MUTEX, RV_PRIVATE); */ } } void app_thread1 (void) { for (int i = 0; i < 3; i++) test ('b'); for (;;) { /* lock_mutex (MUTEX, RV_PRIVATE); */ /* unlock_mutex (MUTEX, RV_PRIVATE); */ } quit (); } #endif