filter: Switch from linked lists to arrays.
[paraslash.git] / filter_chain.c
index 975539291b2f08c3f97ec0b894531759d5613ac6..798d58e0bd28aac061db0c10ef18db977bd5bf80 100644 (file)
@@ -62,7 +62,7 @@ static void close_callbacks(struct filter_node *fn)
 
        list_for_each_entry_safe(fcb, tmp, &fn->callbacks, node) {
                PARA_INFO_LOG("closing %s filter callback\n",
-                       fn->filter->name);
+                       filters[fn->filter_num].name);
                close_filter_callback(fcb);
        }
 }
@@ -113,7 +113,7 @@ void filter_pre_select(__a_unused struct sched *s, struct task *t)
        struct filter_node *fn;
        char *ib;
        size_t *loaded;
-       int conv, conv_total = 0;
+       int i, conv, conv_total = 0;
 
        if (fc->output_error && *fc->output_error < 0) {
                t->error =  *fc->output_error;
@@ -123,12 +123,13 @@ again:
        ib = fc->inbuf;
        loaded = fc->in_loaded;
        conv = 0;
-       list_for_each_entry(fn, &fc->filters, node) {
+       FOR_EACH_FILTER_NODE(fn, fc, i) {
+               struct filter *f = filters + fn->filter_num;
                if (*loaded && fn->loaded < fn->bufsize) {
                        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->error = fn->filter->convert(ib, *loaded, fn);
+                       t->error = f->convert(ib, *loaded, fn);
                        if (t->error < 0)
                                return;
                        size = t->error;
@@ -176,18 +177,19 @@ again:
  */
 void close_filters(struct filter_chain *fc)
 {
-       struct filter_node *fn, *tmp;
+       struct filter_node *fn;
+       int i;
 
        if (!fc)
                return;
        PARA_NOTICE_LOG("closing filter chain %p\n", fc);
-       list_for_each_entry_safe(fn, tmp, &fc->filters, node) {
+       FOR_EACH_FILTER_NODE(fn, fc, i) {
+               struct filter *f = filters + fn->filter_num;
                close_callbacks(fn);
-               PARA_INFO_LOG("closing %s filter\n", fn->filter->name);
-               fn->filter->close(fn);
-               list_del(&fn->node);
-               free(fn);
+               PARA_INFO_LOG("closing %s filter\n", f->name);
+               f->close(fn);
        }
+       free(fc->filter_nodes);
 }
 
 /*