Daniele Lacamera / PicoTCP-Experimental_CDC_ECM_Branch

Fork of PicoTCP by Daniele Lacamera

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;
 }