26
26
#include " features/netsocket/nsapi_types.h"
27
27
#include " mbed_trace.h"
28
28
#include " platform/Callback.h"
29
+ #include " platform/mbed_critical.h"
29
30
#include " platform/mbed_debug.h"
30
31
#include " platform/mbed_wait_api.h"
31
32
@@ -496,7 +497,7 @@ int ESP8266Interface::socket_close(void *handle)
496
497
497
498
_cbs[socket->id ].callback = NULL ;
498
499
_cbs[socket->id ].data = NULL ;
499
- _cbs[socket->id ].deferred = false ;
500
+ core_util_atomic_store_u8 (& _cbs[socket->id ].deferred , false ) ;
500
501
501
502
socket->connected = false ;
502
503
_sock_i[socket->id ].open = false ;
@@ -566,6 +567,7 @@ int ESP8266Interface::socket_send(void *handle, const void *data, unsigned size)
566
567
{
567
568
nsapi_error_t status;
568
569
struct esp8266_socket *socket = (struct esp8266_socket *)handle;
570
+ uint8_t expect_false = false ;
569
571
570
572
if (!socket) {
571
573
return NSAPI_ERROR_NO_SOCKET;
@@ -578,9 +580,10 @@ int ESP8266Interface::socket_send(void *handle, const void *data, unsigned size)
578
580
579
581
status = _esp.send (socket->id , data, size);
580
582
581
- if (status == NSAPI_ERROR_WOULD_BLOCK && !_cbs[socket->id ].deferred && socket->proto == NSAPI_TCP) {
583
+ if (status == NSAPI_ERROR_WOULD_BLOCK
584
+ && socket->proto == NSAPI_TCP
585
+ && core_util_atomic_cas_u8 (&_cbs[socket->id ].deferred , &expect_false, true )) {
582
586
tr_debug (" Postponing SIGIO from the device" );
583
- _cbs[socket->id ].deferred = true ;
584
587
_global_event_queue->call_in (50 , callback (this , &ESP8266Interface::event_deferred));
585
588
} else if (status == NSAPI_ERROR_WOULD_BLOCK && socket->proto == NSAPI_UDP) {
586
589
status = NSAPI_ERROR_DEVICE_ERROR;
@@ -734,8 +737,8 @@ void ESP8266Interface::event()
734
737
void ESP8266Interface::event_deferred ()
735
738
{
736
739
for (int i = 0 ; i < ESP8266_SOCKET_COUNT; i++) {
737
- if (_cbs[i]. deferred && _cbs[i]. callback ) {
738
- _cbs[i].deferred = false ;
740
+ uint8_t expect_true = true ;
741
+ if ( core_util_atomic_cas_u8 (& _cbs[i].deferred , &expect_true, false ) && _cbs[i]. callback ) {
739
742
_cbs[i].callback (_cbs[i].data );
740
743
}
741
744
}
0 commit comments