Skip to content

Commit

Permalink
Fail WiFiClient::write if send buffer is full and a recv is blocking …
Browse files Browse the repository at this point in the history
…m2m_wifi_handle_events
  • Loading branch information
sandeepmistry committed Sep 12, 2016
1 parent 2685f97 commit f205d69
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 5 deletions.
5 changes: 2 additions & 3 deletions src/WiFiClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,14 +129,13 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size)

while ((err = send(_socket, (void *)buf, size, 0)) < 0) {
// Exit on fatal error, retry if buffer not ready.
if (err != SOCK_ERR_BUFFER_FULL) {
// or can't wait for send event because a recv is pending
if (err != SOCK_ERR_BUFFER_FULL || socketBufferSendWait(_socket) == 0) {
setWriteError();
m2m_periph_gpio_set_val(M2M_PERIPH_GPIO16, 1);
m2m_periph_gpio_set_val(M2M_PERIPH_GPIO5, 1);
return 0;
}

socketBufferSendWait(_socket);
}

// Network led OFF (rev A then rev B).
Expand Down
2 changes: 1 addition & 1 deletion src/socket/include/socket_buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ sint16 socketBufferDataAvailable(SOCKET sock);
void socketBufferSetupBuffer(SOCKET sock);
sint8 socketBufferBindWait(SOCKET sock);
sint8 socketBufferConnectWait(SOCKET sock);
void socketBufferSendWait(SOCKET sock);
sint8 socketBufferSendWait(SOCKET sock);
void socketBufferReadUdpHeader(SOCKET sock, uint16_t* rcvSize, uint16_t* rcvPort, uint32_t* rcvIP);
uint8 socketBufferPeek(SOCKET sock);
sint16 socketBufferRead(SOCKET sock, uint8 *buf, uint16 len);
Expand Down
14 changes: 13 additions & 1 deletion src/socket/source/socket_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,13 +140,25 @@ sint8 socketBufferConnectWait(SOCKET sock)
return (gastrSocketBuffer[sock].flag & SOCKET_BUFFER_FLAG_CONNECTED) != 0;
}

void socketBufferSendWait(SOCKET sock)
sint8 socketBufferSendWait(SOCKET sock)
{
SOCKET s;

// check if any sockets are full, if so fail because m2m_wifi_handle_events
// won't be able to run
for (s = 0; s < MAX_SOCKET; s++) {
if (socketBufferIsFull(s)) {
return 0;
}
}

gastrSocketBuffer[sock].flag = SOCKET_BUFFER_FLAG_SENDING;

while (gastrSocketBuffer[sock].flag & SOCKET_BUFFER_FLAG_SENDING) {
m2m_wifi_handle_events(NULL);
}

return 1;
}

void socketBufferReadUdpHeader(SOCKET sock, uint16_t* rcvSize, uint16_t* rcvPort, uint32_t* rcvIP)
Expand Down

0 comments on commit f205d69

Please sign in to comment.