/* 释放一个socket结构,并唤醒socket_wait_free队列 */ static void sock_release(struct socket *sock) { int oldstate; struct inode *inode; struct socket *peersock, *nextsock; DPRINTF((net_debug, "NET: sock_release: socket 0x%x, inode 0x%x\n", sock, SOCK_INODE(sock))); /* 设置socket的状态为正在关闭连接 */ if ((oldstate = sock->state) != SS_UNCONNECTED) sock->state = SS_DISCONNECTING; /* Wake up anyone waiting for connections. */ for (peersock = sock->iconn; peersock; peersock = nextsock) { nextsock = peersock->next; sock_release_peer(peersock); } /* * Wake up anyone we're connected to. First, we release the * protocol, to give it a chance to flush data, etc. */ peersock = (oldstate == SS_CONNECTED) ? sock->conn : NULL; if (sock->ops) sock->ops->release(sock, peersock); if (peersock) sock_release_peer(peersock); inode = SOCK_INODE(sock); sock->state = SS_FREE; /* this really releases us */ wake_up_interruptible(&socket_wait_free); /* We need to do this. If sock alloc was called we already have an inode. */ iput(inode); }
static void sock_release(struct socket *sock) { int oldstate; struct socket *peersock, *nextsock; PRINTK("sock_release: socket 0x%x, inode 0x%x\n", sock, SOCK_INODE(sock)); if ((oldstate = sock->state) != SS_UNCONNECTED) sock->state = SS_DISCONNECTING; /* * wake up anyone waiting for connections */ for (peersock = sock->iconn; peersock; peersock = nextsock) { nextsock = peersock->next; sock_release_peer(peersock); } /* * wake up anyone we're connected to. first, we release the * protocol, to give it a chance to flush data, etc. */ peersock = (oldstate == SS_CONNECTED) ? sock->conn : NULL; if (sock->ops) sock->ops->release(sock, peersock); if (peersock) sock_release_peer(peersock); sock->state = SS_FREE; /* this really releases us */ wake_up(&socket_wait_free); }