Skip to content

Commit 88293b5

Browse files
committed
Fix idiosyncratic non-blocking behaviour in C027
1 parent a878b60 commit 88293b5

File tree

1 file changed

+21
-6
lines changed

1 file changed

+21
-6
lines changed

net/C027Interface/C027Interface.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,19 +96,15 @@ struct c027_socket {
9696
};
9797

9898
static void socket_poll(struct c027_socket *socket) {
99-
bool was_readable = false;
100-
10199
while (socket->running) {
102100
socket->mutex.lock();
103-
bool is_readable = !!socket->mdm->socketReadable(socket->socket);
104-
105-
if (is_readable != was_readable) {
101+
if (socket->mdm->socketReadable(socket->socket)) {
106102
if (socket->callback) {
107103
socket->callback(socket->data);
108104
}
109-
was_readable = is_readable;
110105
}
111106
socket->mutex.unlock();
107+
Thread::yield();
112108
}
113109
}
114110

@@ -166,6 +162,9 @@ int C027Interface::socket_connect(void *handle, const SocketAddress &addr)
166162

167163
socket->mutex.lock();
168164
bool success = _mdm->socketConnect(socket->socket, addr.get_ip_address(), addr.get_port());
165+
if (socket->callback) {
166+
socket->callback(socket->data);
167+
}
169168
socket->mutex.unlock();
170169

171170
if (!success) {
@@ -186,6 +185,10 @@ int C027Interface::socket_send(void *handle, const void *data, unsigned size)
186185

187186
socket->mutex.lock();
188187
int sent = _mdm->socketSend(socket->socket, (const char *)data, size);
188+
189+
if (socket->callback) {
190+
socket->callback(socket->data);
191+
}
189192
socket->mutex.unlock();
190193

191194
if (sent == SOCKET_ERROR) {
@@ -212,6 +215,10 @@ int C027Interface::socket_recv(void *handle, void *data, unsigned size)
212215
return NSAPI_ERROR_DEVICE_ERROR;
213216
}
214217

218+
if (recv == 0) {
219+
return NSAPI_ERROR_WOULD_BLOCK;
220+
}
221+
215222
return recv;
216223
}
217224

@@ -223,6 +230,10 @@ int C027Interface::socket_sendto(void *handle, const SocketAddress &addr, const
223230
int sent = _mdm->socketSendTo(socket->socket,
224231
*(MDMParser::IP *)addr.get_ip_bytes(), addr.get_port(),
225232
(const char *)data, size);
233+
234+
if (socket->callback) {
235+
socket->callback(socket->data);
236+
}
226237
socket->mutex.unlock();
227238

228239
if (sent == SOCKET_ERROR) {
@@ -252,6 +263,10 @@ int C027Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data
252263
return NSAPI_ERROR_DEVICE_ERROR;
253264
}
254265

266+
if (recv == 0) {
267+
return NSAPI_ERROR_WOULD_BLOCK;
268+
}
269+
255270
if (addr) {
256271
addr->set_ip_bytes(&ip, NSAPI_IPv4);
257272
addr->set_port(port);

0 commit comments

Comments
 (0)