Free (GPLv2) TCP/IP stack developed by TASS Belgium

Fork of PicoTCP by Daniele Lacamera

Files at this revision

API Documentation at this revision

Comitter:
daniele
Date:
Thu Jun 06 15:35:29 2013 +0000
Parent:
16:6893f625e337
Child:
18:c6f67fcfc62a
Commit message:
Reworked some blocking code

Changed in this revision

Socket/pico_bsd_layer.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Socket/pico_bsd_layer.cpp	Thu Jun 06 13:51:27 2013 +0000
+++ b/Socket/pico_bsd_layer.cpp	Thu Jun 06 15:35:29 2013 +0000
@@ -78,83 +78,48 @@
         if( MAKE_SOCKET(index->keyValue)->sock == sock )
             return (struct socket *)index->keyValue;
     }
-
     return NULL;
 }
 
 static inline int waitForEvent(struct socket * sock, uint16_t event, uint8_t clear)
 {
     int retValue = 0;
-    
-    //if(sock->blocking)
-    {
-        if(EVENT_PENDING(sock->revent,event))
-        {
-            RESET_EVENT(sock->event, event);
-            
-            if(event & PICO_SOCK_EV_RD)
-                RESET_EVENT(event,PICO_SOCK_EV_RD);
-                
-            RESET_EVENT(sock->revent, event);
+    printf("Entering wait...\n");
+    if ((EVENT_PENDING(sock->revent, event)) == 0) {
+        SET_EVENT(sock->event, event);
+        while(1) {
+            sock->mutex->lock();
+            printf("Unlocked! EXP: %x EV: %x\n", event, sock->revent);
+            if (EVENT_PENDING(sock->revent, event))
+                break;
+            if (EVENT_PENDING(sock->revent, PICO_SOCK_EV_ERR | PICO_SOCK_EV_FIN | PICO_SOCK_EV_CLOSE) != 0) {
+                retValue = -1;
+                break;
+            }
+            printf("Re-locking.\n");
         }
-        else
-        {
-            SET_EVENT(sock->event, event);
-            //printf("Locked...\n");
-            sock->mutex->lock();
-            RESET_EVENT(sock->event,event);
-    
-            if(! EVENT_PENDING(sock->revent,event) || EVENT_PENDING(sock->revent, PICO_SOCK_EV_ERR) || 
-            EVENT_PENDING(sock->revent,PICO_SOCK_EV_CLOSE) || EVENT_PENDING(sock->revent,PICO_SOCK_EV_FIN) )
-                retValue = -1;
-        }
-        if(clear)
-            RESET_EVENT(sock->revent, event);
     }
-    
+    printf("... and returning.\n");
+    if(clear)
+        RESET_EVENT(sock->revent, event);
     return retValue;
 }
-
-
+    
 static void dispatch_socket(uint16_t ev, struct pico_socket * sock)
 {
     struct socket * _sock = findAfterSocket(sock);
+    printf("Dispatching...\n");
 
     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);
     
     SET_EVENT(_sock->revent,ev);
-    if(EVENT_EXPECTED(_sock))
-    {
-        // 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
-    {
-        printf("Unexpected event\n");
-        // give semaphore back when -1 occurs or close requested
-        if( (ev & PICO_SOCK_EV_ERR) || (ev & PICO_SOCK_EV_CLOSE) || (ev & PICO_SOCK_EV_FIN) )
-        {
-            printf("Exception\n");
-            
-            _sock->state = SOCK_CLOSED;
-            if(_sock->state != SOCK_CLOSED)
-            {
-                pico_socket_close(_sock->sock);
-                //_sock->sock = NULL;
-            }
-            _sock->mutex->unlock();
-            globalLock.lock();
-        }
-    }
+    printf("Dispatcher unlocks event %x\n", ev);
+    _sock->mutex->unlock();
+    globalLock.lock();       
 }
 
 /* PUBLIC FUNCTIONS */
@@ -367,11 +332,13 @@
     }
     if(_sock->proto == PICO_PROTO_TCP)
     {
-        if(waitForEvent(_sock,PICO_SOCK_EV_WR,1))
+        if(waitForEvent(_sock,PICO_SOCK_EV_WR,0))
             return -1;
     }
     
     ret = pico_socket_send(_sock->sock,buff,len);
+    if (ret < len)
+        RESET_EVENT(_sock->event, PICO_SOCK_EV_WR);
     globalLock.unlock();
     return ret;
 }
