defmodule Membrane.UtilitySupervisor do
@moduledoc """
A supervisor responsible for managing utility processes under the pipeline's
supervision tree.
The supervisor is spawned with each component and can be accessed from callback contexts.
`Membrane.UtilitySupervisor` does not restart processes. Rather, it ensures that these utility processes
terminate gracefully when the component that initiated them terminates.
If a process needs to be able to restart, spawn a dedicated supervisor under this supervisor.
## Example
def handle_setup(ctx, state) do
Membrane.UtilitySupervisor.start_link_child(
ctx.utility_supervisor,
{MySupervisor, children: [SomeWorker, OtherWorker], restart: :one_for_one})
end
"""
@typedoc """
The pid of the `Membrane.UtilitySupervisor` process.
"""
@type t :: pid()
@doc """
Starts a process under the utility supervisor.
Semantics of the `child_spec` argument are the same as in `Supervisor.child_spec/2`.
"""
@spec start_child(t, Supervisor.child_spec() | {module(), term()} | module()) ::
Supervisor.on_start_child()
defdelegate start_child(supervisor, child_spec),
to: Membrane.Core.SubprocessSupervisor,
as: :start_utility
@doc """
Starts a process under the utility supervisor and links it to the current process.
Semantics of the `child_spec` argument are the same as in `Supervisor.child_spec/2`.
"""
@spec start_link_child(t, Supervisor.child_spec() | {module(), term()} | module()) ::
Supervisor.on_start_child()
defdelegate start_link_child(supervisor, child_spec),
to: Membrane.Core.SubprocessSupervisor,
as: :start_link_utility
end