version 1.168, 2008/06/18 09:06:27 |
version 1.169, 2008/07/25 22:45:58 |
Line 645 soclose(struct socket *so) |
|
Line 645 soclose(struct socket *so) |
|
solock(so); |
solock(so); |
if (so->so_options & SO_ACCEPTCONN) { |
if (so->so_options & SO_ACCEPTCONN) { |
do { |
do { |
if ((so2 = TAILQ_FIRST(&so->so_q0)) != 0) { |
while ((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; |
|
} |
} |
if ((so2 = TAILQ_FIRST(&so->so_q)) != 0) { |
while ((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 (0); |
} while (!TAILQ_EMPTY(&so->so_q0)); |
} |
} |
if (so->so_pcb == 0) |
if (so->so_pcb == 0) |
goto discard; |
goto discard; |