diff -ur --new-file linux-2.2.14/Makefile linux-2.2.14-wake1/Makefile --- linux-2.2.14/Makefile Wed Mar 22 23:08:43 2000 +++ linux-2.2.14-wake1/Makefile Wed Mar 22 23:11:18 2000 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 2 SUBLEVEL = 14 -EXTRAVERSION = +EXTRAVERSION = -wake1 ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) diff -ur --new-file linux-2.2.14/include/linux/sched.h linux-2.2.14-wake1/include/linux/sched.h --- linux-2.2.14/include/linux/sched.h Wed Mar 22 23:13:54 2000 +++ linux-2.2.14-wake1/include/linux/sched.h Thu Mar 23 00:36:42 2000 @@ -79,6 +79,7 @@ #define TASK_ZOMBIE 4 #define TASK_STOPPED 8 #define TASK_SWAPPING 16 +#define TASK_EXCLUSIVE 32 /* * Scheduling policies @@ -492,6 +493,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 --new-file linux-2.2.14/include/net/tcp.h linux-2.2.14-wake1/include/net/tcp.h --- linux-2.2.14/include/net/tcp.h Wed Mar 22 23:14:05 2000 +++ linux-2.2.14-wake1/include/net/tcp.h Thu Mar 23 00:36:53 2000 @@ -493,6 +493,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 --new-file linux-2.2.14/kernel/sched.c linux-2.2.14-wake1/kernel/sched.c --- linux-2.2.14/kernel/sched.c Wed Mar 22 23:08:23 2000 +++ linux-2.2.14-wake1/kernel/sched.c Thu Mar 23 00:06:22 2000 @@ -912,6 +912,8 @@ goto out; } wake_up_process(p); + if (TASK_EXCLUSIVE & mode) + break; } } out_unlock: diff -ur --new-file linux-2.2.14/net/ipv4/tcp.c linux-2.2.14-wake1/net/ipv4/tcp.c --- linux-2.2.14/net/ipv4/tcp.c Wed Mar 22 23:08:24 2000 +++ linux-2.2.14-wake1/net/ipv4/tcp.c Thu Mar 23 00:07:56 2000 @@ -612,10 +612,31 @@ 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 --new-file linux-2.2.14/net/ipv4/tcp_ipv4.c linux-2.2.14-wake1/net/ipv4/tcp_ipv4.c --- linux-2.2.14/net/ipv4/tcp_ipv4.c Wed Mar 22 23:08:24 2000 +++ linux-2.2.14-wake1/net/ipv4/tcp_ipv4.c Thu Mar 23 00:09:50 2000 @@ -1959,6 +1959,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 --new-file linux-2.2.14/net/netsyms.c linux-2.2.14-wake1/net/netsyms.c --- linux-2.2.14/net/netsyms.c Wed Mar 22 23:08:24 2000 +++ linux-2.2.14-wake1/net/netsyms.c Thu Mar 23 00:10:19 2000 @@ -297,6 +297,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);