diff -ur linux-2.2.9-ref/include/linux/sched.h linux-2.2.9-accept/include/linux/sched.h
--- linux-2.2.9-ref/include/linux/sched.h	Fri Jun 11 15:09:01 1999
+++ linux-2.2.9-accept/include/linux/sched.h	Thu Aug  5 17:59:11 1999
@@ -79,6 +79,7 @@
 #define TASK_ZOMBIE		4
 #define TASK_STOPPED		8
 #define TASK_SWAPPING		16
+#define TASK_EXCLUSIVE		32
 
 /*
  * Scheduling policies
@@ -475,6 +476,8 @@
 
 #define wake_up(x)			__wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE)
 #define wake_up_interruptible(x)	__wake_up((x),TASK_INTERRUPTIBLE)
+#define wake_one(x)			__wake_up((x),TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE | TASK_EXCLUSIVE)
+#define wake_one_interruptible(x)	__wake_up((x),TASK_INTERRUPTIBLE | TASK_EXCLUSIVE)
 
 extern int in_group_p(gid_t grp);
 
diff -ur linux-2.2.9-ref/include/net/tcp.h linux-2.2.9-accept/include/net/tcp.h
--- linux-2.2.9-ref/include/net/tcp.h	Fri Jun 11 15:13:54 1999
+++ linux-2.2.9-accept/include/net/tcp.h	Fri Aug  6 13:35:31 1999
@@ -514,6 +514,8 @@
 extern struct sock *		tcp_accept(struct sock *sk, int flags);
 extern unsigned int		tcp_poll(struct file * file, struct socket *sock, struct poll_table_struct *wait);
 extern void			tcp_write_space(struct sock *sk); 
+extern void			tcp_wakeup(struct sock *sk); 
+extern void			tcp_data_ready(struct sock *sk, int len); 
 
 extern int			tcp_getsockopt(struct sock *sk, int level, 
 					       int optname, char *optval, 
diff -ur linux-2.2.9-ref/kernel/sched.c linux-2.2.9-accept/kernel/sched.c
--- linux-2.2.9-ref/kernel/sched.c	Fri Jun 11 12:54:20 1999
+++ linux-2.2.9-accept/kernel/sched.c	Thu Aug  5 17:44:14 1999
@@ -908,6 +908,8 @@
 				goto out;
 			}
 			wake_up_process(p);
+			if (TASK_EXCLUSIVE & mode)
+				break;
 		}
 	}
 out_unlock:
diff -ur linux-2.2.9-ref/net/ipv4/tcp.c linux-2.2.9-accept/net/ipv4/tcp.c
--- linux-2.2.9-ref/net/ipv4/tcp.c	Fri Jun 11 12:54:02 1999
+++ linux-2.2.9-accept/net/ipv4/tcp.c	Fri Aug  6 13:36:27 1999
@@ -612,10 +612,32 @@
 	if (sk->dead)
 		return; 
 
-	wake_up_interruptible(sk->sleep);
+	wake_one_interruptible(sk->sleep);
 	if (sock_wspace(sk) >=
 	    tcp_min_write_space(sk))
 		sock_wake_async(sk->socket, 2);
+}
+
+
+/*
+ *	Socket state_change callback.
+ */
+void tcp_wakeup(struct sock *sk)
+{
+        if(!sk->dead)
+                wake_one_interruptible(sk->sleep);
+}
+
+
+/*
+ *	Socket data_ready callback.
+ */
+void tcp_data_ready(struct sock *sk, int len)
+{
+        if(!sk->dead) {
+                wake_one_interruptible(sk->sleep);
+                sock_wake_async(sk->socket,1);
+        }
 }
 
 
diff -ur linux-2.2.9-ref/net/ipv4/tcp_ipv4.c linux-2.2.9-accept/net/ipv4/tcp_ipv4.c
--- linux-2.2.9-ref/net/ipv4/tcp_ipv4.c	Fri Jun 11 12:54:20 1999
+++ linux-2.2.9-accept/net/ipv4/tcp_ipv4.c	Fri Aug  6 13:36:41 1999
@@ -1864,6 +1864,8 @@
 	tp->rcv_mss = 536; 
 
 	sk->write_space = tcp_write_space; 
+	sk->state_change = tcp_wakeup; 
+	sk->data_ready = tcp_data_ready; 
 
 	/* Init SYN queue. */
 	tcp_synq_init(tp);
diff -ur linux-2.2.9-ref/net/netsyms.c linux-2.2.9-accept/net/netsyms.c
--- linux-2.2.9-ref/net/netsyms.c	Fri Jun 11 12:54:03 1999
+++ linux-2.2.9-accept/net/netsyms.c	Fri Aug  6 13:36:06 1999
@@ -299,6 +299,8 @@
 EXPORT_SYMBOL(tcp_write_wakeup);
 EXPORT_SYMBOL(tcp_read_wakeup);
 EXPORT_SYMBOL(tcp_write_space);
+EXPORT_SYMBOL(tcp_wakeup);
+EXPORT_SYMBOL(tcp_data_ready);
 EXPORT_SYMBOL(tcp_poll);
 EXPORT_SYMBOL(tcp_ioctl);
 EXPORT_SYMBOL(tcp_shutdown);
