Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of PicoTCP by
Diff: Socket/pico_bsd_layer.cpp
- Revision:
- 13:c6662adea07d
- Parent:
- 11:58acd53df75c
- Child:
- 14:fe225a6f92c0
diff -r 0c6fa180a6ec -r c6662adea07d Socket/pico_bsd_layer.cpp
--- a/Socket/pico_bsd_layer.cpp Thu Jun 06 07:09:23 2013 +0000
+++ b/Socket/pico_bsd_layer.cpp Thu Jun 06 09:14:40 2013 +0000
@@ -27,6 +27,10 @@
#define EVENT_EXPECTED(x) (x->event & x->revent)
+
+static PicoCondition globalLock;
+static Mutex globalMutex;
+
/* TODO: Sync blocking from here to blocking from Socket */
static struct socket dummy;
@@ -114,7 +118,11 @@
struct socket * _sock = findAfterSocket(sock);
if(!_sock)
+ {
+ if( (ev & PICO_SOCK_EV_ERR) || (ev & PICO_SOCK_EV_CLOSE) || (ev & PICO_SOCK_EV_FIN) )
+ pico_socket_close(sock);
return;
+ }
//printf("Received : %d\n",ev);
@@ -124,6 +132,7 @@
// if one of the events we're waiting has arrived, unblock this
//printf("Expected event, release the orcs!\n");
_sock->mutex->unlock();
+ globalLock.lock();
}
else
{
@@ -140,6 +149,7 @@
_sock->sock = NULL;
}
_sock->mutex->unlock();
+ globalLock.lock();
}
}
}
@@ -170,15 +180,20 @@
sock->socket = (int)sock;
sock->mutex = new PicoCondition();
-
+
+
+
if(!sock->mutex)
{
pico_socket_close(sock->sock);
pico_free(sock);
return -1;
}
-
+
+ globalMutex.lock();
pico_tree_insert(&sockTree,sock);
+ globalMutex.unlock();
+
sock->state = SOCK_OPEN;
return sock->socket;
@@ -281,12 +296,18 @@
*len = sizeof(struct sockaddr_in);
if(!sck)
+ {
+ globalLock.unlock();
return -1;
+ }
client = (struct socket *)pico_zalloc(sizeof(struct socket));
if(!client)
+ {
+ globalLock.unlock();
return -1;
+ }
client->sock = sck;
client->proto = _sock->proto;
@@ -294,8 +315,11 @@
client->socket = (int)sck;
client->mutex = new PicoCondition();
+ globalMutex.lock();
pico_tree_insert(&sockTree,client);
-
+ globalMutex.unlock();
+
+ globalLock.unlock();
return client->socket;
}
@@ -316,16 +340,20 @@
{
delete(_sock->mutex);
}
-
+ globalMutex.lock();
pico_tree_delete(&sockTree,_sock);
+ globalMutex.unlock();
pico_free(_sock);
-
+
+
+ globalLock.unlock();
return ret;
}
int picotcp_send(int sock,void * buff, int len, int flags)
{
struct socket * _sock = findAfterId(sock);
+ int ret;
VALIDATE_NULL(_sock);
@@ -339,14 +367,17 @@
if(waitForEvent(_sock,PICO_SOCK_EV_WR,1))
return -1;
}
- //printf("Sending...\n");
- return pico_socket_send(_sock->sock,buff,len);
+
+ ret = pico_socket_send(_sock->sock,buff,len);
+ globalLock.unlock();
+ return ret;
}
int picotcp_recv(int sock,void * buff, int len, int flags)
{
struct socket * _sock = findAfterId(sock);
-
+ int ret;
+
VALIDATE_NULL(_sock);
if(_sock->state != SOCK_BOUND && _sock->state != SOCK_CONNECTED)
@@ -355,7 +386,10 @@
if(waitForEvent(_sock,PICO_SOCK_EV_RD,1))
return -1;
- return pico_socket_recv(_sock->sock,buff,len);
+ ret = pico_socket_recv(_sock->sock,buff,len);
+
+ globalLock.unlock();
+ return ret;
}
int picotcp_sendto(int sock,void * buff, int len, struct sockaddr *orig, socklen_t socklen)
@@ -376,14 +410,17 @@
{
struct socket * _sock = findAfterId(sock);
struct sockaddr_in *s_in = (struct sockaddr_in *) orig;
-
+ int ret;
+
VALIDATE_NULL(_sock);
VALIDATE_ONE(_sock->proto,PICO_PROTO_UDP);
VALIDATE_NULL(socklen);
if(waitForEvent(_sock,PICO_SOCK_EV_RD,1))
return -1;
- return pico_socket_recvfrom(_sock->sock,buff,len,(void *)&s_in->sin_addr,(uint16_t *)&s_in->sin_port);
+ ret = pico_socket_recvfrom(_sock->sock,buff,len,(void *)&s_in->sin_addr,(uint16_t *)&s_in->sin_port);
+ globalLock.unlock();
+ return ret;
}
int picotcp_read(int sock,void *buf, int len)
@@ -402,6 +439,7 @@
tot_len += r;
else break;
}
+ globalLock.unlock();
return tot_len;
}
@@ -424,6 +462,8 @@
tot_len += r;
else break;
}
+
+ globalLock.unlock();
return tot_len;
}
@@ -461,6 +501,7 @@
SET_EVENT(_sock->event,PICO_SOCK_EV_WR);
while (PICO_TIME_MS() < now + ms) {
+
if (_sock->mutex->lock(1) == false) {
//Thread::wait(1);
continue;
@@ -468,7 +509,7 @@
if (read && EVENT_PENDING(_sock->revent,PICO_SOCK_EV_RD|PICO_SOCK_EV_CONN))
{
- RESET_EVENT(_sock->revent,PICO_SOCK_EV_RD|PICO_SOCK_EV_CONN);
+ RESET_EVENT(_sock->revent,PICO_SOCK_EV_CONN|PICO_SOCK_EV_RD);
ret++;
}
if (write && EVENT_PENDING(_sock->revent, PICO_SOCK_EV_WR))
@@ -478,12 +519,15 @@
}
if (ret > 0)
break;
+
+
}
if(read)
- RESET_EVENT(_sock->event,PICO_SOCK_EV_RD|PICO_SOCK_EV_CONN);
+ RESET_EVENT(_sock->event,PICO_SOCK_EV_CONN|PICO_SOCK_EV_RD);
if(write)
RESET_EVENT(_sock->event,PICO_SOCK_EV_WR);
+
return ret;
}
