#ifdef INET_REFCNT_DEBUG if (atomic_read(&sk->sk_refcnt) != 1) printk(KERN_DEBUG "Destruction of the socket %p delayed, c=%d\n", sk, atomic_read(&sk->sk_refcnt)); #endif 
sk_refcnt_debug_release(sk); 
void sk_common_release(struct sock *sk){	if (sk->sk_prot->destroy)		sk->sk_prot->destroy(sk);	/*	 * Observation: when sock_common_release is called, processes have	 * no access to socket. But net still has.	 * Step one, detach it from networking:	 *	 * A. Remove from hash tables.	 */	sk->sk_prot->unhash(sk);	/*	 * In this point socket cannot receive new packets, but it is possible	 * that some packets are in flight because some CPU runs receiver and	 * did hash table lookup before we unhashed socket. They will achieve	 * receive queue and will be purged by socket destructor.	 *	 * Also we still have packets pending on receive queue and probably,	 * our own packets waiting in device queues. sock_destroy will drain	 * receive queue, but transmitted packets will delay socket destruction	 * until the last reference will be released.	 */	sock_orphan(sk);	xfrm_sk_free_policy(sk);#ifdef INET_REFCNT_DEBUG	if (atomic_read(&sk->sk_refcnt) != 1)		printk(KERN_DEBUG "Destruction of the socket %p delayed, c=%d\n",		       sk, atomic_read(&sk->sk_refcnt));#endif	sock_put(sk);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/e6848976b721eeb5551cd94673faafeef78d9f35/sock.c/clean/net/core/sock.c