Commit 81879be4 authored by Deomid Ryabkov's avatar Deomid Ryabkov Committed by Cesanta Bot

RTOS stability improvements

PUBLISHED_FROM=2992473e6c05c1dc95878cc549eccba7abcedccf
parent 0a094d4c
...@@ -2013,6 +2013,7 @@ MG_INTERNAL void mg_remove_conn(struct mg_connection *conn) { ...@@ -2013,6 +2013,7 @@ MG_INTERNAL void mg_remove_conn(struct mg_connection *conn) {
if (conn->prev == NULL) conn->mgr->active_connections = conn->next; if (conn->prev == NULL) conn->mgr->active_connections = conn->next;
if (conn->prev) conn->prev->next = conn->next; if (conn->prev) conn->prev->next = conn->next;
if (conn->next) conn->next->prev = conn->prev; if (conn->next) conn->next->prev = conn->prev;
conn->prev = conn->next = NULL;
conn->iface->vtable->remove_conn(conn); conn->iface->vtable->remove_conn(conn);
} }
...@@ -10725,7 +10726,7 @@ static void mg_resolve_async_eh(struct mg_connection *nc, int ev, void *data) { ...@@ -10725,7 +10726,7 @@ static void mg_resolve_async_eh(struct mg_connection *nc, int ev, void *data) {
struct mg_dns_message *msg; struct mg_dns_message *msg;
int first = 0; int first = 0;
DBG(("ev=%d user_data=%p", ev, nc->user_data)); if (ev != MG_EV_POLL) DBG(("ev=%d user_data=%p", ev, nc->user_data));
req = (struct mg_resolve_async_request *) nc->user_data; req = (struct mg_resolve_async_request *) nc->user_data;
...@@ -13778,6 +13779,14 @@ void mg_lwip_if_add_conn(struct mg_connection *nc); ...@@ -13778,6 +13779,14 @@ void mg_lwip_if_add_conn(struct mg_connection *nc);
void mg_lwip_if_remove_conn(struct mg_connection *nc); void mg_lwip_if_remove_conn(struct mg_connection *nc);
time_t mg_lwip_if_poll(struct mg_iface *iface, int timeout_ms); time_t mg_lwip_if_poll(struct mg_iface *iface, int timeout_ms);
#ifdef RTOS_SDK
extern void mgos_lock();
extern void mgos_unlock();
#else
#define mgos_lock()
#define mgos_unlock()
#endif
static void mg_lwip_recv_common(struct mg_connection *nc, struct pbuf *p); static void mg_lwip_recv_common(struct mg_connection *nc, struct pbuf *p);
#if LWIP_TCP_KEEPALIVE #if LWIP_TCP_KEEPALIVE
...@@ -13887,16 +13896,20 @@ static void mg_lwip_handle_recv_tcp(struct mg_connection *nc) { ...@@ -13887,16 +13896,20 @@ static void mg_lwip_handle_recv_tcp(struct mg_connection *nc) {
} }
#endif #endif
mgos_lock();
while (cs->rx_chain != NULL) { while (cs->rx_chain != NULL) {
struct pbuf *seg = cs->rx_chain; struct pbuf *seg = cs->rx_chain;
size_t len = (seg->len - cs->rx_offset); size_t len = (seg->len - cs->rx_offset);
char *data = (char *) malloc(len); char *data = (char *) malloc(len);
if (data == NULL) { if (data == NULL) {
mgos_unlock();
DBG(("OOM")); DBG(("OOM"));
return; return;
} }
pbuf_copy_partial(seg, data, len, cs->rx_offset); pbuf_copy_partial(seg, data, len, cs->rx_offset);
mgos_unlock();
mg_if_recv_tcp_cb(nc, data, len, 1 /* own */); mg_if_recv_tcp_cb(nc, data, len, 1 /* own */);
mgos_lock();
cs->rx_offset += len; cs->rx_offset += len;
if (cs->rx_offset == cs->rx_chain->len) { if (cs->rx_offset == cs->rx_chain->len) {
cs->rx_chain = pbuf_dechain(cs->rx_chain); cs->rx_chain = pbuf_dechain(cs->rx_chain);
...@@ -13904,6 +13917,7 @@ static void mg_lwip_handle_recv_tcp(struct mg_connection *nc) { ...@@ -13904,6 +13917,7 @@ static void mg_lwip_handle_recv_tcp(struct mg_connection *nc) {
cs->rx_offset = 0; cs->rx_offset = 0;
} }
} }
mgos_unlock();
if (nc->send_mbuf.len > 0) { if (nc->send_mbuf.len > 0) {
mg_lwip_mgr_schedule_poll(nc->mgr); mg_lwip_mgr_schedule_poll(nc->mgr);
...@@ -13984,6 +13998,7 @@ static void mg_lwip_udp_recv_cb(void *arg, struct udp_pcb *pcb, struct pbuf *p, ...@@ -13984,6 +13998,7 @@ static void mg_lwip_udp_recv_cb(void *arg, struct udp_pcb *pcb, struct pbuf *p,
static void mg_lwip_recv_common(struct mg_connection *nc, struct pbuf *p) { static void mg_lwip_recv_common(struct mg_connection *nc, struct pbuf *p) {
struct mg_lwip_conn_state *cs = (struct mg_lwip_conn_state *) nc->sock; struct mg_lwip_conn_state *cs = (struct mg_lwip_conn_state *) nc->sock;
mgos_lock();
if (cs->rx_chain == NULL) { if (cs->rx_chain == NULL) {
cs->rx_chain = p; cs->rx_chain = p;
} else { } else {
...@@ -13993,6 +14008,7 @@ static void mg_lwip_recv_common(struct mg_connection *nc, struct pbuf *p) { ...@@ -13993,6 +14008,7 @@ static void mg_lwip_recv_common(struct mg_connection *nc, struct pbuf *p) {
cs->recv_pending = 1; cs->recv_pending = 1;
mg_lwip_post_signal(MG_SIG_RECV, nc); mg_lwip_post_signal(MG_SIG_RECV, nc);
} }
mgos_unlock();
} }
static void mg_lwip_handle_recv_udp(struct mg_connection *nc) { static void mg_lwip_handle_recv_udp(struct mg_connection *nc) {
...@@ -14335,7 +14351,7 @@ struct mg_iface_vtable mg_default_iface_vtable = MG_LWIP_IFACE_VTABLE; ...@@ -14335,7 +14351,7 @@ struct mg_iface_vtable mg_default_iface_vtable = MG_LWIP_IFACE_VTABLE;
#if MG_NET_IF == MG_NET_IF_LWIP_LOW_LEVEL #if MG_NET_IF == MG_NET_IF_LWIP_LOW_LEVEL
#ifndef MG_SIG_QUEUE_LEN #ifndef MG_SIG_QUEUE_LEN
#define MG_SIG_QUEUE_LEN 16 #define MG_SIG_QUEUE_LEN 32
#endif #endif
struct mg_ev_mgr_lwip_signal { struct mg_ev_mgr_lwip_signal {
...@@ -14352,21 +14368,32 @@ struct mg_ev_mgr_lwip_data { ...@@ -14352,21 +14368,32 @@ struct mg_ev_mgr_lwip_data {
void mg_lwip_post_signal(enum mg_sig_type sig, struct mg_connection *nc) { void mg_lwip_post_signal(enum mg_sig_type sig, struct mg_connection *nc) {
struct mg_ev_mgr_lwip_data *md = struct mg_ev_mgr_lwip_data *md =
(struct mg_ev_mgr_lwip_data *) nc->iface->data; (struct mg_ev_mgr_lwip_data *) nc->iface->data;
if (md->sig_queue_len >= MG_SIG_QUEUE_LEN) return; mgos_lock();
if (md->sig_queue_len >= MG_SIG_QUEUE_LEN) {
mgos_unlock();
return;
}
int end_index = (md->start_index + md->sig_queue_len) % MG_SIG_QUEUE_LEN; int end_index = (md->start_index + md->sig_queue_len) % MG_SIG_QUEUE_LEN;
md->sig_queue[end_index].sig = sig; md->sig_queue[end_index].sig = sig;
md->sig_queue[end_index].nc = nc; md->sig_queue[end_index].nc = nc;
md->sig_queue_len++; md->sig_queue_len++;
mg_lwip_mgr_schedule_poll(nc->mgr); mg_lwip_mgr_schedule_poll(nc->mgr);
mgos_unlock();
} }
void mg_ev_mgr_lwip_process_signals(struct mg_mgr *mgr) { void mg_ev_mgr_lwip_process_signals(struct mg_mgr *mgr) {
struct mg_ev_mgr_lwip_data *md = struct mg_ev_mgr_lwip_data *md =
(struct mg_ev_mgr_lwip_data *) mgr->ifaces[MG_MAIN_IFACE]->data; (struct mg_ev_mgr_lwip_data *) mgr->ifaces[MG_MAIN_IFACE]->data;
while (md->sig_queue_len > 0) { while (md->sig_queue_len > 0) {
mgos_lock();
int sig = md->sig_queue[md->start_index].sig;
struct mg_connection *nc = md->sig_queue[md->start_index].nc; struct mg_connection *nc = md->sig_queue[md->start_index].nc;
struct mg_lwip_conn_state *cs = (struct mg_lwip_conn_state *) nc->sock; struct mg_lwip_conn_state *cs = (struct mg_lwip_conn_state *) nc->sock;
switch (md->sig_queue[md->start_index].sig) { md->start_index = (md->start_index + 1) % MG_SIG_QUEUE_LEN;
md->sig_queue_len--;
mgos_unlock();
if (nc->iface == NULL || nc->mgr == NULL) continue;
switch (sig) {
case MG_SIG_CONNECT_RESULT: { case MG_SIG_CONNECT_RESULT: {
#if MG_ENABLE_SSL #if MG_ENABLE_SSL
if (cs->err == 0 && (nc->flags & MG_F_SSL) && if (cs->err == 0 && (nc->flags & MG_F_SSL) &&
...@@ -14412,8 +14439,6 @@ void mg_ev_mgr_lwip_process_signals(struct mg_mgr *mgr) { ...@@ -14412,8 +14439,6 @@ void mg_ev_mgr_lwip_process_signals(struct mg_mgr *mgr) {
break; break;
} }
} }
md->start_index = (md->start_index + 1) % MG_SIG_QUEUE_LEN;
md->sig_queue_len--;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment