Fixes to lwIP implementation from external projects.
[bertos.git] / bertos / net / lwip / src / arch / sys_arch.c
index 4ef9d08ce195f787cd98b9fa929636558790fe21..b883529c1ddf48d0f58bbc956ccb46da60889253 100644 (file)
@@ -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 <cfg/log.h>
 
 #include <drv/timer.h>
@@ -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;
 
@@ -359,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);
@@ -369,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