| version 1.160, 2008/04/24 11:38:36 |
version 1.161, 2008/04/27 14:26:58 |
| Line 594 solisten(struct socket *so, int backlog, |
|
| Line 594 solisten(struct socket *so, int backlog, |
|
| void |
void |
| sofree(struct socket *so) |
sofree(struct socket *so) |
| { |
{ |
| |
u_int refs; |
| |
|
| KASSERT(solocked(so)); |
KASSERT(solocked(so)); |
| |
|
| Line 623 sofree(struct socket *so) |
|
| Line 624 sofree(struct socket *so) |
|
| KASSERT(!cv_has_waiters(&so->so_rcv.sb_cv)); |
KASSERT(!cv_has_waiters(&so->so_rcv.sb_cv)); |
| KASSERT(!cv_has_waiters(&so->so_snd.sb_cv)); |
KASSERT(!cv_has_waiters(&so->so_snd.sb_cv)); |
| sorflush(so); |
sorflush(so); |
| |
refs = so->so_aborting; /* XXX */ |
| sounlock(so); |
sounlock(so); |
| soput(so); |
if (refs == 0) /* XXX */ |
| |
soput(so); |
| } |
} |
| |
|
| /* |
/* |
| Line 700 soclose(struct socket *so) |
|
| Line 703 soclose(struct socket *so) |
|
| int |
int |
| soabort(struct socket *so) |
soabort(struct socket *so) |
| { |
{ |
| |
u_int refs; |
| int error; |
int error; |
| |
|
| KASSERT(solocked(so)); |
KASSERT(solocked(so)); |
| KASSERT(so->so_head == NULL); |
KASSERT(so->so_head == NULL); |
| |
|
| |
so->so_aborting++; /* XXX */ |
| error = (*so->so_proto->pr_usrreq)(so, PRU_ABORT, NULL, |
error = (*so->so_proto->pr_usrreq)(so, PRU_ABORT, NULL, |
| NULL, NULL, NULL); |
NULL, NULL, NULL); |
| |
refs = --so->so_aborting; /* XXX */ |
| if (error) { |
if (error) { |
| sofree(so); |
sofree(so); |
| } else { |
} else { |
| sounlock(so); |
sounlock(so); |
| |
if (refs == 0) |
| |
sofree(so); |
| } |
} |
| return error; |
return error; |
| } |
} |