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);