Commit d26c8ea2 authored by devsaurus's avatar devsaurus
Browse files

promote closing flag to serve all socket types

and set it consistently also for intended netconn close to prevent any cb activity
parent abbd384d
...@@ -46,6 +46,7 @@ typedef struct lnet_userdata { ...@@ -46,6 +46,7 @@ typedef struct lnet_userdata {
int self_ref; int self_ref;
uint16_t port; uint16_t port;
struct netconn *netconn; struct netconn *netconn;
bool closing;
union { union {
struct { struct {
int cb_accept_ref; int cb_accept_ref;
...@@ -56,7 +57,6 @@ typedef struct lnet_userdata { ...@@ -56,7 +57,6 @@ typedef struct lnet_userdata {
int cb_dns_ref; int cb_dns_ref;
int cb_receive_ref; int cb_receive_ref;
int cb_sent_ref; int cb_sent_ref;
bool closing;
// Only for TCP: // Only for TCP:
bool connecting; bool connecting;
int hold; int hold;
...@@ -130,6 +130,7 @@ lnet_userdata *net_create( lua_State *L, enum net_type type ) { ...@@ -130,6 +130,7 @@ lnet_userdata *net_create( lua_State *L, enum net_type type ) {
ud->type = type; ud->type = type;
ud->self_ref = LUA_NOREF; ud->self_ref = LUA_NOREF;
ud->netconn = NULL; ud->netconn = NULL;
ud->closing = false;
switch (type) { switch (type) {
case TYPE_TCP_CLIENT: case TYPE_TCP_CLIENT:
...@@ -140,7 +141,6 @@ lnet_userdata *net_create( lua_State *L, enum net_type type ) { ...@@ -140,7 +141,6 @@ lnet_userdata *net_create( lua_State *L, enum net_type type ) {
ud->client.num_held = 0; ud->client.num_held = 0;
ud->client.connecting = false; ud->client.connecting = false;
case TYPE_UDP_SOCKET: case TYPE_UDP_SOCKET:
ud->client.closing = false;
ud->client.wait_dns = 0; ud->client.wait_dns = 0;
ud->client.cb_dns_ref = LUA_NOREF; ud->client.cb_dns_ref = LUA_NOREF;
ud->client.cb_receive_ref = LUA_NOREF; ud->client.cb_receive_ref = LUA_NOREF;
...@@ -277,9 +277,11 @@ static void lnet_netconn_callback(struct netconn *netconn, enum netconn_evt evt, ...@@ -277,9 +277,11 @@ static void lnet_netconn_callback(struct netconn *netconn, enum netconn_evt evt,
lnet_userdata *ud = (lnet_userdata *)netconn->socket; lnet_userdata *ud = (lnet_userdata *)netconn->socket;
if (!ud || !ud->netconn) return; if (!ud || !ud->netconn) return;
// if a previous event or the user triggered to close the connection then
// skip further event processing, we might run the cbs in Lua task on outdated userdata
if (ud->closing) return;
if (ud->type == TYPE_TCP_CLIENT || ud->type == TYPE_UDP_SOCKET) { if (ud->type == TYPE_TCP_CLIENT || ud->type == TYPE_UDP_SOCKET) {
// if a previous event triggered to close the connection then skip further event processing
if (ud->client.closing) return;
switch (evt) { switch (evt) {
case NETCONN_EVT_SENDPLUS: case NETCONN_EVT_SENDPLUS:
...@@ -295,7 +297,7 @@ static void lnet_netconn_callback(struct netconn *netconn, enum netconn_evt evt, ...@@ -295,7 +297,7 @@ static void lnet_netconn_callback(struct netconn *netconn, enum netconn_evt evt,
case NETCONN_EVT_ERROR: case NETCONN_EVT_ERROR:
post_net_err(ud, netconn_err(ud->netconn)); post_net_err(ud, netconn_err(ud->netconn));
ud->client.closing = true; ud->closing = true;
break; break;
case NETCONN_EVT_RCVPLUS: case NETCONN_EVT_RCVPLUS:
...@@ -305,7 +307,7 @@ static void lnet_netconn_callback(struct netconn *netconn, enum netconn_evt evt, ...@@ -305,7 +307,7 @@ static void lnet_netconn_callback(struct netconn *netconn, enum netconn_evt evt,
} else { } else {
// signals closed connection from peer // signals closed connection from peer
post_net_err(ud, 0); post_net_err(ud, 0);
ud->client.closing = true; ud->closing = true;
} }
break; break;
...@@ -326,6 +328,7 @@ static void lnet_netconn_callback(struct netconn *netconn, enum netconn_evt evt, ...@@ -326,6 +328,7 @@ static void lnet_netconn_callback(struct netconn *netconn, enum netconn_evt evt,
case NETCONN_EVT_ERROR: case NETCONN_EVT_ERROR:
post_net_err(ud, netconn_err(ud->netconn)); post_net_err(ud, netconn_err(ud->netconn));
ud->closing = true;
break; break;
default: default:
...@@ -471,6 +474,7 @@ int net_listen( lua_State *L ) { ...@@ -471,6 +474,7 @@ int net_listen( lua_State *L ) {
default: break; default: break;
} }
if (err != ERR_OK) { if (err != ERR_OK) {
ud->closing = true;
switch (ud->type) { switch (ud->type) {
case TYPE_TCP_SERVER: case TYPE_TCP_SERVER:
NETCONN_CLOSE(ud->netconn); NETCONN_CLOSE(ud->netconn);
...@@ -533,6 +537,7 @@ int net_connect( lua_State *L ) { ...@@ -533,6 +537,7 @@ int net_connect( lua_State *L ) {
luaL_unref(L, LUA_REGISTRYINDEX, ud->self_ref); luaL_unref(L, LUA_REGISTRYINDEX, ud->self_ref);
ud->self_ref = LUA_NOREF; ud->self_ref = LUA_NOREF;
} }
ud->closing = true;
NETCONN_CLOSE(ud->netconn); NETCONN_CLOSE(ud->netconn);
ud->netconn = NULL; ud->netconn = NULL;
return lwip_lua_checkerr(L, err); return lwip_lua_checkerr(L, err);
...@@ -614,6 +619,7 @@ int net_send( lua_State *L ) { ...@@ -614,6 +619,7 @@ int net_send( lua_State *L ) {
ud->netconn->socket = (int)ud; ud->netconn->socket = (int)ud;
err_t err = netconn_bind(ud->netconn, IP_ADDR_ANY, 0); err_t err = netconn_bind(ud->netconn, IP_ADDR_ANY, 0);
if (err != ERR_OK) { if (err != ERR_OK) {
ud->closing = true;
NETCONN_CLOSE(ud->netconn); NETCONN_CLOSE(ud->netconn);
ud->netconn = NULL; ud->netconn = NULL;
return lwip_lua_checkerr(L, err); return lwip_lua_checkerr(L, err);
...@@ -782,6 +788,7 @@ int net_close( lua_State *L ) { ...@@ -782,6 +788,7 @@ int net_close( lua_State *L ) {
case TYPE_TCP_CLIENT: case TYPE_TCP_CLIENT:
case TYPE_TCP_SERVER: case TYPE_TCP_SERVER:
case TYPE_UDP_SOCKET: case TYPE_UDP_SOCKET:
ud->closing = true;
NETCONN_CLOSE(ud->netconn); NETCONN_CLOSE(ud->netconn);
ud->netconn = NULL; ud->netconn = NULL;
break; break;
...@@ -808,6 +815,7 @@ int net_delete( lua_State *L ) { ...@@ -808,6 +815,7 @@ int net_delete( lua_State *L ) {
case TYPE_TCP_CLIENT: case TYPE_TCP_CLIENT:
case TYPE_TCP_SERVER: case TYPE_TCP_SERVER:
case TYPE_UDP_SOCKET: case TYPE_UDP_SOCKET:
ud->closing = true;
NETCONN_CLOSE(ud->netconn); NETCONN_CLOSE(ud->netconn);
ud->netconn = NULL; ud->netconn = NULL;
break; break;
......
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