mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
loop: add method to run a function with the lock
Convert some _invoke to _locked
This commit is contained in:
parent
fb49e0795c
commit
f7fdafc203
18 changed files with 99 additions and 57 deletions
|
|
@ -1239,12 +1239,11 @@ static void client_node_resource_destroy(void *data)
|
|||
spa_hook_remove(&impl->object_listener);
|
||||
|
||||
if (impl->data_source.fd != -1) {
|
||||
spa_loop_invoke(impl->data_loop,
|
||||
spa_loop_locked(impl->data_loop,
|
||||
do_remove_source,
|
||||
SPA_ID_INVALID,
|
||||
NULL,
|
||||
0,
|
||||
true,
|
||||
&impl->data_source);
|
||||
}
|
||||
if (this->node)
|
||||
|
|
|
|||
|
|
@ -1449,7 +1449,7 @@ static void hook_removed(struct spa_hook *hook)
|
|||
{
|
||||
struct filter *impl = hook->priv;
|
||||
if (impl->data_loop)
|
||||
pw_loop_invoke(impl->data_loop, do_remove_callbacks, 1, NULL, 0, true, impl);
|
||||
pw_loop_locked(impl->data_loop, do_remove_callbacks, 1, NULL, 0, impl);
|
||||
else
|
||||
spa_zero(impl->rt_callbacks);
|
||||
hook->priv = NULL;
|
||||
|
|
@ -2081,8 +2081,8 @@ SPA_EXPORT
|
|||
int pw_filter_flush(struct pw_filter *filter, bool drain)
|
||||
{
|
||||
struct filter *impl = SPA_CONTAINER_OF(filter, struct filter, this);
|
||||
pw_loop_invoke(impl->data_loop,
|
||||
drain ? do_drain : do_flush, 1, NULL, 0, true, impl);
|
||||
pw_loop_locked(impl->data_loop,
|
||||
drain ? do_drain : do_flush, 1, NULL, 0, impl);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -209,7 +209,7 @@ do_node_prepare(struct spa_loop *loop, bool async, uint32_t seq,
|
|||
|
||||
static void add_node_to_graph(struct pw_impl_node *node)
|
||||
{
|
||||
pw_loop_invoke(node->data_loop, do_node_prepare, 1, NULL, 0, true, node);
|
||||
pw_loop_locked(node->data_loop, do_node_prepare, 1, NULL, 0, node);
|
||||
}
|
||||
|
||||
/* called from the node data loop and undoes the changes done in do_node_prepare. */
|
||||
|
|
@ -248,7 +248,7 @@ do_node_unprepare(struct spa_loop *loop, bool async, uint32_t seq,
|
|||
|
||||
static void remove_node_from_graph(struct pw_impl_node *node)
|
||||
{
|
||||
pw_loop_invoke(node->data_loop, do_node_unprepare, 1, NULL, 0, true, node);
|
||||
pw_loop_locked(node->data_loop, do_node_unprepare, 1, NULL, 0, node);
|
||||
}
|
||||
|
||||
static void node_deactivate(struct pw_impl_node *this)
|
||||
|
|
@ -810,8 +810,8 @@ int pw_impl_node_set_io(struct pw_impl_node *this, uint32_t id, void *data, size
|
|||
if (data != NULL && size < sizeof(struct spa_io_position))
|
||||
return -EINVAL;
|
||||
pw_log_debug("%p: set position %p", this, data);
|
||||
pw_loop_invoke(this->data_loop,
|
||||
do_update_position, SPA_ID_INVALID, &data, sizeof(void*), true, this);
|
||||
pw_loop_locked(this->data_loop,
|
||||
do_update_position, SPA_ID_INVALID, &data, sizeof(void*), this);
|
||||
break;
|
||||
case SPA_IO_Clock:
|
||||
if (data != NULL && size < sizeof(struct spa_io_clock))
|
||||
|
|
@ -869,8 +869,8 @@ do_add_target(struct spa_loop *loop,
|
|||
SPA_EXPORT
|
||||
int pw_impl_node_add_target(struct pw_impl_node *node, struct pw_node_target *t)
|
||||
{
|
||||
pw_loop_invoke(node->data_loop,
|
||||
do_add_target, SPA_ID_INVALID, &node, sizeof(void *), true, t);
|
||||
pw_loop_locked(node->data_loop,
|
||||
do_add_target, SPA_ID_INVALID, &node, sizeof(void *), t);
|
||||
if (t->node)
|
||||
pw_impl_node_emit_peer_added(node, t->node);
|
||||
|
||||
|
|
@ -905,8 +905,8 @@ int pw_impl_node_remove_target(struct pw_impl_node *node, struct pw_node_target
|
|||
{
|
||||
/* we also update the target list for remote nodes so that the profiler
|
||||
* can inspect the nodes as well */
|
||||
pw_loop_invoke(node->data_loop,
|
||||
do_remove_target, SPA_ID_INVALID, &node, sizeof(void *), true, t);
|
||||
pw_loop_locked(node->data_loop,
|
||||
do_remove_target, SPA_ID_INVALID, &node, sizeof(void *), t);
|
||||
if (t->node)
|
||||
pw_impl_node_emit_peer_removed(node, t->node);
|
||||
|
||||
|
|
@ -2359,8 +2359,8 @@ void pw_impl_node_add_rt_listener(struct pw_impl_node *node,
|
|||
void *data)
|
||||
{
|
||||
struct listener_data d = { .listener = listener, .events = events, .data = data };
|
||||
pw_loop_invoke(node->data_loop,
|
||||
do_add_rt_listener, SPA_ID_INVALID, &d, sizeof(d), false, node);
|
||||
pw_loop_locked(node->data_loop,
|
||||
do_add_rt_listener, SPA_ID_INVALID, &d, sizeof(d), node);
|
||||
}
|
||||
|
||||
static int do_remove_listener(struct spa_loop *loop,
|
||||
|
|
@ -2375,8 +2375,8 @@ SPA_EXPORT
|
|||
void pw_impl_node_remove_rt_listener(struct pw_impl_node *node,
|
||||
struct spa_hook *listener)
|
||||
{
|
||||
pw_loop_invoke(node->data_loop,
|
||||
do_remove_listener, SPA_ID_INVALID, NULL, 0, true, listener);
|
||||
pw_loop_locked(node->data_loop,
|
||||
do_remove_listener, SPA_ID_INVALID, NULL, 0, listener);
|
||||
}
|
||||
|
||||
/** Destroy a node
|
||||
|
|
|
|||
|
|
@ -241,8 +241,8 @@ static int port_set_io(void *object,
|
|||
case SPA_IO_Buffers:
|
||||
case SPA_IO_AsyncBuffers:
|
||||
if (data == NULL || size == 0) {
|
||||
pw_loop_invoke(this->node->data_loop,
|
||||
do_remove_mix, SPA_ID_INVALID, NULL, 0, true, mix);
|
||||
pw_loop_locked(this->node->data_loop,
|
||||
do_remove_mix, SPA_ID_INVALID, NULL, 0, mix);
|
||||
mix->io_data = mix->io[0] = mix->io[1] = NULL;
|
||||
} else if (data != NULL && size >= sizeof(struct spa_io_buffers)) {
|
||||
if (size >= sizeof(struct spa_io_async_buffers)) {
|
||||
|
|
@ -253,8 +253,8 @@ static int port_set_io(void *object,
|
|||
} else {
|
||||
mix->io_data = mix->io[0] = mix->io[1] = data;
|
||||
}
|
||||
pw_loop_invoke(this->node->data_loop,
|
||||
do_add_mix, SPA_ID_INVALID, NULL, 0, false, mix);
|
||||
pw_loop_locked(this->node->data_loop,
|
||||
do_add_mix, SPA_ID_INVALID, NULL, 0, mix);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -1388,7 +1388,7 @@ static void pw_impl_port_remove(struct pw_impl_port *port)
|
|||
|
||||
pw_log_debug("%p: remove", port);
|
||||
|
||||
pw_loop_invoke(node->data_loop, do_remove_port, SPA_ID_INVALID, NULL, 0, true, port);
|
||||
pw_loop_locked(node->data_loop, do_remove_port, SPA_ID_INVALID, NULL, 0, port);
|
||||
|
||||
if (SPA_FLAG_IS_SET(port->flags, PW_IMPL_PORT_FLAG_TO_REMOVE)) {
|
||||
if ((res = spa_node_remove_port(node->node, port->direction, port->port_id)) < 0)
|
||||
|
|
@ -1817,7 +1817,7 @@ int pw_impl_port_set_param(struct pw_impl_port *port, uint32_t id, uint32_t flag
|
|||
pw_log_debug("%p: %d set param %d %p", port, port->state, id, param);
|
||||
|
||||
if (id == SPA_PARAM_Format) {
|
||||
pw_loop_invoke(node->data_loop, do_remove_port, SPA_ID_INVALID, NULL, 0, true, port);
|
||||
pw_loop_locked(node->data_loop, do_remove_port, SPA_ID_INVALID, NULL, 0, port);
|
||||
spa_node_port_set_io(node->node,
|
||||
port->direction, port->port_id,
|
||||
SPA_IO_Buffers, NULL, 0);
|
||||
|
|
@ -1903,7 +1903,7 @@ static int negotiate_mixer_buffers(struct pw_impl_port *port, uint32_t flags,
|
|||
port->direction, port->port_id,
|
||||
SPA_IO_Buffers, NULL, 0);
|
||||
|
||||
pw_loop_invoke(node->data_loop, do_remove_port, SPA_ID_INVALID, NULL, 0, true, port);
|
||||
pw_loop_locked(node->data_loop, do_remove_port, SPA_ID_INVALID, NULL, 0, port);
|
||||
|
||||
pw_buffers_clear(&port->mix_buffers);
|
||||
|
||||
|
|
@ -1943,7 +1943,7 @@ static int negotiate_mixer_buffers(struct pw_impl_port *port, uint32_t flags,
|
|||
pw_direction_reverse(port->direction), 0,
|
||||
SPA_IO_Buffers,
|
||||
&port->rt.io, sizeof(port->rt.io));
|
||||
pw_loop_invoke(node->data_loop, do_add_port, SPA_ID_INVALID, NULL, 0, false, port);
|
||||
pw_loop_locked(node->data_loop, do_add_port, SPA_ID_INVALID, NULL, 0, port);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,6 +64,12 @@ PW_API_LOOP_IMPL int pw_loop_invoke(struct pw_loop *object,
|
|||
{
|
||||
return spa_loop_invoke(object->loop, func, seq, data, size, block, user_data);
|
||||
}
|
||||
PW_API_LOOP_IMPL int pw_loop_locked(struct pw_loop *object,
|
||||
spa_invoke_func_t func, uint32_t seq, const void *data,
|
||||
size_t size, void *user_data)
|
||||
{
|
||||
return spa_loop_locked(object->loop, func, seq, data, size, user_data);
|
||||
}
|
||||
|
||||
PW_API_LOOP_IMPL int pw_loop_get_fd(struct pw_loop *object)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1748,7 +1748,7 @@ static void hook_removed(struct spa_hook *hook)
|
|||
{
|
||||
struct stream *impl = hook->priv;
|
||||
if (impl->data_loop)
|
||||
pw_loop_invoke(impl->data_loop, do_remove_callbacks, 1, NULL, 0, true, impl);
|
||||
pw_loop_locked(impl->data_loop, do_remove_callbacks, 1, NULL, 0, impl);
|
||||
else
|
||||
spa_zero(impl->rt_callbacks);
|
||||
hook->priv = NULL;
|
||||
|
|
@ -2590,8 +2590,8 @@ int pw_stream_flush(struct pw_stream *stream, bool drain)
|
|||
if (stream->node == NULL)
|
||||
return -EIO;
|
||||
|
||||
pw_loop_invoke(impl->data_loop,
|
||||
drain ? do_drain : do_flush, 1, NULL, 0, true, impl);
|
||||
pw_loop_locked(impl->data_loop,
|
||||
drain ? do_drain : do_flush, 1, NULL, 0, impl);
|
||||
|
||||
if (!drain)
|
||||
spa_node_send_command(stream->node->node,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue