X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=filter_common.c;h=bc5539d0b842a7f81a735a53918c565d4c785d02;hp=cfe08dd1e7274bff947ddc50e70f3711fe60422e;hb=4c537cd0770d81fc3c3937010b75a67f18370d84;hpb=a37e903213215dd36b11bbde4ea98e1d4590a472 diff --git a/filter_common.c b/filter_common.c index cfe08dd1..bc5539d0 100644 --- a/filter_common.c +++ b/filter_common.c @@ -9,12 +9,14 @@ #include #include #include +#include #include "para.h" #include "list.h" #include "sched.h" #include "fd.h" #include "ggo.h" +#include "buffer_tree.h" #include "filter.h" #include "error.h" #include "string.h" @@ -106,7 +108,7 @@ static void call_callbacks(struct filter_node *fn, char *inbuf, size_t inlen, * * \sa filter_node, filter#convert, filter_callback. */ -void filter_pre_select(__a_unused struct sched *s, struct task *t) +void filter_post_select(__a_unused struct sched *s, struct task *t) { struct filter_chain *fc = container_of(t, struct filter_chain, task); struct filter_node *fn; @@ -143,19 +145,6 @@ again: conv_total += conv; if (conv) goto again; - if (conv_total) { - /* - * Other pre_select functions might have already been called by - * now and decided to do nothing, e.g. because their output - * buffer was full or the input buffer was empty. We just - * converted something which caused these buffers to change but - * we can't make the other tasks reconsider their decision at - * this point. So force a minimal timeout for the next select - * call to avoid unnecessary delays. - */ - s->timeout.tv_sec = 0; - s->timeout.tv_usec = 1; - } if (*fc->input_error >= 0) return; if (*fc->out_loaded) @@ -286,3 +275,23 @@ 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) +{ + size_t iqs; + + if (btr_eof(btrn)) + return -E_FC_EOF; + 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)) + return 0; + assert(iqs != 0); + /* avoid "buffer too small" errors from the decoder */ + btr_merge_to(btrn, min_len); + return 1; +}