mirror of https://github.com/ARMmbed/mbed-os.git
InternetSocket: Use atomics, not volatile
Use a better tool for the job.pull/9248/head
parent
cee814dc29
commit
0f6a4cd0bd
|
@ -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
|
||||
|
|
|
@ -79,14 +79,6 @@ public:
|
|||
{
|
||||
_writers--;
|
||||
}
|
||||
void add_pending(void)
|
||||
{
|
||||
_pending++;
|
||||
}
|
||||
void rem_pending(void)
|
||||
{
|
||||
_pending--;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual nsapi_protocol_t get_proto()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue