X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fnet%2Flwip%2Fsrc%2Farch%2Fsys_arch.c;h=e33f2364f54c4598947b0bc889e40e5787875bfd;hb=328675078ae8cd81cfa3524ad9cd082621a18566;hp=1d314cc3d7e15ec481406ac06f6c56f14db3d2cd;hpb=de27e5352ed34f2313f04a5330e65a90fff0ff07;p=bertos.git diff --git a/bertos/net/lwip/src/arch/sys_arch.c b/bertos/net/lwip/src/arch/sys_arch.c index 1d314cc3..e33f2364 100644 --- a/bertos/net/lwip/src/arch/sys_arch.c +++ b/bertos/net/lwip/src/arch/sys_arch.c @@ -1,4 +1,4 @@ -#include +#include "cfg/cfg_lwip.h" #define LOG_LEVEL 3 #define LOG_FORMAT 0 @@ -336,10 +336,23 @@ static void thread_trampoline(void) thread_node->entry(thread_node->arg); } +#if !CONFIG_KERN_HEAP +/* + * NOTE: threads are never destroyed, consequently these stacks are never + * deallocated. So, the stack allocator can be implemented as a simple index + * that is atomically incremented at each allocation. + */ +static cpu_stack_t thread_stack[MAX_THREAD_CNT] + [DEFAULT_THREAD_STACKSIZE / sizeof(cpu_stack_t)] + ALIGNED(sizeof(cpu_stack_t)); +static int last_stack; +#endif + sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), void *arg, int stacksize, int prio) { ThreadNode *thread_node; + cpu_stack_t *stackbase; proc_forbid(); thread_node = (ThreadNode *)list_remHead(&free_thread); @@ -354,8 +367,14 @@ sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), thread_node->entry = thread; thread_node->arg = arg; + #if !CONFIG_KERN_HEAP + ASSERT(stacksize <= DEFAULT_THREAD_STACKSIZE); + PROC_ATOMIC(stackbase = &thread_stack[last_stack++]); + #else + stackbase = NULL; + #endif thread_node->pid = proc_new_with_name(name, thread_trampoline, - (void *)thread_node, stacksize, NULL); + (void *)thread_node, stacksize, stackbase); if (thread_node->pid == NULL) return NULL;