]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - filter_common.c
generic_filter_pre_select(): Fix off-by-one.
[paraslash.git] / filter_common.c
index bc5539d0b842a7f81a735a53918c565d4c785d02..a27c2d303ad28d823ae9af20eeb4878f9300cad1 100644 (file)
@@ -279,8 +279,9 @@ void print_filter_helps(int detailed)
 /** 640K ought to be enough for everybody ;) */
 #define FILTER_MAX_PENDING (640 * 1024)
 
-int prepare_filter_node(struct btr_node *btrn, size_t min_len)
+int prepare_filter_node(struct filter_node *fn)
 {
+       struct btr_node *btrn = fn->btrn;
        size_t iqs;
 
        if (btr_eof(btrn))
@@ -288,10 +289,25 @@ int prepare_filter_node(struct btr_node *btrn, size_t min_len)
        if (btr_bytes_pending(btrn) > FILTER_MAX_PENDING)
                return 0;
        iqs = btr_get_input_queue_size(btrn);
-       if (iqs < min_len && !btr_no_parent(btrn))
+       if (iqs < fn->min_iqs && !btr_no_parent(btrn))
                return 0;
        assert(iqs != 0);
        /* avoid "buffer too small" errors from the decoder */
-       btr_merge_to(btrn, min_len);
+       btr_merge(btrn, fn->min_iqs);
        return 1;
 }
+
+void generic_filter_pre_select(struct sched *s, struct task *t)
+{
+       struct filter_node *fn = container_of(t, struct filter_node, task);
+       size_t iqs = btr_get_input_queue_size(fn->btrn);
+
+       t->error = 0;
+       if (iqs < fn->min_iqs)
+               return;
+       if (btr_bytes_pending(fn->btrn) > FILTER_MAX_PENDING)
+               return; /* FIXME, should use reasonable bound on timeout */
+       s->timeout.tv_sec = 0;
+       s->timeout.tv_usec = 1;
+}
+