Skip to content

Commit a878b60

Browse files
committed
Add background thread to emulate attach callback for C027
1 parent 467a31f commit a878b60

File tree

1 file changed

+60
-2
lines changed

1 file changed

+60
-2
lines changed

net/C027Interface/C027Interface.cpp

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "C027Interface.h"
1818
#include "mbed.h"
19+
#include "rtos.h"
1920

2021

2122
// C027Interface implementation
@@ -85,8 +86,32 @@ struct c027_socket {
8586
MDMParser::IpProtocol proto;
8687
MDMParser::IP ip;
8788
int port;
89+
90+
MDMSerial *mdm;
91+
Thread thread;
92+
Mutex mutex;
93+
volatile bool running;
94+
void (*callback)(void *);
95+
void *data;
8896
};
8997

98+
static void socket_poll(struct c027_socket *socket) {
99+
bool was_readable = false;
100+
101+
while (socket->running) {
102+
socket->mutex.lock();
103+
bool is_readable = !!socket->mdm->socketReadable(socket->socket);
104+
105+
if (is_readable != was_readable) {
106+
if (socket->callback) {
107+
socket->callback(socket->data);
108+
}
109+
was_readable = is_readable;
110+
}
111+
socket->mutex.unlock();
112+
}
113+
}
114+
90115
int C027Interface::socket_open(void **handle, nsapi_protocol_t proto)
91116
{
92117
MDMParser::IpProtocol mdmproto = (proto == NSAPI_UDP) ? MDMParser::IPPROTO_UDP : MDMParser::IPPROTO_TCP;
@@ -103,13 +128,22 @@ int C027Interface::socket_open(void **handle, nsapi_protocol_t proto)
103128

104129
socket->socket = fd;
105130
socket->proto = mdmproto;
131+
socket->mdm = _mdm;
132+
133+
socket->running = true;
134+
socket->thread.start(socket, socket_poll);
135+
106136
*handle = socket;
107137
return 0;
108138
}
109139

110140
int C027Interface::socket_close(void *handle)
111141
{
112142
struct c027_socket *socket = (struct c027_socket *)handle;
143+
144+
socket->running = false;
145+
socket->thread.join();
146+
113147
_mdm->socketFree(socket->socket);
114148

115149
delete socket;
@@ -129,8 +163,12 @@ int C027Interface::socket_listen(void *handle, int backlog)
129163
int C027Interface::socket_connect(void *handle, const SocketAddress &addr)
130164
{
131165
struct c027_socket *socket = (struct c027_socket *)handle;
132-
133-
if (!_mdm->socketConnect(socket->socket, addr.get_ip_address(), addr.get_port())) {
166+
167+
socket->mutex.lock();
168+
bool success = _mdm->socketConnect(socket->socket, addr.get_ip_address(), addr.get_port());
169+
socket->mutex.unlock();
170+
171+
if (!success) {
134172
return NSAPI_ERROR_DEVICE_ERROR;
135173
}
136174

@@ -146,7 +184,10 @@ int C027Interface::socket_send(void *handle, const void *data, unsigned size)
146184
{
147185
struct c027_socket *socket = (struct c027_socket *)handle;
148186

187+
socket->mutex.lock();
149188
int sent = _mdm->socketSend(socket->socket, (const char *)data, size);
189+
socket->mutex.unlock();
190+
150191
if (sent == SOCKET_ERROR) {
151192
return NSAPI_ERROR_DEVICE_ERROR;
152193
}
@@ -157,11 +198,16 @@ int C027Interface::socket_send(void *handle, const void *data, unsigned size)
157198
int C027Interface::socket_recv(void *handle, void *data, unsigned size)
158199
{
159200
struct c027_socket *socket = (struct c027_socket *)handle;
201+
202+
socket->mutex.lock();
160203
if (!_mdm->socketReadable(socket->socket)) {
204+
socket->mutex.unlock();
161205
return NSAPI_ERROR_WOULD_BLOCK;
162206
}
163207

164208
int recv = _mdm->socketRecv(socket->socket, (char *)data, size);
209+
socket->mutex.unlock();
210+
165211
if (recv == SOCKET_ERROR) {
166212
return NSAPI_ERROR_DEVICE_ERROR;
167213
}
@@ -173,9 +219,11 @@ int C027Interface::socket_sendto(void *handle, const SocketAddress &addr, const
173219
{
174220
struct c027_socket *socket = (struct c027_socket *)handle;
175221

222+
socket->mutex.lock();
176223
int sent = _mdm->socketSendTo(socket->socket,
177224
*(MDMParser::IP *)addr.get_ip_bytes(), addr.get_port(),
178225
(const char *)data, size);
226+
socket->mutex.unlock();
179227

180228
if (sent == SOCKET_ERROR) {
181229
return NSAPI_ERROR_DEVICE_ERROR;
@@ -187,14 +235,19 @@ int C027Interface::socket_sendto(void *handle, const SocketAddress &addr, const
187235
int C027Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
188236
{
189237
struct c027_socket *socket = (struct c027_socket *)handle;
238+
239+
socket->mutex.lock();
190240
if (!_mdm->socketReadable(socket->socket)) {
241+
socket->mutex.unlock();
191242
return NSAPI_ERROR_WOULD_BLOCK;
192243
}
193244

194245
MDMParser::IP ip;
195246
int port;
196247

197248
int recv = _mdm->socketRecvFrom(socket->socket, &ip, &port, (char *)data, size);
249+
socket->mutex.unlock();
250+
198251
if (recv == SOCKET_ERROR) {
199252
return NSAPI_ERROR_DEVICE_ERROR;
200253
}
@@ -209,4 +262,9 @@ int C027Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data
209262

210263
void C027Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
211264
{
265+
struct c027_socket *socket = (struct c027_socket *)handle;
266+
socket->mutex.lock();
267+
socket->callback = callback;
268+
socket->data = data;
269+
socket->mutex.unlock();
212270
}

0 commit comments

Comments
 (0)