projects
/
bertos.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fixes to lwIP implementation from external projects.
[bertos.git]
/
bertos
/
net
/
lwip
/
src
/
arch
/
sys_arch.c
diff --git
a/bertos/net/lwip/src/arch/sys_arch.c
b/bertos/net/lwip/src/arch/sys_arch.c
index d626f0cfd09933c66d6d9c9e3462808fa95dfd5d..b883529c1ddf48d0f58bbc956ccb46da60889253 100644
(file)
--- 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"
#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>
#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);
}
mutex_obtain(sem);
return ticks_to_ms(timer_clock() - start);
}
+
do
{
cpu_relax();
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());
return SYS_MBOX_NULL;
}
msg_initPort(&port->port, event_createGeneric());
+ port->port.event.Ev.Sig.sig_proc = NULL;
return (sys_mbox_t)(&port->port);
}
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)
{
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))
PROC_ATOMIC(msg = (IpMsg *)list_remHead(&free_msg));
if (UNLIKELY(!msg))
+ {
+ LOG_ERR("out of messages!\n");
return ERR_MEM;
return ERR_MEM;
+ }
msg->data = data;
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;
}
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;
msg = msg_get(mbox);
if (LIKELY(msg))
break;
+
+ mbox->event.Ev.Sig.sig_proc = proc_current();
/* Slow path */
if (!timeout)
event_wait(&mbox->event);
/* Slow path */
if (!timeout)
event_wait(&mbox->event);
- else if (!event_waitTimeout(&mbox->event,
+ else
+ {
+ if (!event_waitTimeout(&mbox->event,
ms_to_ticks(timeout)))
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;
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)
{
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;
}
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();
if (UNLIKELY(!thread_node))
{
proc_permit();
+ LOG_ERR("Out of threads!\n");
return NULL;
}
ADDHEAD(&used_thread, &thread_node->node);
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);
#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
#else
stackbase = NULL;
#endif