コード例 #1
0
ファイル: socket.c プロジェクト: wanggx/Linux1.0
/* 释放一个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);
}
コード例 #2
0
ファイル: socket.c プロジェクト: binsys/doc-linux
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);
}