@@ -386,10 +353,12 @@
     if(_sock->state != SOCK_BOUND && _sock->state != SOCK_CONNECTED)
         return -1;
 
-    if(waitForEvent(_sock,PICO_SOCK_EV_RD,1))
+    if(waitForEvent(_sock,PICO_SOCK_EV_RD,0))
         return -1;
 
     ret = pico_socket_recv(_sock->sock,buff,len);
+    if (ret < len)
+        RESET_EVENT(_sock->event, PICO_SOCK_EV_RD);
     
     globalLock.unlock();
     return ret;
@@ -405,6 +374,10 @@
     VALIDATE_NULL(len);
     VALIDATE_NULL(socklen);
     printf("Sendto : parameters correct !\n");
+    if(_sock->proto == PICO_PROTO_TCP)
+    {
+       return -1;
+    }
   
     return pico_socket_sendto(_sock->sock,buff,len,(void *)&s_in->sin_addr,s_in->sin_port);
 }
@@ -419,9 +392,11 @@
     VALIDATE_ONE(_sock->proto,PICO_PROTO_UDP);
     VALIDATE_NULL(socklen);
         
-    if(waitForEvent(_sock,PICO_SOCK_EV_RD,1))
+    if(waitForEvent(_sock,PICO_SOCK_EV_RD,0))
         return -1;
     ret = pico_socket_recvfrom(_sock->sock,buff,len,(void *)&s_in->sin_addr,(uint16_t *)&s_in->sin_port);
+    if (ret < len)
+        RESET_EVENT(_sock->event, PICO_SOCK_EV_RD);
     globalLock.unlock();
     return ret;
 }
@@ -433,8 +408,11 @@
     VALIDATE_NULL(_sock);
     VALIDATE_ONE(_sock->proto,PICO_PROTO_TCP);
     VALIDATE_ONE(_sock->state, SOCK_CONNECTED);
+    r = pico_socket_read(_sock->sock, (unsigned char *)buf + tot_len, len - tot_len); 
+    if (r != 0)
+        return r;
 
-    if(waitForEvent(_sock,PICO_SOCK_EV_RD,1))
+    if(waitForEvent(_sock,PICO_SOCK_EV_RD,0))
         return -1;
     while(tot_len < len) {
         r = pico_socket_read(_sock->sock, (unsigned char *)buf + tot_len, len - tot_len); 
@@ -458,11 +436,9 @@
     VALIDATE_NULL(_sock);
     VALIDATE_ONE(_sock->proto,PICO_PROTO_TCP);
     VALIDATE_ONE(_sock->state, SOCK_CONNECTED);
-    if(waitForEvent(_sock,PICO_SOCK_EV_WR,1))
+    if(waitForEvent(_sock,PICO_SOCK_EV_WR,0))
         return -1;
         
-    if(waitForEvent(_sock,PICO_SOCK_EV_WR,1))
-        return -1;
     while(tot_len < len) {
         r = pico_socket_write(_sock->sock, (unsigned char *)buf + tot_len, len - tot_len); 
         if (r > 0)
@@ -513,7 +489,7 @@
     while(PICO_TIME_MS() < ms + now)
     {
         int events = 0;
-        RtosTimer tioTmr(timeoutCb, osTimerPeriodic, (void*)_sock);
+        RtosTimer tioTmr(timeoutCb, osTimerOnce, (void*)_sock);
         
         if(read)
             event |= PICO_SOCK_EV_RD;