Index: src/api/sockets.c =================================================================== RCS file: /sources/lwip/lwip/src/api/sockets.c,v retrieving revision 1.93 diff -u -p -r1.93 sockets.c --- src/api/sockets.c 10 Oct 2007 08:13:58 -0000 1.93 +++ src/api/sockets.c 25 Oct 2007 10:27:52 -0000 @@ -89,7 +89,6 @@ static struct lwip_socket sockets[NUM_SO static struct lwip_select_cb *select_cb_list; static sys_sem_t socksem; -static sys_sem_t selectsem; static void event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len); static void lwip_getsockopt_internal(void *arg); @@ -135,7 +134,6 @@ void lwip_socket_init(void) { socksem = sys_sem_new(1); - selectsem = sys_sem_new(1); } static struct lwip_socket * @@ -744,6 +742,7 @@ lwip_select(int maxfdp1, fd_set *readset u32_t msectimeout; struct lwip_select_cb select_cb; struct lwip_select_cb *p_selcb; + SYS_ARCH_DECL_PROTECT(lev); LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select(%d, %p, %p, %p, tvsec=%ld tvusec=%ld)\n", maxfdp1, (void *)readset, (void *) writeset, (void *) exceptset, @@ -756,7 +755,7 @@ lwip_select(int maxfdp1, fd_set *readset select_cb.sem_signalled = 0; /* Protect ourselves searching through the list */ - sys_sem_wait(selectsem); + SYS_ARCH_PROTECT(lev); if (readset) lreadset = *readset; @@ -778,7 +777,7 @@ lwip_select(int maxfdp1, fd_set *readset /* If we don't have any current events, then suspend if we are supposed to */ if (!nready) { if (timeout && timeout->tv_sec == 0 && timeout->tv_usec == 0) { - sys_sem_signal(selectsem); + SYS_ARCH_UNPROTECT(lev); if (readset) FD_ZERO(readset); if (writeset) @@ -804,7 +803,7 @@ lwip_select(int maxfdp1, fd_set *readset select_cb_list = &select_cb; /* Now we can safely unprotect */ - sys_sem_signal(selectsem); + SYS_ARCH_UNPROTECT(lev); /* Now just wait to be woken */ if (timeout == 0) @@ -819,7 +818,7 @@ lwip_select(int maxfdp1, fd_set *readset i = sys_sem_wait_timeout(select_cb.sem, msectimeout); /* Take us off the list */ - sys_sem_wait(selectsem); + SYS_ARCH_PROTECT(lev); if (select_cb_list == &select_cb) select_cb_list = select_cb.next; else @@ -830,7 +829,7 @@ lwip_select(int maxfdp1, fd_set *readset } } - sys_sem_signal(selectsem); + SYS_ARCH_UNPROTECT(lev); sys_sem_free(select_cb.sem); if (i == 0) { @@ -864,7 +863,7 @@ lwip_select(int maxfdp1, fd_set *readset /* See what's set */ nready = lwip_selscan(maxfdp1, &lreadset, &lwriteset, &lexceptset); } else - sys_sem_signal(selectsem); + SYS_ARCH_UNPROTECT(lev); if (readset) *readset = lreadset; @@ -885,6 +884,7 @@ event_callback(struct netconn *conn, enu int s; struct lwip_socket *sock; struct lwip_select_cb *scb; + SYS_ARCH_DECL_PROTECT(lev); LWIP_UNUSED_ARG(len); @@ -908,7 +908,7 @@ event_callback(struct netconn *conn, enu } else return; - sys_sem_wait(selectsem); + SYS_ARCH_PROTECT(lev); /* Set event as required */ switch (evt) { case NETCONN_EVT_RCVPLUS: @@ -924,7 +924,7 @@ event_callback(struct netconn *conn, enu sock->sendevent = 0; break; } - sys_sem_signal(selectsem); + SYS_ARCH_UNPROTECT(lev); /* Now decide if anyone is waiting for this socket */ /* NOTE: This code is written this way to protect the select link list @@ -934,7 +934,7 @@ event_callback(struct netconn *conn, enu the list the number of waiting select calls + 1. This list is expected to be small. */ while (1) { - sys_sem_wait(selectsem); + SYS_ARCH_PROTECT(lev); for (scb = select_cb_list; scb; scb = scb->next) { if (scb->sem_signalled == 0) { /* Test this select call for our socket */ @@ -948,10 +948,10 @@ event_callback(struct netconn *conn, enu } if (scb) { scb->sem_signalled = 1; - sys_sem_signal(selectsem); + SYS_ARCH_UNPROTECT(lev); sys_sem_signal(scb->sem); } else { - sys_sem_signal(selectsem); + SYS_ARCH_UNPROTECT(lev); break; } }