Simplify the scheduling code.
[paraslash.git] / filter_chain.c
index f0b6095..9755392 100644 (file)
@@ -109,15 +109,15 @@ static void call_callbacks(struct filter_node *fn, char *inbuf, size_t inlen,
  */
 void filter_pre_select(__a_unused struct sched *s, struct task *t)
 {
-       struct filter_chain *fc = t->private_data;
+       struct filter_chain *fc = container_of(t, struct filter_chain, task);
        struct filter_node *fn;
        char *ib;
        size_t *loaded;
        int conv, conv_total = 0;
 
-       if (fc->output_error && *fc->output_error) {
-               t->ret =  *fc->output_error;
-               goto err_out;
+       if (fc->output_error && *fc->output_error < 0) {
+               t->error =  *fc->output_error;
+               return;
        }
 again:
        ib = fc->inbuf;
@@ -128,10 +128,10 @@ again:
                        size_t size, old_fn_loaded = fn->loaded;
 //                     PARA_DEBUG_LOG("fc %p loaded: %zd, calling %s convert\n",
 //                             fc, *loaded, fn->filter->name);
-                       t->ret = fn->filter->convert(ib, *loaded, fn);
-                       if (t->ret < 0)
-                               goto err_out;
-                       size = t->ret;
+                       t->error = fn->filter->convert(ib, *loaded, fn);
+                       if (t->error < 0)
+                               return;
+                       size = t->error;
                        call_callbacks(fn, ib, size, fn->buf + old_fn_loaded,
                                fn->loaded - old_fn_loaded);
                        *loaded -= size;
@@ -153,16 +153,13 @@ again:
 //             fc->eof, *fc->out_loaded, conv, conv_total);
        if (conv)
                goto again;
-       t->ret = 1;
        if (!*fc->input_error)
                return;
        if (*fc->out_loaded)
                return;
        if (*fc->in_loaded && conv_total)
                return;
-       t->ret = -E_FC_EOF;
-err_out:
-       fc->error = t->ret;
+       t->error = -E_FC_EOF;
 }
 
 /**