summaryrefslogtreecommitdiffstats
path: root/filters/filter.c
diff options
context:
space:
mode:
Diffstat (limited to 'filters/filter.c')
-rw-r--r--filters/filter.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/filters/filter.c b/filters/filter.c
index 84596b723e..dfe6df953a 100644
--- a/filters/filter.c
+++ b/filters/filter.c
@@ -183,6 +183,8 @@ bool mp_filter_run(struct mp_filter *filter)
r->filtering = true;
+ // Note: some filters may call mp_filter_wakeup() from process on themselves
+ // to queue a wakeup again later. So do not call this in the loop.
flush_async_notifications(r);
while (r->num_pending) {
@@ -311,6 +313,8 @@ static struct mp_pin *find_connected_end(struct mp_pin *p)
// state flags.
static void init_connection(struct mp_pin *p)
{
+ struct filter_runner *runner = p->owner->in->runner;
+
if (p->dir == MP_PIN_IN)
p = p->other;
@@ -321,6 +325,12 @@ static void init_connection(struct mp_pin *p)
assert(!in->user_conn);
assert(!out->user_conn);
+ // This and similar checks enforce the same root filter requirement.
+ if (in->manual_connection)
+ assert(in->manual_connection->in->runner == runner);
+ if (out->manual_connection)
+ assert(out->manual_connection->in->runner == runner);
+
// Logicaly, the ends are always manual connections. A pin chain without
// manual connections at the ends is still disconnected (or if this
// attempted to extend an existing connection, becomes dangling and gets
@@ -339,6 +349,7 @@ static void init_connection(struct mp_pin *p)
assert(!cur->data.type); // unused for in pins
assert(!cur->other->data_requested); // unset for unconnected out pins
assert(!cur->other->data.type); // unset for unconnected out pins
+ assert(cur->owner->in->runner == runner);
cur->within_conn = cur->other->within_conn = true;
cur = cur->other->user_conn;
}