so_pru_abort_oncpu(so);
}
+/*
+ * so is passed in ref'd, which becomes owned by
+ * the cleared SS_NOFDREF flag.
+ */
int
soaccept(struct socket *so, struct sockaddr **nam)
{
if ((so->so_state & SS_NOFDREF) == 0)
panic("soaccept: !NOFDREF");
- soreference(so); /* create ref */
soclrstate(so, SS_NOFDREF); /* owned by lack of SS_NOFDREF */
error = so_pru_accept_direct(so, nam);
return (error);
soaccept_predicate(struct netmsg_so_notify *msg)
{
struct socket *head = msg->base.nm_so;
+ struct socket *so;
if (head->so_error != 0) {
msg->base.lmsg.ms_error = head->so_error;
lwkt_gettoken(&head->so_rcv.ssb_token);
if (!TAILQ_EMPTY(&head->so_comp)) {
/* Abuse nm_so field as copy in/copy out parameter. XXX JH */
- msg->base.nm_so = TAILQ_FIRST(&head->so_comp);
- TAILQ_REMOVE(&head->so_comp, msg->base.nm_so, so_list);
+ so = TAILQ_FIRST(&head->so_comp);
+ TAILQ_REMOVE(&head->so_comp, so, so_list);
head->so_qlen--;
+ soclrstate(so, SS_COMP);
+ so->so_head = NULL;
+ soreference(so);
- msg->base.lmsg.ms_error = 0;
lwkt_reltoken(&head->so_rcv.ssb_token);
+
+ msg->base.lmsg.ms_error = 0;
+ msg->base.nm_so = so;
return (TRUE);
}
lwkt_reltoken(&head->so_rcv.ssb_token);
/*
* At this point we have the connection that's ready to be accepted.
+ *
+ * NOTE! soaccept_predicate() ref'd so for us, and soaccept() expects
+ * to eat the ref and turn it into a descriptor.
*/
so = msg.base.nm_so;
/* connection has been removed from the listen queue */
KNOTE(&head->so_rcv.ssb_kq.ki_note, 0);
- soclrstate(so, SS_COMP);
- so->so_head = NULL;
if (head->so_sigio != NULL)
fsetown(fgetown(head->so_sigio), &so->so_sigio);
}
TAILQ_REMOVE(&head->so_comp, so, so_list);
head->so_qlen--;
+ soclrstate(so, SS_COMP);
+ so->so_head = NULL;
+ soreference(so);
+
lwkt_reltoken(&head->so_rcv.ssb_token);
/* XXX KNOTE(&head->so_rcv.ssb_sel.si_note, 0); */
- soclrstate(so, SS_COMP);
- so->so_head = NULL;
-
soaccept(so, &sa);
len = OFFSETOF(struct ng_ksocket_accept, addr);