version 1.41, 1999/01/20 09:15:41 |
version 1.43, 1999/01/21 22:09:10 |
|
|
register struct socket *so; |
register struct socket *so; |
{ |
{ |
|
|
/* |
if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) |
* We must not decommission a socket that's on the accept(2) queue. |
|
* If we do, then accept(2) may hang even after select(2) indicated |
|
* that the listening socket was ready. |
|
*/ |
|
if (so->so_pcb || so->so_head || (so->so_state & SS_NOFDREF) == 0) |
|
return; |
return; |
|
if (so->so_head) { |
|
/* |
|
* We must not decommission a socket that's on the accept(2) |
|
* queue. If we do, then accept(2) may hang after select(2) |
|
* indicated that the listening socket was ready. |
|
*/ |
|
if (!soqremque(so, 0)) |
|
return; |
|
} |
sbrelease(&so->so_snd); |
sbrelease(&so->so_snd); |
sorflush(so); |
sorflush(so); |
pool_put(&socket_pool, so); |
pool_put(&socket_pool, so); |
|
|
|
|
if (so->so_options & SO_ACCEPTCONN) { |
if (so->so_options & SO_ACCEPTCONN) { |
while ((so2 = so->so_q0.tqh_first) != 0) { |
while ((so2 = so->so_q0.tqh_first) != 0) { |
so2->so_head = 0; |
(void) soqremque(so2, 0); |
(void) soabort(so2); |
(void) soabort(so2); |
} |
} |
while ((so2 = so->so_q.tqh_first) != 0) { |
while ((so2 = so->so_q.tqh_first) != 0) { |
so2->so_head = 0; |
(void) soqremque(so2, 1); |
(void) soabort(so2); |
(void) soabort(so2); |
} |
} |
} |
} |