mirror of
https://github.com/me-no-dev/AsyncTCP.git
synced 2025-08-05 05:34:38 +02:00
Merge pull request #28 from mathieucarbou/issue-27
Fix #27: Required to lock TCPIP core functionality
This commit is contained in:
@@ -39,6 +39,24 @@ extern "C"{
|
|||||||
#include <NetworkInterface.h>
|
#include <NetworkInterface.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define TAG "AsyncTCP"
|
||||||
|
|
||||||
|
// https://github.com/espressif/arduino-esp32/issues/10526
|
||||||
|
#ifdef CONFIG_LWIP_TCPIP_CORE_LOCKING
|
||||||
|
#define TCP_MUTEX_LOCK() \
|
||||||
|
if (!sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER)) { \
|
||||||
|
LOCK_TCPIP_CORE(); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TCP_MUTEX_UNLOCK() \
|
||||||
|
if (sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER)) { \
|
||||||
|
UNLOCK_TCPIP_CORE(); \
|
||||||
|
}
|
||||||
|
#else // CONFIG_LWIP_TCPIP_CORE_LOCKING
|
||||||
|
#define TCP_MUTEX_LOCK()
|
||||||
|
#define TCP_MUTEX_UNLOCK()
|
||||||
|
#endif // CONFIG_LWIP_TCPIP_CORE_LOCKING
|
||||||
|
|
||||||
#define INVALID_CLOSED_SLOT -1
|
#define INVALID_CLOSED_SLOT -1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -722,17 +740,20 @@ bool AsyncClient::_connect(ip_addr_t addr, uint16_t port){
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TCP_MUTEX_LOCK();
|
||||||
tcp_pcb* pcb = tcp_new_ip_type(addr.type);
|
tcp_pcb* pcb = tcp_new_ip_type(addr.type);
|
||||||
if (!pcb){
|
if (!pcb){
|
||||||
|
TCP_MUTEX_UNLOCK();
|
||||||
log_e("pcb == NULL");
|
log_e("pcb == NULL");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
tcp_arg(pcb, this);
|
tcp_arg(pcb, this);
|
||||||
tcp_err(pcb, &_tcp_error);
|
tcp_err(pcb, &_tcp_error);
|
||||||
tcp_recv(pcb, &_tcp_recv);
|
tcp_recv(pcb, &_tcp_recv);
|
||||||
tcp_sent(pcb, &_tcp_sent);
|
tcp_sent(pcb, &_tcp_sent);
|
||||||
tcp_poll(pcb, &_tcp_poll, 1);
|
tcp_poll(pcb, &_tcp_poll, 1);
|
||||||
|
TCP_MUTEX_UNLOCK();
|
||||||
|
|
||||||
esp_err_t err =_tcp_connect(pcb, _closed_slot, &addr, port,(tcp_connected_fn)&_tcp_connected);
|
esp_err_t err =_tcp_connect(pcb, _closed_slot, &addr, port,(tcp_connected_fn)&_tcp_connected);
|
||||||
return err == ESP_OK;
|
return err == ESP_OK;
|
||||||
}
|
}
|
||||||
@@ -863,11 +884,13 @@ int8_t AsyncClient::_close(){
|
|||||||
//ets_printf("X: 0x%08x\n", (uint32_t)this);
|
//ets_printf("X: 0x%08x\n", (uint32_t)this);
|
||||||
int8_t err = ERR_OK;
|
int8_t err = ERR_OK;
|
||||||
if(_pcb) {
|
if(_pcb) {
|
||||||
|
TCP_MUTEX_LOCK();
|
||||||
tcp_arg(_pcb, NULL);
|
tcp_arg(_pcb, NULL);
|
||||||
tcp_sent(_pcb, NULL);
|
tcp_sent(_pcb, NULL);
|
||||||
tcp_recv(_pcb, NULL);
|
tcp_recv(_pcb, NULL);
|
||||||
tcp_err(_pcb, NULL);
|
tcp_err(_pcb, NULL);
|
||||||
tcp_poll(_pcb, NULL, 0);
|
tcp_poll(_pcb, NULL, 0);
|
||||||
|
TCP_MUTEX_UNLOCK();
|
||||||
_tcp_clear_events(this);
|
_tcp_clear_events(this);
|
||||||
err = _tcp_close(_pcb, _closed_slot);
|
err = _tcp_close(_pcb, _closed_slot);
|
||||||
if(err != ERR_OK) {
|
if(err != ERR_OK) {
|
||||||
@@ -1461,7 +1484,9 @@ void AsyncServer::begin(){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int8_t err;
|
int8_t err;
|
||||||
|
TCP_MUTEX_LOCK();
|
||||||
_pcb = tcp_new_ip_type(_bind4 && _bind6 ? IPADDR_TYPE_ANY : (_bind6 ? IPADDR_TYPE_V6 : IPADDR_TYPE_V4));
|
_pcb = tcp_new_ip_type(_bind4 && _bind6 ? IPADDR_TYPE_ANY : (_bind6 ? IPADDR_TYPE_V6 : IPADDR_TYPE_V4));
|
||||||
|
TCP_MUTEX_UNLOCK();
|
||||||
if (!_pcb){
|
if (!_pcb){
|
||||||
log_e("_pcb == NULL");
|
log_e("_pcb == NULL");
|
||||||
return;
|
return;
|
||||||
@@ -1493,14 +1518,18 @@ void AsyncServer::begin(){
|
|||||||
log_e("listen_pcb == NULL");
|
log_e("listen_pcb == NULL");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
TCP_MUTEX_LOCK();
|
||||||
tcp_arg(_pcb, (void*) this);
|
tcp_arg(_pcb, (void*) this);
|
||||||
tcp_accept(_pcb, &_s_accept);
|
tcp_accept(_pcb, &_s_accept);
|
||||||
|
TCP_MUTEX_UNLOCK();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AsyncServer::end(){
|
void AsyncServer::end(){
|
||||||
if(_pcb){
|
if(_pcb){
|
||||||
|
TCP_MUTEX_LOCK();
|
||||||
tcp_arg(_pcb, NULL);
|
tcp_arg(_pcb, NULL);
|
||||||
tcp_accept(_pcb, NULL);
|
tcp_accept(_pcb, NULL);
|
||||||
|
TCP_MUTEX_UNLOCK();
|
||||||
if(tcp_close(_pcb) != ERR_OK){
|
if(tcp_close(_pcb) != ERR_OK){
|
||||||
_tcp_abort(_pcb, -1);
|
_tcp_abort(_pcb, -1);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user