Author: hiren
Date: Mon Jan 16 08:25:33 2017
New Revision: 312277
URL: https://svnweb.freebsd.org/changeset/base/312277

Log:
  Add kevent EVFILT_EMPTY for notification when a client has received all data
  i.e. everything outstanding has been acked.
  
  Reviewed by:  bz, gnn (previous version)
  MFC after:    3 days
  Sponsored by: Limelight Networks
  Differential Revision:        https://reviews.freebsd.org/D9150

Modified:
  head/sys/kern/kern_event.c
  head/sys/kern/uipc_socket.c
  head/sys/sys/event.h

Modified: head/sys/kern/kern_event.c
==============================================================================
--- head/sys/kern/kern_event.c  Mon Jan 16 07:41:39 2017        (r312276)
+++ head/sys/kern/kern_event.c  Mon Jan 16 08:25:33 2017        (r312277)
@@ -344,6 +344,7 @@ static struct {
        { &null_filtops },                      /* EVFILT_LIO */
        { &user_filtops, 1 },                   /* EVFILT_USER */
        { &null_filtops },                      /* EVFILT_SENDFILE */
+       { &file_filtops, 1 },                   /* EVFILT_EMPTY */
 };
 
 /*

Modified: head/sys/kern/uipc_socket.c
==============================================================================
--- head/sys/kern/uipc_socket.c Mon Jan 16 07:41:39 2017        (r312276)
+++ head/sys/kern/uipc_socket.c Mon Jan 16 08:25:33 2017        (r312277)
@@ -161,6 +161,7 @@ static void filt_sowdetach(struct knote 
 static int     filt_sowrite(struct knote *kn, long hint);
 static int     filt_solisten(struct knote *kn, long hint);
 static int inline hhook_run_socket(struct socket *so, void *hctx, int32_t 
h_id);
+static int     filt_soempty(struct knote *kn, long hint);
 fo_kqfilter_t  soo_kqfilter;
 
 static struct filterops solisten_filtops = {
@@ -178,6 +179,11 @@ static struct filterops sowrite_filtops 
        .f_detach = filt_sowdetach,
        .f_event = filt_sowrite,
 };
+static struct filterops soempty_filtops = {
+       .f_isfd = 1,
+       .f_detach = filt_sowdetach,
+       .f_event = filt_soempty,
+};
 
 so_gen_t       so_gencnt;      /* generation count for sockets */
 
@@ -3083,6 +3089,10 @@ soo_kqfilter(struct file *fp, struct kno
                kn->kn_fop = &sowrite_filtops;
                sb = &so->so_snd;
                break;
+       case EVFILT_EMPTY:
+               kn->kn_fop = &soempty_filtops;
+               sb = &so->so_snd;
+               break;
        default:
                return (EINVAL);
        }
@@ -3344,6 +3354,21 @@ filt_sowrite(struct knote *kn, long hint
                return (kn->kn_data >= so->so_snd.sb_lowat);
 }
 
+static int
+filt_soempty(struct knote *kn, long hint)
+{
+       struct socket *so;
+
+       so = kn->kn_fp->f_data;
+       SOCKBUF_LOCK_ASSERT(&so->so_snd);
+       kn->kn_data = sbused(&so->so_snd);
+
+       if (kn->kn_data == 0)
+               return (1);
+       else
+               return (0);
+}
+
 /*ARGSUSED*/
 static int
 filt_solisten(struct knote *kn, long hint)

Modified: head/sys/sys/event.h
==============================================================================
--- head/sys/sys/event.h        Mon Jan 16 07:41:39 2017        (r312276)
+++ head/sys/sys/event.h        Mon Jan 16 08:25:33 2017        (r312277)
@@ -43,7 +43,8 @@
 #define EVFILT_LIO             (-10)   /* attached to lio requests */
 #define EVFILT_USER            (-11)   /* User events */
 #define EVFILT_SENDFILE                (-12)   /* attached to sendfile 
requests */
-#define EVFILT_SYSCOUNT                12
+#define EVFILT_EMPTY           (-13)   /* empty send socket buf */
+#define EVFILT_SYSCOUNT                13
 
 #define EV_SET(kevp_, a, b, c, d, e, f) do {   \
        struct kevent *kevp = (kevp_);          \
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to