| version 1.171, 2008/08/06 15:01:23 |
version 1.172, 2008/10/10 11:20:15 |
| Line 639 soclose(struct socket *so) |
|
| Line 639 soclose(struct socket *so) |
|
| error = 0; |
error = 0; |
| solock(so); |
solock(so); |
| if (so->so_options & SO_ACCEPTCONN) { |
if (so->so_options & SO_ACCEPTCONN) { |
| do { |
for (;;) { |
| while ((so2 = TAILQ_FIRST(&so->so_q0)) != 0) { |
if ((so2 = TAILQ_FIRST(&so->so_q0)) != 0) { |
| KASSERT(solocked2(so, so2)); |
KASSERT(solocked2(so, so2)); |
| (void) soqremque(so2, 0); |
(void) soqremque(so2, 0); |
| /* soabort drops the lock. */ |
/* soabort drops the lock. */ |
| (void) soabort(so2); |
(void) soabort(so2); |
| solock(so); |
solock(so); |
| |
continue; |
| } |
} |
| while ((so2 = TAILQ_FIRST(&so->so_q)) != 0) { |
if ((so2 = TAILQ_FIRST(&so->so_q)) != 0) { |
| KASSERT(solocked2(so, so2)); |
KASSERT(solocked2(so, so2)); |
| (void) soqremque(so2, 1); |
(void) soqremque(so2, 1); |
| /* soabort drops the lock. */ |
/* soabort drops the lock. */ |
| (void) soabort(so2); |
(void) soabort(so2); |
| solock(so); |
solock(so); |
| |
continue; |
| } |
} |
| } while (!TAILQ_EMPTY(&so->so_q0)); |
break; |
| |
} |
| } |
} |
| if (so->so_pcb == 0) |
if (so->so_pcb == 0) |
| goto discard; |
goto discard; |