diff --git a/UNITTESTS/features/netsocket/DTLSSocketWrapper/unittest.cmake b/UNITTESTS/features/netsocket/DTLSSocketWrapper/unittest.cmake index e9c482d18a..e0bea911ab 100644 --- a/UNITTESTS/features/netsocket/DTLSSocketWrapper/unittest.cmake +++ b/UNITTESTS/features/netsocket/DTLSSocketWrapper/unittest.cmake @@ -21,6 +21,7 @@ set(unittest-test-sources features/netsocket/DTLSSocketWrapper/test_DTLSSocketWrapper.cpp stubs/Mutex_stub.cpp stubs/mbed_assert_stub.c + stubs/mbed_critical_stub.c stubs/equeue_stub.c ../features/nanostack/coap-service/test/coap-service/unittest/stub/mbedtls_stub.c stubs/EventQueue_stub.cpp diff --git a/UNITTESTS/features/netsocket/InternetSocket/test_InternetSocket.cpp b/UNITTESTS/features/netsocket/InternetSocket/test_InternetSocket.cpp index a360333120..8a757ce925 100644 --- a/UNITTESTS/features/netsocket/InternetSocket/test_InternetSocket.cpp +++ b/UNITTESTS/features/netsocket/InternetSocket/test_InternetSocket.cpp @@ -79,14 +79,6 @@ public: { _writers--; } - void add_pending(void) - { - _pending++; - } - void rem_pending(void) - { - _pending--; - } protected: virtual nsapi_protocol_t get_proto() diff --git a/UNITTESTS/features/netsocket/InternetSocket/unittest.cmake b/UNITTESTS/features/netsocket/InternetSocket/unittest.cmake index ef550912b5..5065ac4765 100644 --- a/UNITTESTS/features/netsocket/InternetSocket/unittest.cmake +++ b/UNITTESTS/features/netsocket/InternetSocket/unittest.cmake @@ -18,6 +18,7 @@ set(unittest-test-sources features/netsocket/InternetSocket/test_InternetSocket.cpp stubs/Mutex_stub.cpp stubs/mbed_assert_stub.c + stubs/mbed_critical_stub.c stubs/equeue_stub.c stubs/EventQueue_stub.cpp stubs/mbed_shared_queues_stub.cpp diff --git a/UNITTESTS/features/netsocket/TCPServer/unittest.cmake b/UNITTESTS/features/netsocket/TCPServer/unittest.cmake index 288ec07e93..745da0a19b 100644 --- a/UNITTESTS/features/netsocket/TCPServer/unittest.cmake +++ b/UNITTESTS/features/netsocket/TCPServer/unittest.cmake @@ -22,6 +22,7 @@ set(unittest-sources set(unittest-test-sources stubs/Mutex_stub.cpp stubs/mbed_assert_stub.c + stubs/mbed_critical_stub.c stubs/equeue_stub.c stubs/EventQueue_stub.cpp stubs/mbed_shared_queues_stub.cpp diff --git a/UNITTESTS/features/netsocket/TCPSocket/unittest.cmake b/UNITTESTS/features/netsocket/TCPSocket/unittest.cmake index abad503b68..b938cb1a0d 100644 --- a/UNITTESTS/features/netsocket/TCPSocket/unittest.cmake +++ b/UNITTESTS/features/netsocket/TCPSocket/unittest.cmake @@ -19,6 +19,7 @@ set(unittest-test-sources features/netsocket/TCPSocket/test_TCPSocket.cpp stubs/Mutex_stub.cpp stubs/mbed_assert_stub.c + stubs/mbed_critical_stub.c stubs/equeue_stub.c stubs/EventQueue_stub.cpp stubs/mbed_shared_queues_stub.cpp diff --git a/UNITTESTS/features/netsocket/TLSSocketWrapper/unittest.cmake b/UNITTESTS/features/netsocket/TLSSocketWrapper/unittest.cmake index ff4b44ad7b..2a86d3f6a7 100644 --- a/UNITTESTS/features/netsocket/TLSSocketWrapper/unittest.cmake +++ b/UNITTESTS/features/netsocket/TLSSocketWrapper/unittest.cmake @@ -20,6 +20,7 @@ set(unittest-test-sources features/netsocket/TLSSocketWrapper/test_TLSSocketWrapper.cpp stubs/Mutex_stub.cpp stubs/mbed_assert_stub.c + stubs/mbed_critical_stub.c stubs/equeue_stub.c ../features/nanostack/coap-service/test/coap-service/unittest/stub/mbedtls_stub.c stubs/EventQueue_stub.cpp diff --git a/UNITTESTS/features/netsocket/UDPSocket/unittest.cmake b/UNITTESTS/features/netsocket/UDPSocket/unittest.cmake index b4080496bd..376a79db5e 100644 --- a/UNITTESTS/features/netsocket/UDPSocket/unittest.cmake +++ b/UNITTESTS/features/netsocket/UDPSocket/unittest.cmake @@ -19,6 +19,7 @@ set(unittest-test-sources features/netsocket/UDPSocket/test_UDPSocket.cpp stubs/Mutex_stub.cpp stubs/mbed_assert_stub.c + stubs/mbed_critical_stub.c stubs/equeue_stub.c stubs/EventQueue_stub.cpp stubs/mbed_shared_queues_stub.cpp diff --git a/features/netsocket/InternetSocket.cpp b/features/netsocket/InternetSocket.cpp index 8db00eed8c..61903c7ec2 100644 --- a/features/netsocket/InternetSocket.cpp +++ b/features/netsocket/InternetSocket.cpp @@ -21,9 +21,10 @@ using namespace mbed; InternetSocket::InternetSocket() : _stack(0), _socket(0), _timeout(osWaitForever), - _readers(0), _writers(0), _pending(0), + _readers(0), _writers(0), _factory_allocated(false) { + core_util_atomic_flag_clear(&_pending); _socket_stats.stats_new_socket_entry(this); } @@ -199,8 +200,7 @@ void InternetSocket::event() { _event_flag.set(READ_FLAG | WRITE_FLAG); - _pending += 1; - if (_callback && _pending == 1) { + if (_callback && !core_util_atomic_flag_test_and_set(&_pending)) { _callback(); } } diff --git a/features/netsocket/InternetSocket.h b/features/netsocket/InternetSocket.h index e17b82d5c0..c1ef86b369 100644 --- a/features/netsocket/InternetSocket.h +++ b/features/netsocket/InternetSocket.h @@ -25,6 +25,7 @@ #include "rtos/Mutex.h" #include "rtos/EventFlags.h" #include "Callback.h" +#include "mbed_critical.h" #include "mbed_toolchain.h" #include "SocketStats.h" @@ -168,7 +169,7 @@ protected: SocketAddress _remote_peer; uint8_t _readers; uint8_t _writers; - volatile unsigned _pending; + core_util_atomic_flag _pending; bool _factory_allocated; // Event flags diff --git a/features/netsocket/TCPServer.cpp b/features/netsocket/TCPServer.cpp index 1d8419f77c..f3cd99f90e 100644 --- a/features/netsocket/TCPServer.cpp +++ b/features/netsocket/TCPServer.cpp @@ -38,7 +38,7 @@ nsapi_error_t TCPServer::accept(TCPSocket *connection, SocketAddress *address) break; } - _pending = 0; + core_util_atomic_flag_clear(&_pending); void *socket; ret = _stack->socket_accept(_socket, &socket, address); diff --git a/features/netsocket/TCPSocket.cpp b/features/netsocket/TCPSocket.cpp index b2c9f5a0e0..7b7e9a54e9 100644 --- a/features/netsocket/TCPSocket.cpp +++ b/features/netsocket/TCPSocket.cpp @@ -62,7 +62,7 @@ nsapi_error_t TCPSocket::connect(const SocketAddress &address) break; } - _pending = 0; + core_util_atomic_flag_clear(&_pending); ret = _stack->socket_connect(_socket, address); if ((_timeout == 0) || !(ret == NSAPI_ERROR_IN_PROGRESS || ret == NSAPI_ERROR_ALREADY)) { _socket_stats.stats_update_socket_state(this, SOCK_CONNECTED); @@ -143,7 +143,7 @@ nsapi_size_or_error_t TCPSocket::send(const void *data, nsapi_size_t size) break; } - _pending = 0; + core_util_atomic_flag_clear(&_pending); ret = _stack->socket_send(_socket, data_ptr + written, size - written); if (ret >= 0) { written += ret; @@ -210,7 +210,7 @@ nsapi_size_or_error_t TCPSocket::recv(void *data, nsapi_size_t size) break; } - _pending = 0; + core_util_atomic_flag_clear(&_pending); ret = _stack->socket_recv(_socket, data, size); if ((_timeout == 0) || (ret != NSAPI_ERROR_WOULD_BLOCK)) { _socket_stats.stats_update_recv_bytes(this, ret); @@ -281,7 +281,7 @@ TCPSocket *TCPSocket::accept(nsapi_error_t *error) break; } - _pending = 0; + core_util_atomic_flag_clear(&_pending); void *socket; SocketAddress address; ret = _stack->socket_accept(_socket, &socket, &address); diff --git a/features/netsocket/UDPSocket.cpp b/features/netsocket/UDPSocket.cpp index 415ff315b3..a200183ba6 100644 --- a/features/netsocket/UDPSocket.cpp +++ b/features/netsocket/UDPSocket.cpp @@ -70,7 +70,7 @@ nsapi_size_or_error_t UDPSocket::sendto(const SocketAddress &address, const void break; } - _pending = 0; + core_util_atomic_flag_clear(&_pending); nsapi_size_or_error_t sent = _stack->socket_sendto(_socket, address, data, size); if ((0 == _timeout) || (NSAPI_ERROR_WOULD_BLOCK != sent)) { _socket_stats.stats_update_sent_bytes(this, sent); @@ -130,7 +130,7 @@ nsapi_size_or_error_t UDPSocket::recvfrom(SocketAddress *address, void *buffer, break; } - _pending = 0; + core_util_atomic_flag_clear(&_pending); nsapi_size_or_error_t recv = _stack->socket_recvfrom(_socket, address, buffer, size); // Filter incomming packets using connected peer address