diff options
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r-- | sys/kern/uipc_socket.c | 51 |
1 files changed, 16 insertions, 35 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 9b6c423..44fd16b 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -2171,31 +2171,22 @@ filt_sordetach(struct knote *kn) static int filt_soread(struct knote *kn, long hint) { - struct socket *so = kn->kn_fp->f_data; - int need_lock, result; + struct socket *so; + + so = kn->kn_fp->f_data; + SOCKBUF_LOCK_ASSERT(&so->so_rcv); - /* - * XXXRW: Conditional locking because filt_soread() can be called - * either from KNOTE() in the socket context where the socket buffer - * lock is already held, or from kqueue() itself. - */ - need_lock = !SOCKBUF_OWNED(&so->so_rcv); - if (need_lock) - SOCKBUF_LOCK(&so->so_rcv); kn->kn_data = so->so_rcv.sb_cc - so->so_rcv.sb_ctl; if (so->so_rcv.sb_state & SBS_CANTRCVMORE) { kn->kn_flags |= EV_EOF; kn->kn_fflags = so->so_error; - result = 1; + return (1); } else if (so->so_error) /* temporary udp error */ - result = 1; + return (1); else if (kn->kn_sfflags & NOTE_LOWAT) - result = (kn->kn_data >= kn->kn_sdata); + return (kn->kn_data >= kn->kn_sdata); else - result = (so->so_rcv.sb_cc >= so->so_rcv.sb_lowat); - if (need_lock) - SOCKBUF_UNLOCK(&so->so_rcv); - return (result); + return (so->so_rcv.sb_cc >= so->so_rcv.sb_lowat); } static void @@ -2214,34 +2205,24 @@ filt_sowdetach(struct knote *kn) static int filt_sowrite(struct knote *kn, long hint) { - struct socket *so = kn->kn_fp->f_data; - int need_lock, result; + struct socket *so; - /* - * XXXRW: Conditional locking because filt_soread() can be called - * either from KNOTE() in the socket context where the socket buffer - * lock is already held, or from kqueue() itself. - */ - need_lock = !SOCKBUF_OWNED(&so->so_snd); - if (need_lock) - SOCKBUF_LOCK(&so->so_snd); + so = kn->kn_fp->f_data; + SOCKBUF_LOCK_ASSERT(&so->so_snd); kn->kn_data = sbspace(&so->so_snd); if (so->so_snd.sb_state & SBS_CANTSENDMORE) { kn->kn_flags |= EV_EOF; kn->kn_fflags = so->so_error; - result = 1; + return (1); } else if (so->so_error) /* temporary udp error */ - result = 1; + return (1); else if (((so->so_state & SS_ISCONNECTED) == 0) && (so->so_proto->pr_flags & PR_CONNREQUIRED)) - result = 0; + return (0); else if (kn->kn_sfflags & NOTE_LOWAT) - result = (kn->kn_data >= kn->kn_sdata); + return (kn->kn_data >= kn->kn_sdata); else - result = (kn->kn_data >= so->so_snd.sb_lowat); - if (need_lock) - SOCKBUF_UNLOCK(&so->so_snd); - return (result); + return (kn->kn_data >= so->so_snd.sb_lowat); } /*ARGSUSED*/ |