mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
jack: use refcount for freezing callbacks
In case the callbacks are called recursively, use a refcount for blocking the callback emission. See #3183
This commit is contained in:
parent
ccece8316b
commit
844ab48db8
1 changed files with 9 additions and 6 deletions
|
|
@ -393,8 +393,8 @@ struct client {
|
||||||
unsigned int global_buffer_size:1;
|
unsigned int global_buffer_size:1;
|
||||||
unsigned int passive_links:1;
|
unsigned int passive_links:1;
|
||||||
unsigned int graph_callback_pending:1;
|
unsigned int graph_callback_pending:1;
|
||||||
unsigned int frozen_callbacks:1;
|
|
||||||
unsigned int pending_callbacks:1;
|
unsigned int pending_callbacks:1;
|
||||||
|
int frozen_callbacks;
|
||||||
char filter_char;
|
char filter_char;
|
||||||
uint32_t max_ports;
|
uint32_t max_ports;
|
||||||
|
|
||||||
|
|
@ -861,13 +861,13 @@ static void recompute_latencies(struct client *c)
|
||||||
|
|
||||||
#define freeze_callbacks(c) \
|
#define freeze_callbacks(c) \
|
||||||
({ \
|
({ \
|
||||||
(c)->frozen_callbacks = true; \
|
(c)->frozen_callbacks++; \
|
||||||
})
|
})
|
||||||
|
|
||||||
#define thaw_callbacks(c) \
|
#define thaw_callbacks(c) \
|
||||||
({ \
|
({ \
|
||||||
(c)->frozen_callbacks = false; \
|
(c)->frozen_callbacks--; \
|
||||||
if ((c)->pending_callbacks) \
|
if ((c)->frozen_callbacks == 0 && (c)->pending_callbacks) \
|
||||||
pw_loop_signal_event((c)->context.l, (c)->notify_event); \
|
pw_loop_signal_event((c)->context.l, (c)->notify_event); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -875,9 +875,11 @@ static void emit_callbacks(struct client *c)
|
||||||
{
|
{
|
||||||
struct object *o, *t;
|
struct object *o, *t;
|
||||||
|
|
||||||
if (c->frozen_callbacks || !c->pending_callbacks)
|
if (c->frozen_callbacks != 0 || !c->pending_callbacks)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
pw_log_debug("%p: enter", c);
|
||||||
|
|
||||||
c->pending_callbacks = false;
|
c->pending_callbacks = false;
|
||||||
|
|
||||||
freeze_callbacks(c);
|
freeze_callbacks(c);
|
||||||
|
|
@ -885,6 +887,7 @@ static void emit_callbacks(struct client *c)
|
||||||
if (o->removed)
|
if (o->removed)
|
||||||
continue;
|
continue;
|
||||||
if (o->register_pending) {
|
if (o->register_pending) {
|
||||||
|
o->register_pending = false;
|
||||||
switch (o->type) {
|
switch (o->type) {
|
||||||
case INTERFACE_Node:
|
case INTERFACE_Node:
|
||||||
do_callback(c, registration_callback, c->active,
|
do_callback(c, registration_callback, c->active,
|
||||||
|
|
@ -906,7 +909,6 @@ static void emit_callbacks(struct client *c)
|
||||||
c->connect_arg);
|
c->connect_arg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
o->register_pending = false;
|
|
||||||
}
|
}
|
||||||
if (o->removing) {
|
if (o->removing) {
|
||||||
o->removing = false;
|
o->removing = false;
|
||||||
|
|
@ -919,6 +921,7 @@ static void emit_callbacks(struct client *c)
|
||||||
do_callback(c, graph_callback, c->active, c->graph_arg);
|
do_callback(c, graph_callback, c->active, c->graph_arg);
|
||||||
}
|
}
|
||||||
thaw_callbacks(c);
|
thaw_callbacks(c);
|
||||||
|
pw_log_debug("%p: leave", c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void notify_event(void *data, uint64_t count)
|
static void notify_event(void *data, uint64_t count)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue