Free (GPLv2) TCP/IP stack developed by TASS Belgium
Fork of PicoTCP by
Revision 17:5292cca5c478, committed 2013-06-06
- 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;