X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fnet%2Flwip%2Fsrc%2Farch%2Fsys_arch.c;h=b883529c1ddf48d0f58bbc956ccb46da60889253;hb=e3e3ddfc434c148bcb55ce78dc496d267a1ab2b2;hp=d626f0cfd09933c66d6d9c9e3462808fa95dfd5d;hpb=aad0940444f8fb8d6adb237ccf18dd74f9342507;p=bertos.git diff --git a/bertos/net/lwip/src/arch/sys_arch.c b/bertos/net/lwip/src/arch/sys_arch.c index d626f0cf..b883529c 100644 --- a/bertos/net/lwip/src/arch/sys_arch.c +++ b/bertos/net/lwip/src/arch/sys_arch.c @@ -1,7 +1,7 @@ #include "cfg/cfg_lwip.h" -#define LOG_LEVEL 3 -#define LOG_FORMAT 0 +#define LOG_LEVEL 3 //INFO +#define LOG_FORMAT 0 //TERSE #include #include @@ -153,6 +153,7 @@ u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout) mutex_obtain(sem); return ticks_to_ms(timer_clock() - start); } + do { cpu_relax(); @@ -197,6 +198,7 @@ sys_mbox_t sys_mbox_new(UNUSED_ARG(int, size)) return SYS_MBOX_NULL; } msg_initPort(&port->port, event_createGeneric()); + port->port.event.Ev.Sig.sig_proc = NULL; return (sys_mbox_t)(&port->port); } @@ -209,8 +211,7 @@ void sys_mbox_free(sys_mbox_t mbox) void sys_mbox_post(sys_mbox_t mbox, void *data) { - if (UNLIKELY(sys_mbox_trypost(mbox, data) == ERR_MEM)) - LOG_ERR("out of messages!\n"); + sys_mbox_trypost(mbox, data); } /* @@ -223,9 +224,18 @@ err_t sys_mbox_trypost(sys_mbox_t mbox, void *data) PROC_ATOMIC(msg = (IpMsg *)list_remHead(&free_msg)); if (UNLIKELY(!msg)) + { + LOG_ERR("out of messages!\n"); return ERR_MEM; + } msg->data = data; - msg_put(mbox, &msg->msg); + + msg_lockPort(mbox); + ADDTAIL(&mbox->queue, &msg->msg.link); + msg_unlockPort(mbox); + + if (mbox->event.Ev.Sig.sig_proc) + event_do(&mbox->event); return ERR_OK; } @@ -257,13 +267,22 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **data, u32_t timeout) msg = msg_get(mbox); if (LIKELY(msg)) break; + + mbox->event.Ev.Sig.sig_proc = proc_current(); /* Slow path */ if (!timeout) event_wait(&mbox->event); - else if (!event_waitTimeout(&mbox->event, + else + { + if (!event_waitTimeout(&mbox->event, ms_to_ticks(timeout))) - return SYS_ARCH_TIMEOUT; + { + mbox->event.Ev.Sig.sig_proc = NULL; + return SYS_ARCH_TIMEOUT; + } + } } + mbox->event.Ev.Sig.sig_proc = NULL; if (data) *data = containerof(msg, IpMsg, msg)->data; @@ -317,6 +336,15 @@ static struct sys_timeouts lwip_system_timeouts; // Default timeouts list for lw struct sys_timeouts *sys_arch_timeouts(void) { + ThreadNode *thread_node; + struct Process *curr_pid = proc_current(); + + FOREACH_NODE(thread_node, &used_thread) + { + if (thread_node->pid == curr_pid) + return &(thread_node->timeout); + } + return &lwip_system_timeouts; } @@ -350,6 +378,7 @@ sys_thread_t sys_thread_new(const char *name, void (* thread)(void *arg), if (UNLIKELY(!thread_node)) { proc_permit(); + LOG_ERR("Out of threads!\n"); return NULL; } ADDHEAD(&used_thread, &thread_node->node); @@ -360,7 +389,7 @@ sys_thread_t sys_thread_new(const char *name, void (* thread)(void *arg), #if !CONFIG_KERN_HEAP ASSERT(stacksize <= DEFAULT_THREAD_STACKSIZE); - PROC_ATOMIC(stackbase = &thread_stack[last_stack++]); + PROC_ATOMIC(stackbase = thread_stack[last_stack++]); #else stackbase = NULL; #endif